{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./dependencies/storefront-reference-architecture/node_modules/jquery/dist/jquery.js","webpack:///(webpack)/buildin/module.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/stockinstore.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/checkout/common/notifications.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/utils/tileImage.js","webpack:///./dependencies/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///./dependencies/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/components/recommendations.js","webpack:///./dependencies/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/quickView.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/wishlistHeart.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/productDetail.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/detail.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/storeExclusivity.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/quickViewDetail.js","webpack:///./dependencies/storefront-reference-architecture/node_modules/lodash/lodash.js","webpack:///(webpack)/buildin/global.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/checkout/shipping/inStore.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/checkout/common/geolocation.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/plugins/storelocator/jquery.storelocator.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/checkout/shipping/inStoreDrawer.js","webpack:///./dependencies/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./dependencies/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js","webpack:///./node_modules/slick-carousel/slick/slick.js","webpack:///./cartridges/app_custom_core/cartridge/client/default/js/product/attributes.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","global","factory","document","w","Error","window","this","noGlobal","arr","getProto","getPrototypeOf","slice","flat","array","concat","apply","push","indexOf","class2type","toString","hasOwn","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","rhtmlSuffix","jQuery","selector","context","fn","init","isArrayLike","length","nodeName","elem","toLowerCase","jquery","constructor","toArray","num","pushStack","elems","ret","merge","prevObject","each","callback","map","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","textContent","documentElement","nodeValue","makeArray","results","inArray","isXMLDoc","namespace","namespaceURI","docElem","ownerDocument","test","second","invert","matches","callbackExpect","arg","guid","iterator","split","_i","pop","whitespace","rtrimCSS","RegExp","contains","a","b","bup","compareDocumentPosition","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","attributes","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","unloadHandler","setDocument","inDisabledFieldset","addCombinator","disabled","dir","next","childNodes","e","els","find","seed","nid","match","groups","newSelector","newContext","exec","getElementById","id","getElementsByTagName","getElementsByClassName","testContext","scope","tokenize","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","el","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","top","addEventListener","getById","getElementsByName","disconnectedMatch","cssHas","querySelector","filter","attrId","getAttributeNode","tag","className","input","innerHTML","compare","sortDetached","expr","elements","matchesSelector","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","start","parent","useCache","diff","firstChild","lastChild","pseudo","args","setFilters","idx","matched","not","matcher","compile","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","err","safeActiveElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","nextSibling","header","button","_matchIndexes","lt","gt","nth","radio","checkbox","file","password","image","submit","reset","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","token","compiled","filters","unique","getText","isXML","selectors","until","truncate","is","siblings","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","cur","targets","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","_","flag","createOptions","firing","memory","fired","locked","list","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","handler","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","rejectWith","getErrorHook","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","console","warn","message","stack","readyException","readyList","completed","removeEventListener","catch","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","getData","removeData","_data","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","unshift","stop","setter","clearQueue","tmp","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","defaultValue","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","on","types","one","origFn","event","off","leverageNative","isSetup","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","isImmediatePropagationStopped","handleObjIn","eventHandle","events","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","Date","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","marginDelta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","_jQuery","_$","$","noConflict","webpackPolyfill","deprecate","paths","getStockInStore","storeId","productId","$stockInStoreBlock","urlId","spinner","renderedTemplate","attributesLogic","stockInStoreHelper","getQuantitySelector","$el","quantitySelected","quantitySelectedModal","quantitySelectedPDP","getQuantitySelected","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","$html","parsedHtml","footer","enterDialogMessage","closeButtonText","modal","getOptions","$productContainer","$elOption","urlValue","selectedValueId","optionId","stringify","handleVariantResponse","isVaraint","paramID","newValue","urlObj","isChoiceOfBonusProducts","product","variationAttributes","msgs","attrsWithSwatches","forEach","attrValue","$attrValue","assistiveSelectedText","selectable","processSwatchValues","$attr","$defaultOption","$selectedBisEnabledAttribute","resetUrl","available","$attributesArea","processNonSwatchValues","updateAttrs","resources","productType","readyToOrder","imgs","carousel","carouselId","alt","title","createCarousel","images","large","price","hasStandardDiscount","standard","sales","hasClubDiscount","club","promotionsHtml","availabilityValue","availabilityMessages","availability","messages","info_selectforstock","updateAvailability","attributeGroup","attribute","label","getAttributesHtml","refLabel","$eReservationIframe","urlIframe","newUrl","URL","URLSearchParams","search","attributeSelect","selectedValueUrl","optionsHtml","updateOptions","quantities","quantity","updateQuantities","toggleOverlay","disable_addToCart","initEvents","$body","$carousel","$productVideo","videoInfo","videoIndex","$videoEl","slick","Additional","$anchor","$img","class","productName","modalURL","slidesToShow","slidesToScroll","dots","focusOnSelect","infinite","arrows","responsive","breakpoint","reloadCarousel","$fpePopinLink","EAN","updateSelectableVariationAttributes","addToCart","pid","pidsObj","setPids","qty","childProducts","productGtm","form","is_error","newBonusDiscountLineItem","$tabContent","handlePostCartAdd","reportingURL","resultPli","cart","items","UUID","smallImageUrl","small","smallImageAlt","colorText","displayName","displayValue","sizeText","selectAttribute","createErrorNotification","errorHtml","initHoverImageContainer","$hoverContainer","element","dataset","endsWith","hoverImage","include","focusHelper","getPidValue","$swatchButton","parseHtml","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","messageType","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","enableBonusProductSelection","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","errorMessage","msgSuccess","reload","tileImage","updateProgressBar","$parent","nextSlide","slideCount","calc","$progressBar","$progressBarLabel","getSliderOptions","initProductRecommendationSlick","sliderOptions","currentSlide","baseOptions","popupSliderOptions","obfuscationEinstein","encodedUrl","imageReplaceURL","decodeURIComponent","atob","initRecommandationLogic","fillModalElement","quickViewFullDetailMsg","productUrl","showQuickview","focusQuickview","trapQuickviewFocus","nextToLastElementSelector","showSpinner","hideDialog","beforeUpdateAttribute","updateAttribute","selectedProductUrl","updateAddToCart","dialog","allAvailable","every","allReady","displayMessageAndChangeIcon","icon","toggleWishlist","$this","routeType","removeFromWishlistUrl","optionVal","notAddedToWishlist","removeFromWishlist","processInclude","recommendationsLogic","isAttributeSelected","attributeName","attrDataAttrID","attributeValues","some","child","classList","$aligncolorSwatch","$alignsizeSwatch","closeEReservationPopin","initProductDetailLogic","toggleAttribute","selectAttributeValue","SIZE","$target","attributeID","buttonAddToCart","appData","ADD_TO_CART","CHOOSE_SIZE","CHOOSE_COLOR","updateAddToCartButton","showMoreUrl","showProductDetailImageModal","app","isMobile","getModalHtmlElement","$addToCartButton","disableButton","enable","updateAddToCartEnableDisableOtherElements","handleReviewStars","collapse","scrollIntoView","behavior","initDetailImageModal","$modal","initialSlide","EReservationModal","$eReservation","attachEvent","$modalEl","$quickViewModal","initQuickViewLogic","$section","FUNC_ERROR_TEXT","PLACEHOLDER","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","reOptMod","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","freeParseInt","freeGlobal","freeSelf","Function","freeExports","freeModule","moduleExports","freeProcess","nodeUtil","require","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","thisArg","arrayAggregator","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","baseTimes","baseTrim","trimmedEndIndex","baseUnary","baseValues","cacheHas","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","mapToArray","size","overArg","transform","replaceHolders","setToArray","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","unicodeToArray","asciiToArray","charAt","unescapeHtmlChar","runInContext","defaults","pick","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Uint8Array","allocUnsafe","getPrototype","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","symToStringTag","getNative","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeCeil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","min","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","isObject","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","number","lower","upper","baseClone","bitmask","customizer","isDeep","isFlat","isFull","initCloneArray","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","baseDifference","includes","isCommon","valuesLength","outer","valuesIndex","templateSettings","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","path","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","isTyped","isArrayLikeObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","baseSortBy","objCriteria","criteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","MAX_ARRAY_LENGTH","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","trailing","createCompounder","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","newHolders","createRecurry","reorder","createInverter","toIteratee","baseInverter","createMathOperation","createOver","arrayFunc","createPadding","chars","charsLength","createRange","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","toInteger","pair","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrLength","arrStacked","arrValue","flatten","otherFunc","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","ctorString","isMaskable","stubFalse","otherArgs","oldArray","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","lastCalled","stamp","rand","memoize","memoizeCapped","quote","subString","difference","differenceBy","differenceWith","findIndex","findLastIndex","intersection","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","cancel","flush","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gte","isError","isInteger","isNumber","isString","lte","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invertBy","invoke","omit","CLONE_DEEP_FLAG","basePick","pickBy","toPairs","toPairsIn","word","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","minuend","subtrahend","castArray","chunk","compact","cond","conforms","baseConforms","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","mapKeys","mapValues","matchesProperty","nthArg","omitBy","orderBy","propertyOf","pullAllBy","pullAllWith","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","zipObject","zipObjectDeep","entriesIn","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","escapeRegExp","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","pad","strLength","padEnd","padStart","radix","floating","reduce","reduceRight","repeat","sample","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trimEnd","trimStart","omission","substring","newEnd","unescape","uniqueId","eachRight","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","isRight","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","g","notificationHelpers","geolocationHelper","getCustomerCoordinatesFromAddress","$customerAddress","customerInformations","address","defaultLatitude","defaultLongitude","$storeButton","res","latitude","longitude","fullAddress","address1","postalCode","city","geocoder","google","maps","Geocoder","geocode","GeocoderStatus","OK","geoLocation","coordinates","lat","lng","isNavigationGeolocEnabled","getKmlFileData","placemark","storeID","addressOne","addressTwo","zipCode","openingHours","countryCode","availableChildcare","availableMaternity","availableShoe","availableTextile","availableToy","kmlCoordinates","Number","availabilities","filterNearestStore","stores","curr","distance","displayNearestStore","nearestStoreTemplate","displaySelectedStore","primaryAddress","secondaryAddress","storeData","$inStores","currentStoreId","currentProductId","storesIcons","$openingHours","formatOpeningHours","groupByHours","openingHoursTemplate","openingHoursFormatted","hour","days","h","day","selectAndFormatAllNearestStores","displayFormattedDistance","$li","store","$mapWindowParent","showOpeningHours","displayInfoWindowContent","$infoWindow","opening","$opening","parsedOpeningHours","distanceInteger","roundDistance","lengthUnit","encodedHtmlOpeningHours","storeHoursStr","$storeHoursStr","formattedOpeningHours","storeHoursArray","workingDaysWithHours","loadNearestStoreLocator","$submitShippingBtn","getGeolocation","coords","storeLocator","slideMap","defaultLoc","shouldReset","dataLocation","defaultLat","defaultLng","KMLinfowindowTemplate","KMLlistTemplate","locationList","mapID","ctaButton","processKmlLocationDataCallback","filterLocationsCallback","afterSuccessCallback","callbackNotify","finally","loadAllNearestStores","templates","storeListsTemplate","infoWindowTemplate","maxDistance","disableNativeListClick","findMylocationBtn","isNavigationGeolocationEnabled","markerImg","markerDim","maxDistanceID","addressID","formContainer","formID","onInfoWindowLoadCallback","currentPosition","isPWA","matchMedia","navigator","standalone","geolocationFallBack","geolocation","getCurrentPosition","geometry","enableHighAccuracy","maximumAge","pluginName","listTemplate","infowindowTemplate","dataTypeRead","originalOrigin","originalData","originalZoom","dataRequest","searchInput","addressInput","olat","olng","storeNum","directionsDisplay","directionsService","prevSelectedMarkerBefore","prevSelectedMarkerAfter","firstRun","featuredset","locationset","normalset","markers","locationData","GeoCodeCalc","mappingObj","ajaxData","altDistanceNoResult","autoComplete","autoCompleteDisableListener","autoCompleteOptions","autoGeocode","bounceMarker","catMarkers","dataRaw","debug","disableAlphaMarkers","distanceAlert","dragSearch","exclusiveFiltering","exclusiveTax","featuredDistance","featuredLocations","fullMapStart","fullMapStartBlank","fullMapStartListLimit","infoBubble","inlineDirections","listColor1","listColor2","loading","locationsPerPage","mapSettings","mapTypeId","MapTypeId","ROADMAP","markerCluster","nameAttribute","nameSearch","noForm","openNearest","originMarker","originMarkerDim","originMarkerImg","pagination","querystringParams","selectedMarkerImg","selectedMarkerImgDim","sessionStorage","storeLimit","taxonomyFilters","visibleMarkersList","xmlElement","closeIcon","geocodeID","lengthSwapID","loadingContainer","modalContent","modalWindow","orderID","overlay","regionID","searchID","sortID","taxonomyFiltersContainer","infowindowTemplatePath","listTemplatePath","listTemplateID","infowindowTemplateID","callbackAutoGeoSuccess","callbackBeforeSend","callbackCloseDirections","callbackCreateMarker","callbackDirectionsRequest","callbackFilters","callbackFormVals","callbackGeocodeRestrictions","callbackJsonp","callbackListClick","callbackMapSet","callbackMarkerClick","callbackModalClose","callbackModalOpen","callbackModalReady","callbackNearestLoc","callbackNoResults","callbackOrder","callbackPageChange","callbackRegion","callbackSorting","callbackSuccess","addressErrorAlert","autoGeocodeErrorAlert","distanceErrorAlert","kilometerLang","kilometersLang","mileLang","milesLang","noResultsTitle","noResultsDesc","nextPage","prevPage","Plugin","_this","writeDebug","EarthRadius","Handlebars","registerHelper","taxonomyFiltering","sorting","autoPlaces","places","Autocomplete","addListener","processForm","_loadTemplates","destroy","$mapDiv","removeListener","$adp","formFiltersReset","$inputs","$selects","mapReload","taxonomyFiltersInit","mapping","notifyText","alert","geoCodeCalcToRadian","geoCodeCalcDiffRadian","v1","v2","geoCodeCalcCalcDistance","lat1","lng1","lat2","lng2","radius","asin","sqrt","pow","sin","getQueryString","getMap","templateError","locator","_start","_formEventHandler","$findMylocationBtn","findMyLocation","_getData","geocodeData","northEast","southWest","formattedAddress","bounds","formatted_address","getNorthEast","getSouthWest","origLat","origLng","origAddress","boundsNorthEast","boundsSouthWest","latlng","doAutoGeo","myOptions","LatLng","center","addDomListener","getCenter","setCenter","defaultLocation","htmlGeocode","getItem","autoGeocodeQuery","accuracy","setItem","_autoGeocodeError","googleGeocode","thisObj","request","callbackFunction","geocodeResult","fullResult","reverseGoogleGeocode","locResult","roundNumber","dec","hasEmptyObjectVals","objTest","modalClose","_createLocationVariables","loopcount","sortAlpha","locationsarray","localeCompare","sortDate","getTime","sortNumerically","sortCustom","filterMatching","inclusive","applyFilters","filterData","filterTest","k","testResults","_paginationOutput","currentPage","totalPages","output","paginationSetup","pagesOutput","$paginationList","markerImage","markerUrl","markerWidth","markerHeight","Size","scaledSize","createMarker","point","category","marker","letterMarkerImg","categories","Marker","draggable","_defineLocationData","currentMarker","storeStart","page","altDistLength","distLength","indicator","markerId","markerid","altlength","origin","listSetup","locations","listHtml","changeSelectedMarker","setIcon","createInfowindow","infowindow","setContent","$selectedLocation","$container","originAddress","$distanceInput","latLng","paginationChange","newPage","getAddressByMarker","markerID","address2","postal","country","clearMarkers","locationsLimit","setMap","directionsRequest","locID","destination","DirectionsRenderer","DirectionsService","setPanel","travelMode","TravelMode","DRIVING","route","DirectionsStatus","setDirections","closeDirections","countFilters","lengthUnitSwap","$lengthSwap","geocodeRestrictions","$addressInput","$searchInput","region","componentRestrictions","locationsSetup","altdistance","$sortSelect","sortMethod","sortVal","$orderSelect","filterCount","_existingCheckedFilters","filterVal","_existingSelectedFilters","_existingRadioFilters","checkFilters","selectQueryStringFilters","taxonomy","$taxGroupContainer","checkQueryStringFilters","getFilterKey","filterContainer","filterKey","filterIndex","checkVisibleMarkers","x","getBounds","getPosition","newCenterCoords","newCenter","getZoom","newAddress","emptyResult","noResults","locList","setZoom","originPoint","originImg","openNearestLocation","nearestLoc","selectedMarker","listClick","panTo","setAnimation","BOUNCE","resultsTotalCount","locCount","$resultsContainer","addListenerOnce","featuredDistanceRestriction","featuredRestrictions","mappingObject","orig_lat","orig_lng","storeNumToShow","distError","openMap","taxFilters","distUnit","description","z","_locationSet","featured","LatLngBounds","nextPoint","InfoBubble","infoBubbleSettings","InfoWindow","y","fitBounds","MarkerClusterer","log","returns","instance","_defaults","_name","inStore","fillOutDrawerElements","drawer","initStoreLocator","responseJSON","firstFocusableEl","lastFocusableEl","linkElements","enableOrDisable","updateAttributesAndDetails","attributesHtml","shortDescription","longDescription","sizeChart","$prodSizeChart","$sizeChart","copyProductLink","$temp","execCommand","Slick","instanceUid","dataSettings","accessibility","adaptiveHeight","appendArrows","appendDots","asNavFor","prevArrow","nextArrow","autoplay","autoplaySpeed","centerMode","centerPadding","cssEase","customPaging","slider","dotsClass","edgeFriction","fade","focusOnChange","lazyLoad","mobileFirst","pauseOnHover","pauseOnFocus","pauseOnDotsHover","respondTo","rows","rtl","slide","slidesPerRow","swipe","swipeToSlide","touchMove","touchThreshold","useCSS","useTransform","variableWidth","vertical","verticalSwiping","waitForAnimate","initials","animating","dragging","autoPlayTimer","currentDirection","currentLeft","direction","$dots","listWidth","listHeight","loadIndex","$nextArrow","$prevArrow","scrolling","slideWidth","$slideTrack","$slides","sliding","slideOffset","swipeLeft","swiping","$list","touchObject","transformsEnabled","unslicked","activeBreakpoint","animType","animProp","breakpoints","breakpointSettings","cssTransitions","focussed","interrupted","paused","positionProp","rowCount","shouldClick","$slider","$slidesCache","transformType","transitionType","visibilityChange","windowWidth","windowTimer","mozHidden","webkitHidden","autoPlay","autoPlayClear","autoPlayIterator","changeSlide","clickHandler","selectHandler","setPosition","swipeHandler","dragHandler","keyHandler","htmlExpr","registerBreakpoints","activateADA","addSlide","slickAdd","markup","addBefore","unload","reinit","animateHeight","targetHeight","outerHeight","animateSlide","targetLeft","animProps","animStart","applyTransition","disableTransition","getNavTarget","slideHandler","transition","setInterval","clearInterval","slideTo","buildArrows","buildDots","dot","getDotCount","buildOut","setupInfinite","updateDots","setSlideClasses","buildRows","newSlides","numOfSlides","originalSlides","slidesPerSection","row","checkResponsive","forceUpdate","targetBreakpoint","respondToWidth","triggerBreakpoint","sliderWidth","innerWidth","unslick","refresh","dontAnimate","indexOffset","checkNavigable","navigables","prevNavigable","getNavigableIndexes","cleanUpEvents","interrupt","cleanUpSlideEvents","orientationChange","resize","cleanUpRows","fadeSlide","slideIndex","fadeSlideOut","filterSlides","slickFilter","focusHandler","$sf","getCurrent","slickCurrentSlide","breakPoint","counter","pagerQty","getLeft","verticalHeight","targetSlide","coef","verticalOffset","offsetLeft","outerWidth","getOption","slickGetOption","getSlick","getSlideCount","swipedSlide","centerOffset","abs","goTo","slickGoTo","creation","setProps","startLoad","loadSlider","initializeEvents","updateArrows","initADA","numDotGroups","tabControlIndexes","slideControlIndex","ariaButtonControl","mappedSlideIndex","initArrowEvents","initDotEvents","initSlideEvents","initUI","tagName","loadRange","rangeStart","rangeEnd","loadImages","imagesScope","imageSource","imageSrcSet","imageSizes","imageToLoad","prevSlide","progressiveLazyLoad","slickNext","pause","slickPause","play","slickPlay","postSlide","slickPrev","tryCount","$imgsToLoad","initializing","lastVisibleIndex","currentBreakpoint","responsiveSettings","windowDelay","removeSlide","slickRemove","removeBefore","removeAll","setCSS","positionProps","setDimensions","setFade","setHeight","setOption","slickSetOption","bodyStyle","WebkitTransition","MozTransition","msTransition","OTransform","perspectiveProperty","webkitPerspective","MozTransform","MozPerspective","webkitTransform","msTransform","allSlides","evenCoef","infiniteCount","targetElement","sync","animSlide","oldSlide","slideLeft","navTarget","swipeDirection","xDist","yDist","swipeAngle","startX","curX","startY","curY","atan2","swipeEnd","swipeLength","edgeHit","minSwipe","fingerCount","swipeStart","swipeMove","positionOffset","verticalSwipeLength","unfilterSlides","slickUnfilter","fromBreakpoint","showAction","nextValue","$variationAttributes","selectorToHide","$elmts","isCompatibleShippingMethod","$rootContainer","attrDataAttrValue","attrDataAttrURL","attrDataColorSuffix","attributeValue","attributeColorSuffix","attributeDisplayValue","attributeURL","$attributesElmnts","$toggleContainer","$selectedColor","$updateColorTab","selectedSizeHtml","valueAssociated"],"mappings":"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","file":"default/js/productDetail.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 343);\n","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" +\n\t\t\t\"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" +\n\t\t\t\"<option selected=''></option></select>\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this\n\t\t\t.on( \"mouseenter\", fnOver )\n\t\t\t.on( \"mouseleave\", fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","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","'use strict';\n\n/**\n * Method to refresh stock in stock\n * @param {string} storeId the store id\n * @param {string} productId the product id\n * @param {string} url url\n */\nfunction getStockInStore(storeId, productId, url) {\n var $stockInStoreBlock = $('.js-stock-in-stock-block');\n var urlId = (url && url.length > 0 ? url : $stockInStoreBlock.data('service-url')) + '?storeId=' + storeId + '&productId=' + encodeURIComponent(productId);\n\n $('#currentStoreId').val(storeId);\n $('#currentProductId').val(productId);\n\n $.spinner().start();\n $.ajax({\n url: urlId,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n if (data.error == null && data.renderedTemplate && data.renderedTemplate.length > 0) {\n $stockInStoreBlock.html(data.renderedTemplate);\n $('body').trigger('storedrawer:reinit');\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\nmodule.exports = {\n getStockInStore: getStockInStore\n};\n","'use strict';\n\nconst base = require('base:product/base');\nconst attributesLogic = require('./attributes');\nvar stockInStoreHelper = require('../stockinstore');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = '<!-- Modal -->'\n + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n + 'data-UUID=\"' + data.uuid + '\"'\n + 'data-pliUUID=\"' + data.pliUUID + '\"'\n + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n + 'data-pageStart=\"0\"'\n + 'data-pageSize=\"' + data.pageSize + '\"'\n + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <span class=\"\">' + data.labels.selectprods + '</span>'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span aria-hidden=\"true\">×</span>'\n + ' <span class=\"sr-only\"> </span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '<div class=\"modal-footer\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n* Handles post cart add response\n* @param {Object} response - response from post cart add\n*/\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else if ($('.wishlist-header').length === 0) {\n if ($('.quick-view-add-to-cart-messages').length === 0) {\n var $tabContent = $('.tab-content');\n if ($tabContent.length !== 0) {\n $tabContent.append('<div class=\"quick-view-add-to-cart-messages\"></div>');\n } else if ($('.product-wrapper').length !== 0) {\n $('.product-wrapper').append('<div class=\"quick-view-add-to-cart-messages\"></div>');\n }\n }\n if ($('.quick-view-add-to-basket-alert').length === 0) {\n $('.quick-view-add-to-cart-messages').append(\n '<div class=\"quick-view-add-to-basket-alert text-center\" role=\"alert\">'\n + response.message\n + '</div>'\n );\n }\n\n setTimeout(function () {\n $('.quick-view-add-to-cart-messages').remove();\n }, 3000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\n$('body').on('product:handle-error', function (evt, data) {\n if (data.disable_addToCart) {\n $('button.add-to-cart').attr('disabled', 'disabled');\n $('button.add-to-cart-global').attr('disabled', 'disabled');\n $('.alert-incompatible-shipping-methods').removeClass('d-none').show();\n $('.alert-incompatible-shipping-methods-holder').append('<div class=\"alert-incompatible-shipping-methods\"></div>');\n $('.alert-incompatible-shipping-methods').html($('#incompatible-shipping-methods-message-holder').html());\n }\n});\n\n/**\n* Initializes events for product detail page\n*/\nfunction initEvents() {\n $(function () {\n const $body = $('body');\n $body.on('product:afterAttributeSelect', function (e, response) {\n $body.find('.product-detail').attr('data-pid', response.data.product.id);\n $body.find('#editWishlistProductModal .product-quickview').attr('data-pid', response.data.product.id);\n reloadCarousel(response);\n\n var $fpePopinLink = $body.find('.fpe-popin-link');\n if ($fpePopinLink.length) {\n $fpePopinLink.attr('data-ean', response.data.product.EAN);\n }\n });\n $('body').on('product:updateSelectableAttribute', function (e, response) {\n attributesLogic.updateSelectableVariationAttributes(response.data.product, response.container);\n });\n });\n}\n\n/**\n* Reloads the carousel with the product images from the response\n* @param {Object} response - the response object from the AJAX call\n*/\nfunction reloadCarousel(response) {\n const $carousel = $('.detail-slider-nav');\n\n // cache existing video if there is any\n let $productVideo = $carousel.find('.product-video');\n\n let videoInfo = {\n videoIndex: 1\n };\n\n if ($productVideo.length) {\n videoInfo.$videoEl = $productVideo.closest('span').clone();\n videoInfo.videoIndex = $productVideo.closest('.slick-slide').data('slick-index');\n }\n\n // delete carousel\n $carousel.each((i, el)=> {\n let $el = $(el);\n if ($el.is('.slick-initialized')) {\n $el.slick('unslick');\n }\n });\n\n // remove children\n $carousel.empty();\n\n // populate children\n const product = response.data.product;\n const images = product.images.Additional;\n for (let i = 0; i < images.length; i++) {\n let image = images[i];\n let $anchor = $('<span>');\n let $img = $('<img>');\n $img.attr({\n class: 'detail-image lazyload',\n src: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n 'data-src': image.url,\n alt: image.alt || product.productName,\n title: image.title || product.productName\n });\n $anchor.attr({\n class: 'product-detail-image-modal ajax-cbo',\n 'data-cbo': product.modalURL\n });\n\n if (videoInfo.$videoEl && videoInfo.videoIndex === i) {\n $carousel.append(videoInfo.$videoEl);\n }\n\n $anchor.append($img);\n $carousel.append($anchor);\n }\n // create carousel\n const options = {\n slidesToShow: 1,\n slidesToScroll: 1,\n dots: true,\n focusOnSelect: true,\n infinite: false,\n arrows: true,\n responsive: [\n {\n breakpoint: 544,\n settings: {\n arrows: false\n }\n }\n ]\n };\n $carousel.slick(options);\n}\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '<option value=\"' + quantity.value + '\" data-url=\"' + quantity.url + '\"'\n + selected + '>' + quantity.value + '</option>';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"'\n + attrValue.value + '\"]');\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $attrValue.attr('data-url', attrValue.url);\n $attrValue.attr('value', attrValue.url);\n } else {\n $attrValue.removeAttr('data-url');\n $attrValue.removeAttr('value');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n let $attr = '[data-attr=\"' + attr.id + '\"]';\n let $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n let $selectedBisEnabledAttribute = null;\n\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n let $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n\n // scope out selected attribute if back in stock icon is needed on quickview tab\n if (attrValue.selected && !attrValue.available) {\n $selectedBisEnabledAttribute = $attrValue;\n }\n\n // handle bis icon\n $attrValue.closest('.circle-attribute').find('.attr-bis-icon').toggleClass('d-none', !(attrValue.selectable && !attrValue.available));\n });\n\n // handle bis icon on quickview tabs\n let $attributesArea = $productContainer.find('.attributes-area div[data-attr=\"orc_size\"]');\n\n if ($productContainer.hasClass('product-quickview') && $selectedBisEnabledAttribute && $selectedBisEnabledAttribute.length) {\n $attributesArea.find('.attr-bis-icon').toggleClass('d-none', false);\n } else {\n $attributesArea.find('.attr-bis-icon').toggleClass('d-none', true);\n }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['orc_color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n for (var i = 0; i < imgs.length; i++) {\n $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '<li><div>' + message + '</div></li>';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '<div class=\"attribute-values\">' + attribute.label + ': '\n + attribute.value + '</div>';\n });\n }\n });\n\n return html;\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n let price = response.product.price;\n let hasStandardDiscount = price.standard && price.standard.sales && price.standard.sales.value;\n let hasClubDiscount = price.club && price.club.sales && price.club.sales.value;\n if (hasStandardDiscount || hasClubDiscount) {\n $('.product-badge.discount-label').removeClass('d-none');\n } else {\n $('.product-badge.discount-label').addClass('d-none');\n }\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart:visible, button.add-to-cart-global:visible, button.update-cart-product-global:visible, button.button-cart-mailmeback:visible').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n // Update ref label\n $productContainer.find('.reference').empty()\n .html(response.product.refLabel);\n\n // update e-reservation iframe with new product id\n if ($('#eReservation').length) {\n var $eReservationIframe = $('#eReservation iframe');\n var urlIframe = $eReservationIframe.attr('src');\n var newUrl = updateIFrameSourceUrl(urlIframe, 'productID', response.product.id);\n\n // Set the new URL to the iframe\n $eReservationIframe.attr('src', newUrl);\n }\n}\n\n/**\n* Updates the value of a specified query parameter in a given URL and returns the updated URL as a string.\n*\n* @param {string} url - The original URL to be updated.\n* @param {string} paramID - The name of the query parameter to update.\n* @param {string} newValue - The new value to set for the specified query parameter.\n* @returns {string} The updated URL with the modified query parameter.\n*/\nfunction updateIFrameSourceUrl(url, paramID, newValue) {\n var urlObj = new URL(url);\n var params = new URLSearchParams(urlObj.search);\n\n // Update the parameter\n params.set(paramID, newValue);\n\n // Construct the new URL\n urlObj.search = params.toString();\n return urlObj.toString();\n}\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n // Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n* Handles the selection of an attribute\n* @param {Object} currentTarget - the selected attribute element\n* @param {Object} $productContainer - the product container element\n*/\nfunction attributeSelect(currentTarget, $productContainer) {\n const selectedValueUrl = currentTarget.value;\n const className = currentTarget.className;\n\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n\n if (className.indexOf('select-orc_color') > -1) {\n $('body').trigger('product:updateSelectableAttribute',\n { data: data, container: $('.attribute-values[data-attr=\"orc_size\"]') });\n } if (className.indexOf('select-orc_size') > -1) {\n $('body').trigger('product:updateSelectableAttribute',\n { data: data, container: $('.attribute-values[data-attr=\"orc_color\"]') });\n }\n\n // Update stock in store if currentStoreId is available\n if ($('#currentStoreId').length && typeof $('#currentStoreId').val() !== 'undefined') {\n stockInStoreHelper.getStockInStore($('#currentStoreId').val(), data.product.id);\n }\n\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Toggles the overlay by adding or removing necessary classes from the elements.\n * @param {boolean} show - If true, it adds the classes; if false, it removes them.\n */\nfunction toggleOverlay(show) {\n $('.added-to-cart-popup').toggleClass('show', show);\n $('body').toggleClass('overlay-active', show);\n $('.modal-background').toggleClass('active', show);\n}\n\n/**\n * Initializes the added to cart modal by toggling the overlay and setting up the close button click event.\n */\nfunction initAddedToCartModal() {\n toggleOverlay(true);\n\n $('.added-to-cart-popup__close').click(function () {\n toggleOverlay(false);\n });\n}\n\nmodule.exports = {\n ...base,\n initEvents: initEvents(),\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var productGtm = $('#quickViewModal').data('productGtm') || $('.product-detail').data('productGtm');\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this)) || 1,\n productGtm: JSON.stringify(productGtm)\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n if (data.is_error || data.error) {\n $('body').trigger('product:handle-error', data);\n } else {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n\n miniCartReportingUrl(data.reportingURL);\n initAddedToCartModal();\n\n const resultPli = data.cart.items.find(item => item.UUID === data.pliUUID);\n\n if (resultPli) {\n const { images, variationAttributes, productName } = resultPli;\n const smallImageUrl = images.small[0].url;\n const smallImageAlt = images.small[0].alt;\n\n $('.added-to-cart-popup__product-detail .js-product-image')\n .attr({ src: smallImageUrl, alt: smallImageAlt });\n $('.added-to-cart-popup__product-detail .js-product-name').empty().append(productName);\n\n if (variationAttributes[0]) {\n const colorText = `${variationAttributes[0].displayName} : ${variationAttributes[0].displayValue}`;\n $('.added-to-cart-popup__product-detail .js-product-color').empty().append(colorText);\n }\n\n if (variationAttributes[1]) {\n const sizeText = `${variationAttributes[1].displayName} : ${variationAttributes[1].displayValue}`;\n $('.added-to-cart-popup__product-detail .js-product-size').empty().append(sizeText);\n }\n }\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget, $productContainer);\n });\n }\n};\n","'use strict';\n\n/**\n * Create an alert to display the error message\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n var errorHtml = '<div class=\"alert alert-danger alert-dismissible valid-cart-error '\n + 'fade show\" role=\"alert\">'\n + '<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">'\n + '<span aria-hidden=\"true\">×</span>'\n + '</button>' + message + '</div>';\n\n $('.error-messaging').append(errorHtml);\n}\n\nmodule.exports = { createErrorNotification: createErrorNotification };\n","'use strict';\n\n/**\n * Init hover image different of th original image too prevent double load of an image\n * @param {DOMElement} $hoverContainer hover container\n */\nfunction initHoverImageContainer($hoverContainer) {\n Array.prototype.forEach.call($hoverContainer.find('.tile-hover-image'), element => {\n if (element.dataset.src.endsWith('1_X.jpg')) {\n element.remove();\n }\n });\n Array.prototype.forEach.call($hoverContainer.find('.images-hover'), element => {\n if (element.children.length === 3) {\n element.children[0].className += ' let-hover';\n }\n });\n}\n\n// Hover Image\n/**\n * Search to see for each element if there is an hover image different of th original image too prevent double load of an image\n */\nfunction hoverImage() {\n $(window).ready(function () {\n let $hoverContainer = $('.image-container');\n initHoverImageContainer($hoverContainer);\n });\n}\n\nmodule.exports = {\n hoverImage: hoverImage,\n initHoverImageContainer: initHoverImageContainer\n};\n","'use strict';\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '<li><div>' + message + '</div></li>';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '<div class=\"attribute-values\">' + attribute.label + ': '\n + attribute.value + '</div>';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n for (var i = 0; i < imgs.length; i++) {\n $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '<option value=\"' + quantity.value + '\" data-url=\"' + quantity.url + '\"' +\n selected + '>' + quantity.value + '</option>';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = '<!-- Modal -->'\n + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n + 'data-UUID=\"' + data.uuid + '\"'\n + 'data-pliUUID=\"' + data.pliUUID + '\"'\n + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n + 'data-pageStart=\"0\"'\n + 'data-pageSize=\"' + data.pageSize + '\"'\n + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <span class=\"\">' + data.labels.selectprods + '</span>'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span aria-hidden=\"true\">×</span>'\n + ' <span class=\"sr-only\"> </span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '<div class=\"modal-footer\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '<div class=\"add-to-cart-messages\"></div>'\n );\n }\n\n $('.add-to-cart-messages').append(\n '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n + response.message\n + '</div>'\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '<div class=\"selected-pid row\" '\n + 'data-pid=\"' + pid + '\"'\n + 'data-qty=\"' + submittedQty + '\"'\n + 'data-optionID=\"' + (optionID || '') + '\"'\n + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n + '>'\n + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n + $choiceOfBonusProduct.find('.product-name').html()\n + '</div>'\n + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n + '</div>'\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('<div class=\"add-to-cart-messages\"></div>');\n }\n $('.add-to-cart-messages').append(\n '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n + ' role=\"alert\">'\n + data.errorMessage + '</div>'\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('<div class=\"add-to-cart-messages\"></div>');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n + ' role=\"alert\">'\n + data.msgSuccess + '</div>'\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\n\nconst tileImage = require('../utils/tileImage');\n\n/**\n* Updates the progress bar for a slider\n* @param {jQuery} $parent - The parent element containing the progress bar and label\n* @param {number} nextSlide - The index of the next slide\n* @param {number} slideCount - The total number of slides\n* @param {number} slidesToShow - The number of slides to be displayed at a time\n* @returns {void}\n*/\nfunction updateProgressBar($parent, nextSlide, slideCount, slidesToShow) {\n let calc;\n let $progressBar = $parent.find('.progress');\n let $progressBarLabel = $parent.find('.slider__label');\n\n if (nextSlide === 0) {\n calc = 0;\n } else {\n calc = ((nextSlide + 1) / (slideCount - slidesToShow + 1)) * 100;\n }\n\n $progressBar.css('background-size', calc + '% 100%').attr('aria-valuenow', calc);\n $progressBarLabel.text(calc + '% completed');\n}\n\n/**\n* Returns the options for the slider component\n* @returns {Object} options for the slider\n*/\nfunction getSliderOptions() {\n return {\n slidesToShow: 4,\n slidesToScroll: 2,\n dots: false,\n focusOnSelect: false,\n arrows: true,\n infinite: false,\n responsive: [\n {\n breakpoint: 544,\n settings: {\n slidesToShow: 1.5,\n arrows: true,\n slidesToScroll: 1\n }\n }\n ]\n };\n}\n\n/**\n * Init product recommendation slick\n */\nfunction initProductRecommendationSlick() {\n $(document).ready(function () {\n let $slider = $('.slick-slider');\n let sliderOptions = getSliderOptions();\n\n $slider.on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n let $parent = $(this).parent();\n updateProgressBar($parent, nextSlide, slick.slideCount, slick.options.slidesToShow);\n });\n\n let baseOptions = getSliderOptions();\n\n // Modify options specific to the popup slick slider\n let popupSliderOptions = $.extend({}, baseOptions, {\n slidesToShow: 1,\n slidesToScroll: 1,\n responsive: [\n {\n breakpoint: 544,\n settings: {\n slidesToShow: 1.5,\n arrows: true,\n slidesToScroll: 1\n }\n }\n ]\n });\n\n // Initialize the popup slick slider\n $('.added-to-cart-popup .product-recommendations .product-grid').not('.slick-initialized').slick(popupSliderOptions);\n\n // Initialiser le slick slider principal\n $('.product-recommendations .product-grid').not('.slick-initialized').slick(sliderOptions);\n\n $('.product-recommendations .image-container').each(function (index, element) {\n tileImage.initHoverImageContainer($(element));\n });\n });\n}\n\n/**\n * Obfuscation of the href\n */\nfunction obfuscationEinstein() {\n $('body').on('click', '.image-container .link-cbo', function (e) {\n e.stopPropagation();\n var encodedUrl = $(this).attr('data-cbo');\n var showMoreUrl = decodeURIComponent(window.atob(encodedUrl));\n var imageReplaceURL = showMoreUrl.replace('#', '%23');\n window.location.href = imageReplaceURL;\n });\n}\n\n/**\n * Init quick access feature\n */\nfunction initRecommandationLogic() {\n $(function () {\n initProductRecommendationSlick();\n obfuscationEinstein();\n });\n}\n\nmodule.exports = {\n getSliderOptions, updateProgressBar, initRecommandationLogic, obfuscationEinstein, initProductRecommendationSlick\n};\n","'use strict';\nvar base = require('./base');\nvar focusHelper = require('../components/focus');\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#quickViewModal').length !== 0) {\n $('#quickViewModal').remove();\n }\n var htmlString = '<!-- Modal -->'\n + '<div class=\"modal fade\" id=\"quickViewModal\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog quick-view-dialog\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <a class=\"full-pdp-link\" href=\"\"></a>'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span aria-hidden=\"true\">×</span>'\n + ' <span class=\"sr-only\"> </span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '<div class=\"modal-footer\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n}\n\n/**\n * @typedef {Object} QuickViewHtml\n * @property {string} body - Main Quick View body\n * @property {string} footer - Quick View footer content\n */\n\n/**\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.product-quickview');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n */\nfunction fillModalElement(selectedValueUrl) {\n $('.modal-body').spinner().start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n\n $('.modal-body').empty();\n $('.modal-body').html(parsedHtml.body);\n $('.modal-footer').html(parsedHtml.footer);\n $('.full-pdp-link').text(data.quickViewFullDetailMsg);\n $('#quickViewModal .full-pdp-link').attr('href', data.productUrl);\n $('#quickViewModal .size-chart').attr('href', data.productUrl);\n $('#quickViewModal .modal-header .close .sr-only').text(data.closeButtonText);\n $('#quickViewModal .enter-message').text(data.enterDialogMessage);\n $('#quickViewModal').modal('show');\n $('body').trigger('quickview:ready');\n\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\nmodule.exports = {\n showQuickview: function () {\n $('body').on('click', '.quickview', function (e) {\n e.preventDefault();\n var selectedValueUrl = $(this).closest('a.quickview').attr('href');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n fillModalElement(selectedValueUrl);\n });\n },\n focusQuickview: function () {\n $('body').on('shown.bs.modal', '#quickViewModal', function () {\n $('#quickViewModal .close').focus();\n });\n },\n trapQuickviewFocus: function () {\n $('body').on('keydown', '#quickViewModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#quickViewModal',\n firstElementSelector: '.full-pdp-link',\n lastElementSelector: '.add-to-cart-global',\n nextToLastElementSelector: '.modal-footer .quantity-select'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n availability: base.availability,\n addToCart: base.addToCart,\n showSpinner: function () {\n $('body').on('product:beforeAddToCart', function (e, data) {\n $(data).closest('.modal-content').spinner().start();\n });\n },\n hideDialog: function () {\n $('body').on('product:afterAddToCart', function () {\n $('#quickViewModal').modal('hide');\n });\n },\n beforeUpdateAttribute: function () {\n $('body').on('product:beforeAttributeSelect', function () {\n $('.modal.show .modal-content').spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.modal.show .product-quickview>.bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container)\n .find('.product-id').text(response.data.product.id);\n } else if ($('.set-items').length) {\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\n $('.modal.show .full-pdp-link')\n .attr('href', response.data.product.selectedProductUrl);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n // update global add to cart (single products, bundles)\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n $('.add-to-cart-global', dialog).attr('disabled',\n !$('.global-availability', dialog).data('ready-to-order')\n || !$('.global-availability', dialog).data('available')\n );\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n // bundle individual products\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n\n\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n if ($('.product-availability', dialog).length) {\n // bundle all products\n var allAvailable = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', dialog).empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n } else {\n // single product\n $('.global-availability', dialog)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n }\n};\n","'use strict';\n\n/**\n * appends params to a url\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} icon - icon that was clicked to add a product to the wishlist\n */\nfunction displayMessageAndChangeIcon(data, icon) {\n $.spinner().stop();\n if (data.success) {\n if (icon.hasClass('fa-heart-icon')) {\n icon.removeClass('fa-heart-icon').addClass('fa-heart-icon-on');\n }\n }\n\n if ($('.wishlist-product-heart-messages').length === 0) {\n $('body').append('<div class=\"wishlist-product-heart-messages\"></div>');\n }\n\n if ($('.wishlist-product-heart-alert').length === 0) {\n $('.wishlist-product-heart-messages')\n .append('<div class=\"wishlist-product-heart-alert text-center\">' + data.msg + '</div>');\n }\n\n setTimeout(function () {\n $('.wishlist-product-heart-messages').remove();\n }, 3000);\n}\n\n/**\n * Handles the removal of a product from the wishlist and changes the heart icon color back to normal.\n * @param {Object} data - The data returned from the server indicating the result of the removal operation.\n * @param {jQuery} icon - The jQuery object representing the heart icon element.\n * @returns {void}\n */\nfunction removeFromWishlist(data, icon) {\n $.spinner().stop();\n if (data.success) {\n if (icon.hasClass('fa-heart-icon-on')) {\n icon.removeClass('fa-heart-icon-on').addClass('fa-heart-icon');\n }\n }\n}\n\nmodule.exports = {\n toggleWishlist: function () {\n $('body').on('click', '.wishlistHeart', function (e) {\n e.stopPropagation();\n e.preventDefault();\n var $this = $(this);\n var routeType = 'post';\n var icon = $this.find($('i'));\n var url = $this.attr('href');\n var removeFromWishlistUrl = $this.data('removewishlist');\n var pid = $this.data('pid') || $this.closest('.product').data('pid') || $this.closest('.product-detail').data('pid');\n var optionId = $this.closest('.product-detail').find('.product-option').attr('data-option-id');\n var optionVal = $this.closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\n optionId = optionId || null;\n optionVal = optionVal || null;\n\n if (icon.hasClass('fa-heart-icon-on')) {\n url = removeFromWishlistUrl;\n routeType = 'get';\n }\n\n if (!url || !pid) {\n return;\n }\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: routeType,\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n },\n success: function (data) {\n if (data.notAddedToWishlist) {\n $('body').trigger('wishlist:addItem', data);\n displayMessageAndChangeIcon(data, icon);\n } else {\n removeFromWishlist(data, icon);\n }\n },\n error: function (err) {\n displayMessageAndChangeIcon(err, icon);\n }\n });\n });\n }\n};\n","'use strict';\n\nrequire('./plugins/storelocator/jquery.storelocator');\nvar processInclude = require('./util');\n\n$(function () {\n processInclude(require('./product/detail'));\n processInclude(require('./product/wishlistHeart'));\n processInclude(require('./product/storeExclusivity'));\n processInclude(require('./product/quickViewDetail'));\n processInclude(require('./checkout/shipping/inStoreDrawer'));\n});\n","/* eslint-disable no-undef */\n/* eslint-disable no-nested-ternary */\n/* eslint-disable no-fallthrough */\n/* eslint-disable no-unused-expressions */\n\n'use strict';\n\nconst base = require('base:product/detail');\nconst attributesLogic = require('attributes');\nconst recommendationsLogic = require('../components/recommendations');\nrequire('slick-carousel');\n\n/**\n* Creates a modal HTML element with the current slide index\n* @param {number} currentSlide - the current slide index\n*/\nfunction getModalHtmlElement(currentSlide) {\n if ($('#detailImageModal').length !== 0) {\n $('#detailImageModal').remove();\n }\n var htmlString = '<!-- Modal -->'\n + '<div class=\"modal fade\" id=\"detailImageModal\" role=\"dialog\">'\n + '<div class=\"carousel-info sr-only\" data-initial-index=' + currentSlide + '></div>'\n + '<div class=\"modal-dialog detail-image-dialog\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span class=\"close-btn\"></span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n}\n\n/**\n* Parses HTML and returns the body element\n* @param {string} html - HTML string to parse\n* @returns {Object} - an object containing the body element\n*/\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.primary-images');\n\n return { body: body };\n}\n\n/**\n* Fills the modal element with the selected value URL\n* @param {string} selectedValueUrl - the URL of the selected value\n*/\nfunction fillModalElement(selectedValueUrl) {\n $('.modal-body')\n .spinner()\n .start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n\n $('.modal-body')\n .empty()\n .html(parsedHtml.body);\n $('#detailImageModal').modal('show');\n $('body').trigger('detailimage:ready');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * @param {string} attributeName 'orc_color' or 'orc_size'\n * @param {string} attrDataAttrID 'data-attr'\n * @param {Object} attributeValues element object\n * @returns {boolean} true if a value has already been selected for the attributeName, false otherwise\n */\nfunction isAttributeSelected(attributeName, attrDataAttrID, attributeValues) {\n // eslint-disable-next-line no-shadow\n const attribute = Object.values(attributeValues).find(function (attributeValues) {\n return attributeValues.attributes[attrDataAttrID].value == attributeName;\n });\n\n return Object.values(attribute.children).some(function (child) {\n return Object.values(child.classList).some(function (className) {\n return Object.is(className, 'circle-selected');\n });\n });\n}\n\n/**\n * Adjust the add-to-cart button text depending on the value of COLOR and SIZE attribute\n * @param {Object} event event\n */\nfunction updateAddToCartButton(event) {\n const attrDataAttrID = 'data-attr';\n const attrVariationTextChoose = 'data-text-choose';\n const COLOR = 'orc_color';\n const SIZE = 'orc_size';\n\n const $target = $(event.currentTarget);\n\n const attributeID = $target.closest('.attribute-values').attr(attrDataAttrID);\n const buttonAddToCart = $target.parentsUntil('.product-detail-container').find('.add-to-cart-custom-btn');\n const attributeValues = $target.parentsUntil('row.variation-attributes').find('.attribute-values');\n\n switch (attributeID) {\n case COLOR:\n (!isAttributeSelected(SIZE, attrDataAttrID, attributeValues))\n ? buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.CHOOSE_SIZE)\n : buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.ADD_TO_CART);\n case SIZE:\n (!isAttributeSelected(COLOR, attrDataAttrID, attributeValues))\n ? buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.CHOOSE_COLOR)\n : buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.ADD_TO_CART);\n default:\n (!isAttributeSelected(COLOR, attrDataAttrID, attributeValues))\n ? buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.CHOOSE_COLOR)\n : (!isAttributeSelected(SIZE, attrDataAttrID, attributeValues))\n ? buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.CHOOSE_SIZE)\n : buttonAddToCart.attr(attrVariationTextChoose, () => appData.resources.ADD_TO_CART);\n }\n}\n\n/**\n* Initializes product detail logic\n*/\nfunction initProductDetailLogic() {\n $(function () {\n $('.attributes .attribute.toggle').on('click', attributesLogic.toggleAttribute);\n $('.attribute-values .circle-unselected').on('click', function (e) {\n if ($(e.currentTarget).hasClass('circle-selected') === false) {\n attributesLogic.selectAttributeValue(e);\n updateAddToCartButton(e);\n }\n });\n\n recommendationsLogic.initRecommandationLogic();\n\n $('.club-subscription-link').on('click', function () {\n var encodedUrl = $(this).attr('data-cbo');\n var showMoreUrl = decodeURIComponent(window.atob(encodedUrl));\n window.location.href = showMoreUrl;\n });\n });\n}\n\n/**\n* Updates the add to cart button and other elements based on the product availability\n* @param {Object} e - Event object\n* @param {Object} response - Response object containing the product container and product object\n*/\nfunction updateAddToCartCustom() {\n $('body').on('product:updateAddToCart', function (e, response) {\n // If the user clicks on a variation that is already selected, no need to update\n if ($(e.currentTarget).hasClass('circle-selected') === false) {\n // update local add to cart (for sets)\n const $addToCartButton = $('button.add-to-cart', response.$productContainer);\n const disableButton = (!response.product.readyToOrder || !response.product.available);\n\n $addToCartButton.attr('disabled', disableButton);\n\n if (disableButton) {\n $addToCartButton.text($addToCartButton.attr('data-text-choose'));\n } else {\n $addToCartButton.text($addToCartButton.attr('data-text-ready'));\n }\n\n var enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n base.methods.updateAddToCartEnableDisableOtherElements(!enable);\n }\n });\n}\n\n/**\n* Aligns swatches for color and size attributes on product detail page\n*/\nfunction pdpdSwatchAlign() {\n var $aligncolorSwatch = $('.variation-attributes div[data-attr=\"orc_color\"] .attribute-values');\n var $alignsizeSwatch = $('.variation-attributes div[data-attr=\"orc_size\"] .attribute-values');\n if ($aligncolorSwatch.find('.circle-attribute').length > 6) {\n $aligncolorSwatch.addClass('center-align');\n }\n if ($alignsizeSwatch.find('.circle-attribute').length > 6) {\n $alignsizeSwatch.addClass('center-align');\n }\n} pdpdSwatchAlign();\n\n/**\n* Closes the popin modal when the specified event data is received.\n*\n* @param {Object} evt - The event object containing data about the event.\n* @param {string} evt.data - The data associated with the event, expected to be 'close' to trigger the popin closure.\n*/\nfunction closeEReservationPopin(evt) {\n if (evt.data === 'close') {\n // close the popin\n $('#eReservation').modal('hide');\n let $eReservationIframe = $('#eReservation iframe');\n $eReservationIframe.attr('src', $eReservationIframe.attr('src'));\n }\n}\n\nmodule.exports = {\n ...base,\n ...{\n initProductDetailLogic,\n /**\n * Handles click events on product detail images and modal elements\n */\n showProductDetailImageModal: function () {\n $('body').on('click', '.slick-slide', function () {\n var index = $(this).data('slick-index');\n $(this)\n .closest('.slick-slider')\n .attr('data-current-slide', index);\n });\n $('body').on('click', '.product-detail-image-modal', function (e) {\n e.preventDefault();\n\n if (window.app.isMobile()) {\n return;\n }\n\n var encodedUrl = $(this).attr('data-cbo');\n var selectedValueUrl = decodeURIComponent(window.atob(encodedUrl));\n $(e.target).trigger('detailimage:show');\n var currentSlide = $(this)\n .closest('.slick-slider').find('.slick-current')\n .data('slick-index');\n getModalHtmlElement(currentSlide);\n fillModalElement(selectedValueUrl);\n });\n },\n updateAddToCart: updateAddToCartCustom,\n /**\n * Handles the click event on the Trustville product widget\n * @param {Object} e - the click event\n */\n handleReviewStars: function () {\n $('.trustville-product-widget-small').on('click', function (e) {\n e.preventDefault();\n $('#reviewsPanelCollapse').collapse('show');\n document.getElementById('accordionProductDetails').scrollIntoView({ behavior: 'smooth' });\n });\n },\n /**\n * Initializes the carousel in the detail image modal\n * @param {Object} $modal - The jQuery object of the detail image modal\n * @param {number} currentSlide - The initial slide index\n * @param {Object} $carousel - The jQuery object of the carousel\n */\n initDetailImageModal: function () {\n $('body').on('shown.bs.modal', '#detailImageModal', function () {\n var $modal = $('#detailImageModal');\n var currentSlide = $modal.find('.carousel-info').data('initial-index');\n var $carousel = $modal.find('.carousel-inner');\n\n $carousel.slick({\n initialSlide: currentSlide,\n slidesToShow: 1,\n slidesToScroll: 1,\n dots: false,\n arrows: true\n });\n });\n },\n /**\n * Initializes the eReservation modal functionality, allowing users to reserve items in-store.\n *\n * This function sets up an event listener on the body element to display the eReservation modal\n * when elements with the class 'js-reserve-in-store' are clicked. It also listens for messages\n * from other windows to close the modal when a 'close' message is received.\n *\n * @listens {jQuery.Event} click - Triggers the display of the eReservation modal.\n * @listens {MessageEvent} message - Listens for messages to close the modal.\n * @param {Object} evt - The event object containing data about the event.\n * @param {string} evt.data - The data associated with the event, expected to be 'close' to trigger the popin closure.\n */\n EReservationModal: function () {\n let $eReservation = $('#eReservation');\n\n if ($eReservation.length) {\n $('body').on('click', '.js-reserve-in-store', function () {\n $eReservation.modal('show');\n });\n\n if (window.addEventListener) {\n window.addEventListener('message', closeEReservationPopin, false);\n } else {\n window.attachEvent('onmessage', closeEReservationPopin);\n }\n\n $('body').on('hidden.bs.modal', '#eReservation', function () {\n closeEReservationPopin({ data: 'close' });\n });\n }\n }\n }\n};\n","'use strict';\n\nmodule.exports = function () {\n $('body').on('click', '.contact-shop', function () {\n window.location = $(this).data('href');\n });\n};\n","'use strict';\n\nconst base = require('base:product/quickView');\nvar focusHelper = require('../components/focus');\nconst attributesLogic = require('attributes');\n\n/**\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n return $html.find('.product-quickview');\n}\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#quickViewModal').length !== 0) {\n $('#quickViewModal').remove();\n }\n var htmlString = ''\n + '<div class=\"modal fade\" id=\"quickViewModal\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog quick-view-dialog\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span class=\"close-btn\"></span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n\n var $modalEl = $(htmlString);\n $modalEl.on('shown.bs.modal', function () {\n // this event will be catched to be used to initialize slick slider\n $('body').trigger('quickview:ready', $modalEl);\n });\n $('body').append($modalEl);\n}\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n * @param {string} productGtm - GTM\n */\nfunction fillModalElement(selectedValueUrl, productGtm) {\n $('.modal-body').spinner().start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n var $quickViewModal = $('#quickViewModal');\n\n $quickViewModal.find('.modal-body').empty().html(parsedHtml).find('.quick-view-carousel-area')\n .addClass('d-none');\n $('.full-pdp-link').text(data.quickViewFullDetailMsg);\n $('.full-pdp-link', $quickViewModal).attr('href', data.productUrl);\n $('.size-chart', $quickViewModal).attr('href', data.productUrl);\n $('.modal-header .close .sr-only', $quickViewModal).text(data.closeButtonText);\n $('.enter-message', $quickViewModal).text(data.enterDialogMessage);\n $('#quickViewModal').attr('data-product-gtm', JSON.stringify(productGtm));\n $quickViewModal.modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n/**\n * Adjust the add-to-cart button\n * @param {Object} disableButton - disable button add to cart\n */\nfunction updateAddToCartButton(disableButton) {\n const $addToCartButton = $('button.add-to-cart-global');\n $addToCartButton.attr('disabled', disableButton);\n\n const $section = $addToCartButton.closest('.add-to-cart-section');\n\n if ($section.length > 0) {\n if (disableButton) {\n $addToCartButton.text($section.attr('data-text-choose'));\n } else {\n $addToCartButton.text($section.attr('data-text-ready'));\n }\n }\n}\n\n/**\n * Init events for quickView\n */\nfunction initQuickViewLogic() {\n // Init event on document ready\n $(function () {\n var $body = $('body');\n $body.on('click', '.product-attributes-section .attribute.toggle', attributesLogic.toggleAttribute);\n $body.on('click', '.attribute-values .circle-unselected', attributesLogic.selectAttributeValue);\n\n $body.on('product:updateAddToCart', function (e, response) {\n const disableButton = (!response.product.readyToOrder || !response.product.available);\n updateAddToCartButton(disableButton);\n });\n $body.on('quickview:ready', function (e, response) {\n $('.alert-incompatible-shipping-methods').html($('#incompatible-shipping-methods-message-holder').html());\n\n var $carousel = $();\n var $modal = $(response);\n\n if ($modal.length) {\n $carousel = $modal.find('.quick-view-carousel-area .detail-slider-nav.detail-desktop-images.quickview-carousel');\n } else {\n $carousel = $('.quick-view-carousel-area .detail-slider-nav.detail-desktop-images.quickview-carousel');\n }\n\n $carousel.on('init', function () {\n $modal.find('.quick-view-carousel-area').removeClass('d-none');\n });\n\n $carousel.slick({\n slidesToShow: 1,\n slidesToScroll: 1,\n dots: true,\n focusOnSelect: true,\n infinite: false,\n arrows: true\n });\n });\n });\n}\n\nmodule.exports = {\n getModalHtmlElement,\n initQuickViewLogic,\n showQuickview: function () {\n $('body').on('click', '.quickview', function (e) {\n e.preventDefault();\n e.stopPropagation();\n var selectedValueUrl = $(this).attr('href');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n var $productGtm = $($(this).closest('.product-tile')[0]).data('productGtm');\n fillModalElement(selectedValueUrl, $productGtm);\n });\n },\n focusQuickview: function () {\n $('body').on('shown.bs.modal', '#quickViewModal', function () {\n $('#quickViewModal .close').focus();\n });\n },\n trapQuickviewFocus: function () {\n $('body').on('keydown', '#quickViewModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#quickViewModal',\n firstElementSelector: '.full-pdp-link',\n lastElementSelector: '.add-to-cart-global',\n nextToLastElementSelector: '.modal-footer .quantity-select'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n availability: base.availability,\n showSpinner: function () {\n $('body').on('product:beforeAddToCart', function (e, data) {\n $(data).closest('.modal-content').spinner().start();\n });\n },\n hideDialog: function () {\n $('body').on('product:afterAddToCart', function () {\n $('#quickViewModal').modal('hide');\n });\n },\n beforeUpdateAttribute: function () {\n $('body').on('product:beforeAttributeSelect', function () {\n $('.modal.show .modal-content').spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.modal.show .product-quickview>.bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container)\n .find('.product-id').text(response.data.product.id);\n } else if ($('.set-items').length) {\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\n $('.modal.show .full-pdp-link')\n .attr('href', response.data.product.selectedProductUrl);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n // update global add to cart (single products, bundles)\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n $('.add-to-cart-global', dialog).attr('disabled',\n !$('.global-availability', dialog).data('ready-to-order')\n || !$('.global-availability', dialog).data('available'));\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n // bundle individual products\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n if ($('.product-availability', dialog).length) {\n // bundle all products\n var allAvailable = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', dialog).empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n } else {\n // single product\n $('.global-availability', dialog)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n }\n};\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.21';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function',\n INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading whitespace. */\n var reTrimStart = /^\\s+/;\n\n /** Used to match a single whitespace character. */\n var reWhitespace = /\\s/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\n var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\n function baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision && nativeIsFinite(number)) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '<p>' + func(text) + '</p>';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '<p>fred, barney, & pebbles</p>'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b><script></b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * // var __t, __p = '';\n * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * // return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n * var JST = {\\\n * \"main\": ' + _.template(mainText).source + '\\\n * };\\\n * ');\n */\n function template(string, options, guard) {\n // Based on John Resig's `tmpl` implementation\n // (http://ejohn.org/blog/javascript-micro-templating/)\n // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n var settings = lodash.templateSettings;\n\n if (guard && isIterateeCall(string, options, guard)) {\n options = undefined;\n }\n string = toString(string);\n options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n importsKeys = keys(imports),\n importsValues = baseValues(imports, importsKeys);\n\n var isEscaping,\n isEvaluating,\n index = 0,\n interpolate = options.interpolate || reNoMatch,\n source = \"__p += '\";\n\n // Compile the regexp to match each delimiter.\n var reDelimiters = RegExp(\n (options.escape || reNoMatch).source + '|' +\n interpolate.source + '|' +\n (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n (options.evaluate || reNoMatch).source + '|$'\n , 'g');\n\n // Use a sourceURL for easier debugging.\n // The sourceURL gets injected into the source that's eval-ed, so be careful\n // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n // and escape the comment, thus injecting code that gets evaled.\n var sourceURL = '//# sourceURL=' +\n (hasOwnProperty.call(options, 'sourceURL')\n ? (options.sourceURL + '').replace(/\\s/g, ' ')\n : ('lodash.templateSources[' + (++templateCounter) + ']')\n ) + '\\n';\n\n string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n interpolateValue || (interpolateValue = esTemplateValue);\n\n // Escape characters that can't be included in string literals.\n source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n // Replace delimiters with snippets.\n if (escapeValue) {\n isEscaping = true;\n source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n }\n if (evaluateValue) {\n isEvaluating = true;\n source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n }\n if (interpolateValue) {\n source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n }\n index = offset + match.length;\n\n // The JS engine embedded in Adobe products needs `match` returned in\n // order to produce the correct `offset` value.\n return match;\n });\n\n source += \"';\\n\";\n\n // If `variable` is not specified wrap a with-statement around the generated\n // code to add the data object to the top of the scope chain.\n var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n if (!variable) {\n source = 'with (obj) {\\n' + source + '\\n}\\n';\n }\n // Throw an error if a forbidden character was found in `variable`, to prevent\n // potential command injection attacks.\n else if (reForbiddenIdentifierChars.test(variable)) {\n throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n }\n\n // Cleanup code by stripping empty strings.\n source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n .replace(reEmptyStringMiddle, '$1')\n .replace(reEmptyStringTrailing, '$1;');\n\n // Frame code as the function body.\n source = 'function(' + (variable || 'obj') + ') {\\n' +\n (variable\n ? ''\n : 'obj || (obj = {});\\n'\n ) +\n \"var __t, __p = ''\" +\n (isEscaping\n ? ', __e = _.escape'\n : ''\n ) +\n (isEvaluating\n ? ', __j = Array.prototype.join;\\n' +\n \"function print() { __p += __j.call(arguments, '') }\\n\"\n : ';\\n'\n ) +\n source +\n 'return __p\\n}';\n\n var result = attempt(function() {\n return Function(importsKeys, sourceURL + 'return ' + source)\n .apply(undefined, importsValues);\n });\n\n // Provide the compiled function's source by its `toString` method or\n // the `source` property as a convenience for inlining compiled templates.\n result.source = source;\n if (isError(result)) {\n throw result;\n }\n return result;\n }\n\n /**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */\n function toLower(value) {\n return toString(value).toLowerCase();\n }\n\n /**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */\n function toUpper(value) {\n return toString(value).toUpperCase();\n }\n\n /**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim(' abc ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map([' foo ', ' bar '], _.trim);\n * // => ['foo', 'bar']\n */\n function trim(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return baseTrim(string);\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n chrSymbols = stringToArray(chars),\n start = charsStartIndex(strSymbols, chrSymbols),\n end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n return castSlice(strSymbols, start, end).join('');\n }\n\n /**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd(' abc ');\n * // => ' abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */\n function trimEnd(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.slice(0, trimmedEndIndex(string) + 1);\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n return castSlice(strSymbols, 0, end).join('');\n }\n\n /**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\n function trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n }\n\n /**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\n function truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n }\n\n /**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&`, `<`, `>`, `"`, and `'` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function unescape(string) {\n string = toString(string);\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, unescapeHtmlChar)\n : string;\n }\n\n /**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */\n var upperCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toUpperCase();\n });\n\n /**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\n var upperFirst = createCaseFirst('toUpperCase');\n\n /**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\n function words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n * return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n * elements = [];\n * }\n */\n var attempt = baseRest(function(func, args) {\n try {\n return apply(func, undefined, args);\n } catch (e) {\n return isError(e) ? e : new Error(e);\n }\n });\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method.\n *\n * **Note:** This method doesn't set the \"length\" property of bound functions.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} methodNames The object method names to bind.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'click': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view, ['click']);\n * jQuery(element).on('click', view.click);\n * // => Logs 'clicked docs' when clicked.\n */\n var bindAll = flatRest(function(object, methodNames) {\n arrayEach(methodNames, function(key) {\n key = toKey(key);\n baseAssignValue(object, key, bind(object[key], object));\n });\n return object;\n });\n\n /**\n * Creates a function that iterates over `pairs` and invokes the corresponding\n * function of the first predicate to return truthy. The predicate-function\n * pairs are invoked with the `this` binding and arguments of the created\n * function.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Array} pairs The predicate-function pairs.\n * @returns {Function} Returns the new composite function.\n * @example\n *\n * var func = _.cond([\n * [_.matches({ 'a': 1 }), _.constant('matches A')],\n * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n * [_.stubTrue, _.constant('no match')]\n * ]);\n *\n * func({ 'a': 1, 'b': 2 });\n * // => 'matches A'\n *\n * func({ 'a': 0, 'b': 1 });\n * // => 'matches B'\n *\n * func({ 'a': '1', 'b': '2' });\n * // => 'no match'\n */\n function cond(pairs) {\n var length = pairs == null ? 0 : pairs.length,\n toIteratee = getIteratee();\n\n pairs = !length ? [] : arrayMap(pairs, function(pair) {\n if (typeof pair[1] != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return [toIteratee(pair[0]), pair[1]];\n });\n\n return baseRest(function(args) {\n var index = -1;\n while (++index < length) {\n var pair = pairs[index];\n if (apply(pair[0], this, args)) {\n return apply(pair[1], this, args);\n }\n }\n });\n }\n\n /**\n * Creates a function that invokes the predicate properties of `source` with\n * the corresponding property values of a given object, returning `true` if\n * all predicates return truthy, else `false`.\n *\n * **Note:** The created function is equivalent to `_.conformsTo` with\n * `source` partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 2, 'b': 1 },\n * { 'a': 1, 'b': 2 }\n * ];\n *\n * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n * // => [{ 'a': 1, 'b': 2 }]\n */\n function conforms(source) {\n return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * Checks `value` to determine whether a default value should be returned in\n * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n * or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Util\n * @param {*} value The value to check.\n * @param {*} defaultValue The default value.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * _.defaultTo(1, 10);\n * // => 1\n *\n * _.defaultTo(undefined, 10);\n * // => 10\n */\n function defaultTo(value, defaultValue) {\n return (value == null || value !== value) ? defaultValue : value;\n }\n\n /**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\n var flow = createFlow();\n\n /**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\n var flowRight = createFlow(true);\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n * return !_.isRegExp(func) ? iteratee(func) : function(string) {\n * return func.test(string);\n * };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */\n function iteratee(func) {\n return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between a given\n * object and `source`, returning `true` if the given object has equivalent\n * property values, else `false`.\n *\n * **Note:** The created function is equivalent to `_.isMatch` with `source`\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\n function matches(source) {\n return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\n function matchesProperty(path, srcValue) {\n return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that invokes the method at `path` of a given object.\n * Any additional arguments are provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': _.constant(2) } },\n * { 'a': { 'b': _.constant(1) } }\n * ];\n *\n * _.map(objects, _.method('a.b'));\n * // => [2, 1]\n *\n * _.map(objects, _.method(['a', 'b']));\n * // => [2, 1]\n */\n var method = baseRest(function(path, args) {\n return function(object) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * The opposite of `_.method`; this method creates a function that invokes\n * the method at a given path of `object`. Any additional arguments are\n * provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Object} object The object to query.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var array = _.times(3, _.constant),\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n * // => [2, 0]\n */\n var methodOf = baseRest(function(object, args) {\n return function(path) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * Adds all own enumerable string keyed function properties of a source\n * object to the destination object. If `object` is a function, then methods\n * are added to its prototype as well.\n *\n * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n * avoid conflicts caused by modifying the original.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Function|Object} [object=lodash] The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n * @returns {Function|Object} Returns `object`.\n * @example\n *\n * function vowels(string) {\n * return _.filter(string, function(v) {\n * return /[aeiou]/i.test(v);\n * });\n * }\n *\n * _.mixin({ 'vowels': vowels });\n * _.vowels('fred');\n * // => ['e']\n *\n * _('fred').vowels().value();\n * // => ['e']\n *\n * _.mixin({ 'vowels': vowels }, { 'chain': false });\n * _('fred').vowels();\n * // => ['e']\n */\n function mixin(object, source, options) {\n var props = keys(source),\n methodNames = baseFunctions(source, props);\n\n if (options == null &&\n !(isObject(source) && (methodNames.length || !props.length))) {\n options = source;\n source = object;\n object = this;\n methodNames = baseFunctions(source, keys(source));\n }\n var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n isFunc = isFunction(object);\n\n arrayEach(methodNames, function(methodName) {\n var func = source[methodName];\n object[methodName] = func;\n if (isFunc) {\n object.prototype[methodName] = function() {\n var chainAll = this.__chain__;\n if (chain || chainAll) {\n var result = object(this.__wrapped__),\n actions = result.__actions__ = copyArray(this.__actions__);\n\n actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n result.__chain__ = chainAll;\n return result;\n }\n return func.apply(object, arrayPush([this.value()], arguments));\n };\n }\n });\n\n return object;\n }\n\n /**\n * Reverts the `_` variable to its previous value and returns a reference to\n * the `lodash` function.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @returns {Function} Returns the `lodash` function.\n * @example\n *\n * var lodash = _.noConflict();\n */\n function noConflict() {\n if (root._ === this) {\n root._ = oldDash;\n }\n return this;\n }\n\n /**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\n function noop() {\n // No operation performed.\n }\n\n /**\n * Creates a function that gets the argument at index `n`. If `n` is negative,\n * the nth argument from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [n=0] The index of the argument to return.\n * @returns {Function} Returns the new pass-thru function.\n * @example\n *\n * var func = _.nthArg(1);\n * func('a', 'b', 'c', 'd');\n * // => 'b'\n *\n * var func = _.nthArg(-2);\n * func('a', 'b', 'c', 'd');\n * // => 'c'\n */\n function nthArg(n) {\n n = toInteger(n);\n return baseRest(function(args) {\n return baseNth(args, n);\n });\n }\n\n /**\n * Creates a function that invokes `iteratees` with the arguments it receives\n * and returns their results.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.over([Math.max, Math.min]);\n *\n * func(1, 2, 3, 4);\n * // => [4, 1]\n */\n var over = createOver(arrayMap);\n\n /**\n * Creates a function that checks if **all** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overEvery([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => false\n *\n * func(NaN);\n * // => false\n */\n var overEvery = createOver(arrayEvery);\n\n /**\n * Creates a function that checks if **any** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overSome([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => true\n *\n * func(NaN);\n * // => false\n *\n * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n */\n var overSome = createOver(arraySome);\n\n /**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\n function property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n }\n\n /**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\n function propertyOf(object) {\n return function(path) {\n return object == null ? undefined : baseGet(object, path);\n };\n }\n\n /**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\n var range = createRange();\n\n /**\n * This method is like `_.range` except that it populates values in\n * descending order.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.range\n * @example\n *\n * _.rangeRight(4);\n * // => [3, 2, 1, 0]\n *\n * _.rangeRight(-4);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 5);\n * // => [4, 3, 2, 1]\n *\n * _.rangeRight(0, 20, 5);\n * // => [15, 10, 5, 0]\n *\n * _.rangeRight(0, -4, -1);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.rangeRight(0);\n * // => []\n */\n var rangeRight = createRange(true);\n\n /**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\n function stubArray() {\n return [];\n }\n\n /**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\n function stubFalse() {\n return false;\n }\n\n /**\n * This method returns a new empty object.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Object} Returns the new empty object.\n * @example\n *\n * var objects = _.times(2, _.stubObject);\n *\n * console.log(objects);\n * // => [{}, {}]\n *\n * console.log(objects[0] === objects[1]);\n * // => false\n */\n function stubObject() {\n return {};\n }\n\n /**\n * This method returns an empty string.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {string} Returns the empty string.\n * @example\n *\n * _.times(2, _.stubString);\n * // => ['', '']\n */\n function stubString() {\n return '';\n }\n\n /**\n * This method returns `true`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `true`.\n * @example\n *\n * _.times(2, _.stubTrue);\n * // => [true, true]\n */\n function stubTrue() {\n return true;\n }\n\n /**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The iteratee is invoked with one argument; (index).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.times(3, String);\n * // => ['0', '1', '2']\n *\n * _.times(4, _.constant(0));\n * // => [0, 0, 0, 0]\n */\n function times(n, iteratee) {\n n = toInteger(n);\n if (n < 1 || n > MAX_SAFE_INTEGER) {\n return [];\n }\n var index = MAX_ARRAY_LENGTH,\n length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n iteratee = getIteratee(iteratee);\n n -= MAX_ARRAY_LENGTH;\n\n var result = baseTimes(length, iteratee);\n while (++index < n) {\n iteratee(index);\n }\n return result;\n }\n\n /**\n * Converts `value` to a property path array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {*} value The value to convert.\n * @returns {Array} Returns the new property path array.\n * @example\n *\n * _.toPath('a.b.c');\n * // => ['a', 'b', 'c']\n *\n * _.toPath('a[0].b.c');\n * // => ['a', '0', 'b', 'c']\n */\n function toPath(value) {\n if (isArray(value)) {\n return arrayMap(value, toKey);\n }\n return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n }\n\n /**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\n function uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {number} augend The first number in an addition.\n * @param {number} addend The second number in an addition.\n * @returns {number} Returns the total.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */\n var add = createMathOperation(function(augend, addend) {\n return augend + addend;\n }, 0);\n\n /**\n * Computes `number` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */\n var ceil = createRound('ceil');\n\n /**\n * Divide two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} dividend The first number in a division.\n * @param {number} divisor The second number in a division.\n * @returns {number} Returns the quotient.\n * @example\n *\n * _.divide(6, 4);\n * // => 1.5\n */\n var divide = createMathOperation(function(dividend, divisor) {\n return dividend / divisor;\n }, 1);\n\n /**\n * Computes `number` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */\n var floor = createRound('floor');\n\n /**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\n function max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n }\n\n /**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\n function maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n : undefined;\n }\n\n /**\n * Computes the mean of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the mean.\n * @example\n *\n * _.mean([4, 2, 8, 6]);\n * // => 5\n */\n function mean(array) {\n return baseMean(array, identity);\n }\n\n /**\n * This method is like `_.mean` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be averaged.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the mean.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.meanBy(objects, function(o) { return o.n; });\n * // => 5\n *\n * // The `_.property` iteratee shorthand.\n * _.meanBy(objects, 'n');\n * // => 5\n */\n function meanBy(array, iteratee) {\n return baseMean(array, getIteratee(iteratee, 2));\n }\n\n /**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\n function min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n }\n\n /**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\n function minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n : undefined;\n }\n\n /**\n * Multiply two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} multiplier The first number in a multiplication.\n * @param {number} multiplicand The second number in a multiplication.\n * @returns {number} Returns the product.\n * @example\n *\n * _.multiply(6, 4);\n * // => 24\n */\n var multiply = createMathOperation(function(multiplier, multiplicand) {\n return multiplier * multiplicand;\n }, 1);\n\n /**\n * Computes `number` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */\n var round = createRound('round');\n\n /**\n * Subtract two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {number} minuend The first number in a subtraction.\n * @param {number} subtrahend The second number in a subtraction.\n * @returns {number} Returns the difference.\n * @example\n *\n * _.subtract(6, 4);\n * // => 2\n */\n var subtract = createMathOperation(function(minuend, subtrahend) {\n return minuend - subtrahend;\n }, 0);\n\n /**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */\n function sum(array) {\n return (array && array.length)\n ? baseSum(array, identity)\n : 0;\n }\n\n /**\n * This method is like `_.sum` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be summed.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the sum.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.sumBy(objects, function(o) { return o.n; });\n * // => 20\n *\n * // The `_.property` iteratee shorthand.\n * _.sumBy(objects, 'n');\n * // => 20\n */\n function sumBy(array, iteratee) {\n return (array && array.length)\n ? baseSum(array, getIteratee(iteratee, 2))\n : 0;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.after = after;\n lodash.ary = ary;\n lodash.assign = assign;\n lodash.assignIn = assignIn;\n lodash.assignInWith = assignInWith;\n lodash.assignWith = assignWith;\n lodash.at = at;\n lodash.before = before;\n lodash.bind = bind;\n lodash.bindAll = bindAll;\n lodash.bindKey = bindKey;\n lodash.castArray = castArray;\n lodash.chain = chain;\n lodash.chunk = chunk;\n lodash.compact = compact;\n lodash.concat = concat;\n lodash.cond = cond;\n lodash.conforms = conforms;\n lodash.constant = constant;\n lodash.countBy = countBy;\n lodash.create = create;\n lodash.curry = curry;\n lodash.curryRight = curryRight;\n lodash.debounce = debounce;\n lodash.defaults = defaults;\n lodash.defaultsDeep = defaultsDeep;\n lodash.defer = defer;\n lodash.delay = delay;\n lodash.difference = difference;\n lodash.differenceBy = differenceBy;\n lodash.differenceWith = differenceWith;\n lodash.drop = drop;\n lodash.dropRight = dropRight;\n lodash.dropRightWhile = dropRightWhile;\n lodash.dropWhile = dropWhile;\n lodash.fill = fill;\n lodash.filter = filter;\n lodash.flatMap = flatMap;\n lodash.flatMapDeep = flatMapDeep;\n lodash.flatMapDepth = flatMapDepth;\n lodash.flatten = flatten;\n lodash.flattenDeep = flattenDeep;\n lodash.flattenDepth = flattenDepth;\n lodash.flip = flip;\n lodash.flow = flow;\n lodash.flowRight = flowRight;\n lodash.fromPairs = fromPairs;\n lodash.functions = functions;\n lodash.functionsIn = functionsIn;\n lodash.groupBy = groupBy;\n lodash.initial = initial;\n lodash.intersection = intersection;\n lodash.intersectionBy = intersectionBy;\n lodash.intersectionWith = intersectionWith;\n lodash.invert = invert;\n lodash.invertBy = invertBy;\n lodash.invokeMap = invokeMap;\n lodash.iteratee = iteratee;\n lodash.keyBy = keyBy;\n lodash.keys = keys;\n lodash.keysIn = keysIn;\n lodash.map = map;\n lodash.mapKeys = mapKeys;\n lodash.mapValues = mapValues;\n lodash.matches = matches;\n lodash.matchesProperty = matchesProperty;\n lodash.memoize = memoize;\n lodash.merge = merge;\n lodash.mergeWith = mergeWith;\n lodash.method = method;\n lodash.methodOf = methodOf;\n lodash.mixin = mixin;\n lodash.negate = negate;\n lodash.nthArg = nthArg;\n lodash.omit = omit;\n lodash.omitBy = omitBy;\n lodash.once = once;\n lodash.orderBy = orderBy;\n lodash.over = over;\n lodash.overArgs = overArgs;\n lodash.overEvery = overEvery;\n lodash.overSome = overSome;\n lodash.partial = partial;\n lodash.partialRight = partialRight;\n lodash.partition = partition;\n lodash.pick = pick;\n lodash.pickBy = pickBy;\n lodash.property = property;\n lodash.propertyOf = propertyOf;\n lodash.pull = pull;\n lodash.pullAll = pullAll;\n lodash.pullAllBy = pullAllBy;\n lodash.pullAllWith = pullAllWith;\n lodash.pullAt = pullAt;\n lodash.range = range;\n lodash.rangeRight = rangeRight;\n lodash.rearg = rearg;\n lodash.reject = reject;\n lodash.remove = remove;\n lodash.rest = rest;\n lodash.reverse = reverse;\n lodash.sampleSize = sampleSize;\n lodash.set = set;\n lodash.setWith = setWith;\n lodash.shuffle = shuffle;\n lodash.slice = slice;\n lodash.sortBy = sortBy;\n lodash.sortedUniq = sortedUniq;\n lodash.sortedUniqBy = sortedUniqBy;\n lodash.split = split;\n lodash.spread = spread;\n lodash.tail = tail;\n lodash.take = take;\n lodash.takeRight = takeRight;\n lodash.takeRightWhile = takeRightWhile;\n lodash.takeWhile = takeWhile;\n lodash.tap = tap;\n lodash.throttle = throttle;\n lodash.thru = thru;\n lodash.toArray = toArray;\n lodash.toPairs = toPairs;\n lodash.toPairsIn = toPairsIn;\n lodash.toPath = toPath;\n lodash.toPlainObject = toPlainObject;\n lodash.transform = transform;\n lodash.unary = unary;\n lodash.union = union;\n lodash.unionBy = unionBy;\n lodash.unionWith = unionWith;\n lodash.uniq = uniq;\n lodash.uniqBy = uniqBy;\n lodash.uniqWith = uniqWith;\n lodash.unset = unset;\n lodash.unzip = unzip;\n lodash.unzipWith = unzipWith;\n lodash.update = update;\n lodash.updateWith = updateWith;\n lodash.values = values;\n lodash.valuesIn = valuesIn;\n lodash.without = without;\n lodash.words = words;\n lodash.wrap = wrap;\n lodash.xor = xor;\n lodash.xorBy = xorBy;\n lodash.xorWith = xorWith;\n lodash.zip = zip;\n lodash.zipObject = zipObject;\n lodash.zipObjectDeep = zipObjectDeep;\n lodash.zipWith = zipWith;\n\n // Add aliases.\n lodash.entries = toPairs;\n lodash.entriesIn = toPairsIn;\n lodash.extend = assignIn;\n lodash.extendWith = assignInWith;\n\n // Add methods to `lodash.prototype`.\n mixin(lodash, lodash);\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.add = add;\n lodash.attempt = attempt;\n lodash.camelCase = camelCase;\n lodash.capitalize = capitalize;\n lodash.ceil = ceil;\n lodash.clamp = clamp;\n lodash.clone = clone;\n lodash.cloneDeep = cloneDeep;\n lodash.cloneDeepWith = cloneDeepWith;\n lodash.cloneWith = cloneWith;\n lodash.conformsTo = conformsTo;\n lodash.deburr = deburr;\n lodash.defaultTo = defaultTo;\n lodash.divide = divide;\n lodash.endsWith = endsWith;\n lodash.eq = eq;\n lodash.escape = escape;\n lodash.escapeRegExp = escapeRegExp;\n lodash.every = every;\n lodash.find = find;\n lodash.findIndex = findIndex;\n lodash.findKey = findKey;\n lodash.findLast = findLast;\n lodash.findLastIndex = findLastIndex;\n lodash.findLastKey = findLastKey;\n lodash.floor = floor;\n lodash.forEach = forEach;\n lodash.forEachRight = forEachRight;\n lodash.forIn = forIn;\n lodash.forInRight = forInRight;\n lodash.forOwn = forOwn;\n lodash.forOwnRight = forOwnRight;\n lodash.get = get;\n lodash.gt = gt;\n lodash.gte = gte;\n lodash.has = has;\n lodash.hasIn = hasIn;\n lodash.head = head;\n lodash.identity = identity;\n lodash.includes = includes;\n lodash.indexOf = indexOf;\n lodash.inRange = inRange;\n lodash.invoke = invoke;\n lodash.isArguments = isArguments;\n lodash.isArray = isArray;\n lodash.isArrayBuffer = isArrayBuffer;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isBoolean = isBoolean;\n lodash.isBuffer = isBuffer;\n lodash.isDate = isDate;\n lodash.isElement = isElement;\n lodash.isEmpty = isEmpty;\n lodash.isEqual = isEqual;\n lodash.isEqualWith = isEqualWith;\n lodash.isError = isError;\n lodash.isFinite = isFinite;\n lodash.isFunction = isFunction;\n lodash.isInteger = isInteger;\n lodash.isLength = isLength;\n lodash.isMap = isMap;\n lodash.isMatch = isMatch;\n lodash.isMatchWith = isMatchWith;\n lodash.isNaN = isNaN;\n lodash.isNative = isNative;\n lodash.isNil = isNil;\n lodash.isNull = isNull;\n lodash.isNumber = isNumber;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isPlainObject = isPlainObject;\n lodash.isRegExp = isRegExp;\n lodash.isSafeInteger = isSafeInteger;\n lodash.isSet = isSet;\n lodash.isString = isString;\n lodash.isSymbol = isSymbol;\n lodash.isTypedArray = isTypedArray;\n lodash.isUndefined = isUndefined;\n lodash.isWeakMap = isWeakMap;\n lodash.isWeakSet = isWeakSet;\n lodash.join = join;\n lodash.kebabCase = kebabCase;\n lodash.last = last;\n lodash.lastIndexOf = lastIndexOf;\n lodash.lowerCase = lowerCase;\n lodash.lowerFirst = lowerFirst;\n lodash.lt = lt;\n lodash.lte = lte;\n lodash.max = max;\n lodash.maxBy = maxBy;\n lodash.mean = mean;\n lodash.meanBy = meanBy;\n lodash.min = min;\n lodash.minBy = minBy;\n lodash.stubArray = stubArray;\n lodash.stubFalse = stubFalse;\n lodash.stubObject = stubObject;\n lodash.stubString = stubString;\n lodash.stubTrue = stubTrue;\n lodash.multiply = multiply;\n lodash.nth = nth;\n lodash.noConflict = noConflict;\n lodash.noop = noop;\n lodash.now = now;\n lodash.pad = pad;\n lodash.padEnd = padEnd;\n lodash.padStart = padStart;\n lodash.parseInt = parseInt;\n lodash.random = random;\n lodash.reduce = reduce;\n lodash.reduceRight = reduceRight;\n lodash.repeat = repeat;\n lodash.replace = replace;\n lodash.result = result;\n lodash.round = round;\n lodash.runInContext = runInContext;\n lodash.sample = sample;\n lodash.size = size;\n lodash.snakeCase = snakeCase;\n lodash.some = some;\n lodash.sortedIndex = sortedIndex;\n lodash.sortedIndexBy = sortedIndexBy;\n lodash.sortedIndexOf = sortedIndexOf;\n lodash.sortedLastIndex = sortedLastIndex;\n lodash.sortedLastIndexBy = sortedLastIndexBy;\n lodash.sortedLastIndexOf = sortedLastIndexOf;\n lodash.startCase = startCase;\n lodash.startsWith = startsWith;\n lodash.subtract = subtract;\n lodash.sum = sum;\n lodash.sumBy = sumBy;\n lodash.template = template;\n lodash.times = times;\n lodash.toFinite = toFinite;\n lodash.toInteger = toInteger;\n lodash.toLength = toLength;\n lodash.toLower = toLower;\n lodash.toNumber = toNumber;\n lodash.toSafeInteger = toSafeInteger;\n lodash.toString = toString;\n lodash.toUpper = toUpper;\n lodash.trim = trim;\n lodash.trimEnd = trimEnd;\n lodash.trimStart = trimStart;\n lodash.truncate = truncate;\n lodash.unescape = unescape;\n lodash.uniqueId = uniqueId;\n lodash.upperCase = upperCase;\n lodash.upperFirst = upperFirst;\n\n // Add aliases.\n lodash.each = forEach;\n lodash.eachRight = forEachRight;\n lodash.first = head;\n\n mixin(lodash, (function() {\n var source = {};\n baseForOwn(lodash, function(func, methodName) {\n if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n source[methodName] = func;\n }\n });\n return source;\n }()), { 'chain': false });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n // Assign default placeholders.\n arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n lodash[methodName].placeholder = lodash;\n });\n\n // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n arrayEach(['drop', 'take'], function(methodName, index) {\n LazyWrapper.prototype[methodName] = function(n) {\n n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n var result = (this.__filtered__ && !index)\n ? new LazyWrapper(this)\n : this.clone();\n\n if (result.__filtered__) {\n result.__takeCount__ = nativeMin(n, result.__takeCount__);\n } else {\n result.__views__.push({\n 'size': nativeMin(n, MAX_ARRAY_LENGTH),\n 'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n });\n }\n return result;\n };\n\n LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n return this.reverse()[methodName](n).reverse();\n };\n });\n\n // Add `LazyWrapper` methods that accept an `iteratee` value.\n arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n var type = index + 1,\n isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n LazyWrapper.prototype[methodName] = function(iteratee) {\n var result = this.clone();\n result.__iteratees__.push({\n 'iteratee': getIteratee(iteratee, 3),\n 'type': type\n });\n result.__filtered__ = result.__filtered__ || isFilter;\n return result;\n };\n });\n\n // Add `LazyWrapper` methods for `_.head` and `_.last`.\n arrayEach(['head', 'last'], function(methodName, index) {\n var takeName = 'take' + (index ? 'Right' : '');\n\n LazyWrapper.prototype[methodName] = function() {\n return this[takeName](1).value()[0];\n };\n });\n\n // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n arrayEach(['initial', 'tail'], function(methodName, index) {\n var dropName = 'drop' + (index ? '' : 'Right');\n\n LazyWrapper.prototype[methodName] = function() {\n return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n };\n });\n\n LazyWrapper.prototype.compact = function() {\n return this.filter(identity);\n };\n\n LazyWrapper.prototype.find = function(predicate) {\n return this.filter(predicate).head();\n };\n\n LazyWrapper.prototype.findLast = function(predicate) {\n return this.reverse().find(predicate);\n };\n\n LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n if (typeof path == 'function') {\n return new LazyWrapper(this);\n }\n return this.map(function(value) {\n return baseInvoke(value, path, args);\n });\n });\n\n LazyWrapper.prototype.reject = function(predicate) {\n return this.filter(negate(getIteratee(predicate)));\n };\n\n LazyWrapper.prototype.slice = function(start, end) {\n start = toInteger(start);\n\n var result = this;\n if (result.__filtered__ && (start > 0 || end < 0)) {\n return new LazyWrapper(result);\n }\n if (start < 0) {\n result = result.takeRight(-start);\n } else if (start) {\n result = result.drop(start);\n }\n if (end !== undefined) {\n end = toInteger(end);\n result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n }\n return result;\n };\n\n LazyWrapper.prototype.takeRightWhile = function(predicate) {\n return this.reverse().takeWhile(predicate).reverse();\n };\n\n LazyWrapper.prototype.toArray = function() {\n return this.take(MAX_ARRAY_LENGTH);\n };\n\n // Add `LazyWrapper` methods to `lodash.prototype`.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n isTaker = /^(?:head|last)$/.test(methodName),\n lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n retUnwrapped = isTaker || /^find/.test(methodName);\n\n if (!lodashFunc) {\n return;\n }\n lodash.prototype[methodName] = function() {\n var value = this.__wrapped__,\n args = isTaker ? [1] : arguments,\n isLazy = value instanceof LazyWrapper,\n iteratee = args[0],\n useLazy = isLazy || isArray(value);\n\n var interceptor = function(value) {\n var result = lodashFunc.apply(lodash, arrayPush([value], args));\n return (isTaker && chainAll) ? result[0] : result;\n };\n\n if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n isLazy = useLazy = false;\n }\n var chainAll = this.__chain__,\n isHybrid = !!this.__actions__.length,\n isUnwrapped = retUnwrapped && !chainAll,\n onlyLazy = isLazy && !isHybrid;\n\n if (!retUnwrapped && useLazy) {\n value = onlyLazy ? value : new LazyWrapper(this);\n var result = func.apply(value, args);\n result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n return new LodashWrapper(result, chainAll);\n }\n if (isUnwrapped && onlyLazy) {\n return func.apply(this, args);\n }\n result = this.thru(interceptor);\n return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n };\n });\n\n // Add `Array` methods to `lodash.prototype`.\n arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n var func = arrayProto[methodName],\n chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n lodash.prototype[methodName] = function() {\n var args = arguments;\n if (retUnwrapped && !this.__chain__) {\n var value = this.value();\n return func.apply(isArray(value) ? value : [], args);\n }\n return this[chainName](function(value) {\n return func.apply(isArray(value) ? value : [], args);\n });\n };\n });\n\n // Map minified method names to their real names.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var lodashFunc = lodash[methodName];\n if (lodashFunc) {\n var key = lodashFunc.name + '';\n if (!hasOwnProperty.call(realNames, key)) {\n realNames[key] = [];\n }\n realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n }\n });\n\n realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n 'name': 'wrapper',\n 'func': undefined\n }];\n\n // Add methods to `LazyWrapper`.\n LazyWrapper.prototype.clone = lazyClone;\n LazyWrapper.prototype.reverse = lazyReverse;\n LazyWrapper.prototype.value = lazyValue;\n\n // Add chain sequence methods to the `lodash` wrapper.\n lodash.prototype.at = wrapperAt;\n lodash.prototype.chain = wrapperChain;\n lodash.prototype.commit = wrapperCommit;\n lodash.prototype.next = wrapperNext;\n lodash.prototype.plant = wrapperPlant;\n lodash.prototype.reverse = wrapperReverse;\n lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n // Add lazy aliases.\n lodash.prototype.first = lodash.prototype.head;\n\n if (symIterator) {\n lodash.prototype[symIterator] = wrapperToIterator;\n }\n return lodash;\n });\n\n /*--------------------------------------------------------------------------*/\n\n // Export lodash.\n var _ = runInContext();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = _;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return _;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = _)._ = _;\n // Export for CommonJS support.\n freeExports._ = _;\n }\n else {\n // Export to the global object.\n root._ = _;\n }\n}.call(this));\n","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","'use strict';\n\nvar _ = require('lodash');\nvar notificationHelpers = require('../common/notifications');\nvar geolocationHelper = require('../common/geolocation');\nvar stockInStoreHelper = require('../../stockinstore');\nconst { isEmpty } = require('lodash');\n\n/**\n * Load Nearest Store locator for the connected customer\n * @param {string} url Get-KML stores url\n */\nfunction loadNearestStoreLocator(url) {\n // Init Nearest Store locator\n const $submitShippingBtn = $('.submit-shipping');\n $submitShippingBtn.hide();\n geolocationHelper.getGeolocation(getCustomerCoordinatesFromAddress).then(function (coords) {\n if (!_.isEmpty(coords)) {\n $('#nearest-store-locator-container').storeLocator({\n lengthUnit: 'km',\n slideMap: false,\n defaultLoc: true,\n shouldReset: true,\n dataType: 'kml',\n dataLocation: url,\n defaultLat: coords.latitude,\n defaultLng: coords.longitude,\n KMLinfowindowTemplate: $('#location-info-window').html(),\n KMLlistTemplate: $('#location-list-description').html(),\n locationList: 'nearest-store-loc-list',\n mapID: 'nearest-store-map',\n ctaButton: '#submitShipmentBtn',\n processKmlLocationDataCallback: getKmlFileData,\n filterLocationsCallback: filterNearestStore,\n afterSuccessCallback: displayNearestStore,\n callbackNotify: function (message) {\n $('.error-messaging').empty();\n notificationHelpers.createErrorNotification(message);\n }\n });\n $submitShippingBtn.show();\n }\n }).finally(function () {\n $.spinner().stop();\n });\n}\n\n/**\n * Load Nearest Store locator for the connected customer\n * @param {string} url Get-KML stores url\n * @param {JQuery} templates store locator html templates\n */\nfunction loadAllNearestStores(url, templates) {\n // Init All Nearest Stores locator\n var storeListsTemplate = templates.find('.nearest-stores-lists').html();\n var infoWindowTemplate = templates.find('.store-info-window').html();\n\n geolocationHelper.getGeolocation(getCustomerCoordinatesFromAddress).then(function (coords) {\n if (!_.isEmpty(coords)) {\n $('.stores-locator-container').storeLocator({\n slideMap: false,\n defaultLoc: true,\n maxDistance: true,\n disableNativeListClick: true,\n shouldReset: true,\n findMylocationBtn: 'geolocate-btn',\n isNavigationGeolocationEnabled: coords.isNavigationGeolocEnabled,\n markerImg: $('#mapMarker').val(),\n markerDim: { width: 32, height: 32 },\n maxDistanceID: 'storeRadius',\n addressID: 'searchStores',\n formContainer: 'locate-stores-form-container',\n formID: 'locate-stores-form',\n lengthUnit: 'km',\n dataType: 'kml',\n dataLocation: url,\n defaultLat: coords.latitude,\n defaultLng: coords.longitude,\n locationList: 'all-stores-lists-container',\n mapID: 'stores-map',\n KMLlistTemplate: storeListsTemplate,\n KMLinfowindowTemplate: infoWindowTemplate,\n processKmlLocationDataCallback: getKmlFileData,\n afterSuccessCallback: selectAndFormatAllNearestStores,\n onInfoWindowLoadCallback: displayInfoWindowContent,\n callbackNotify: function (message) {\n $('.error-messaging').empty();\n notificationHelpers.createErrorNotification(message);\n }\n });\n }\n }).finally(function () {\n $.spinner().stop();\n });\n}\n\n/**\n *@returns {Object} latitude and longitude based on current user address\n */\nfunction getCustomerCoordinatesFromAddress() {\n var $customerAddress = $('#customerAddress');\n var customerInformations = $customerAddress.val() || '{}';\n var address = JSON.parse(customerInformations);\n // Checkout-Begin?stage=customer#customer and the user is not logged in yet\n if (isEmpty(address)) {\n var defaultLatitude = null;\n var defaultLongitude = null;\n\n if ($customerAddress.length) {\n defaultLatitude = $customerAddress.data('default-latitude');\n defaultLongitude = $customerAddress.data('default-longitude');\n } else {\n var $storeButton = $('.btn-change-store');\n\n if ($storeButton.length) {\n defaultLatitude = $storeButton.data('default-latitude');\n defaultLongitude = $storeButton.data('default-longitude');\n }\n }\n\n return new Promise(function (res) {\n return res({\n latitude: defaultLatitude,\n longitude: defaultLongitude\n });\n });\n }\n\n var fullAddress = address.address1 + ',' + address.postalCode + '/' + address.city;\n const geocoder = new google.maps.Geocoder();\n\n return new Promise(function (resolve) {\n geocoder.geocode({\n address: fullAddress\n },\n function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n var geoLocation = _.get(results[0], 'geometry.location', {});\n\n var coordinates = {\n latitude: geoLocation.lat(),\n longitude: geoLocation.lng(),\n isNavigationGeolocEnabled: false\n\n };\n\n return resolve(coordinates);\n }\n // TODO: default to displaying a message/display country or city depending on client output\n return {};\n });\n });\n}\n\n/**\n * return JSON data format of the kml file\n * @param {Element} placemark xml tag\n * @returns {Object} location data\n */\nfunction getKmlFileData(placemark) {\n var name = $(placemark).find('name').html();\n var storeID = $(placemark).find('[name=storeID]').children().html();\n var addressOne = $(placemark).find('[name=address1]').children().html();\n var addressTwo = $(placemark).find('[name=address2]').children().html();\n var zipCode = $(placemark).find('[name=postalCode]').children().html();\n var city = $(placemark).find('[name=city]').children().html();\n var openingHours = $(placemark).find('[name=storeHours]').children().html();\n var countryCode = $(placemark).find('[name=countryCode]').children().html();\n\n // availabilities\n var availableChildcare = $(placemark).find('[name=availableChildcare]').children().html();\n var availableMaternity = $(placemark).find('[name=availableMaternity]').children().html();\n var availableShoe = $(placemark).find('[name=availableShoe]').children().html();\n var availableTextile = $(placemark).find('[name=availableTextile]').children().html();\n var availableToy = $(placemark).find('[name=availableToy]').children().html();\n var kmlCoordinates = $(placemark).find('Point').children().html();\n var coordinates = (kmlCoordinates !== 'undefined' || !kmlCoordinates) ? kmlCoordinates : '';\n\n var location = {\n name: name,\n storeID: storeID,\n addressOne: addressOne,\n addressTwo: addressTwo,\n postalCode: zipCode,\n city: city,\n openingHours: openingHours,\n countryCode: countryCode,\n lng: Number(_.get(coordinates.split(','), '[0]', '')),\n lat: Number(_.get(coordinates.split(','), '[1]', '')),\n availabilities: {\n availableChildcare: availableChildcare,\n availableMaternity: availableMaternity,\n availableShoe: availableShoe,\n availableTextile: availableTextile,\n availableToy: availableToy\n }\n };\n\n return location;\n}\n\n/**\n *\n * @param {Array} stores a list of all stores\n * @returns {Array} the store with min distance value\n */\nfunction filterNearestStore(stores) {\n var nearestStore = stores.reduce(function (prev, curr) {\n return prev.distance < curr.distance ? prev : curr;\n });\n\n return [nearestStore];\n}\n\n/**\n * @param {Object} storeData array of stringified xml annonation of a given store\n * return nearest store for the connected customer\n */\nfunction displayNearestStore() {\n var nearestStoreTemplate = $('.single-shipping .nearest-store-loc-list');\n\n var storeData = {\n id: nearestStoreTemplate.find('#storeID').html(),\n name: nearestStoreTemplate.find('#name').html(),\n primaryAddress: nearestStoreTemplate.find('#addressOne').html(),\n secondaryAddress: nearestStoreTemplate.find('#addressTwo').html(),\n postalCode: nearestStoreTemplate.find('#zipCode').html(),\n city: nearestStoreTemplate.find('#city').html(),\n countryCode: nearestStoreTemplate.find('#countryCode').html(),\n openingHours: nearestStoreTemplate.find('#openingHours'),\n availabilities: {\n availableChildcare: nearestStoreTemplate.find('#availableChildcare').html(),\n availableMaternity: nearestStoreTemplate.find('#availableMaternity').html(),\n availableShoe: nearestStoreTemplate.find('#availableShoe').html(),\n availableTextile: nearestStoreTemplate.find('#availableTextile').html(),\n availableToy: nearestStoreTemplate.find('#availableToy').html()\n }\n };\n\n displaySelectedStore(storeData);\n\n $('.submit-shipping').show();\n $.spinner().stop();\n}\n\n/**\n * Display selected store in DOM\n * @param {Object} storeData store details\n */\nfunction displaySelectedStore(storeData) {\n var $inStores = $('.in-store-shipment');\n var currentStoreId = $('#currentStoreId').val();\n var currentProductId = $('#currentProductId').val();\n\n // Get stock via controller\n if (currentProductId && (currentStoreId !== 0 || currentStoreId === '')) {\n stockInStoreHelper.getStockInStore(storeData.id, currentProductId, storeData.url);\n } else {\n // Store Address\n $('.selected-store', $inStores).attr('data-id', storeData.id);\n $('.selected-store .name', $inStores).text(storeData.name);\n $('.selected-store .address-one', $inStores).text(storeData.primaryAddress);\n $('.selected-store .address-two', $inStores).text(storeData.secondaryAddress);\n $('.selected-store .zip-code', $inStores).text(storeData.postalCode);\n $('.selected-store .city', $inStores).text(storeData.city);\n $('.selected-store .city-code', $inStores).attr('data-country', storeData.countryCode);\n $('.selected-store .country-code', $inStores).text(storeData.countryCode);\n\n // Store Availability Icons\n var storesIcons = $('.in-store-icons', $inStores);\n $(storesIcons).empty();\n Object.keys(storeData.availabilities).forEach(function (key) {\n var icon = storeData.availabilities[key].trim();\n if (icon) {\n storesIcons.append('<img class=\"lazyload\" src=\"' + icon + '\" alt=\"' + [key] + '\" title=\"' + [key] + '\" />');\n }\n });\n\n // Opening hours\n var $openingHours = $('.opening-hours', $inStores);\n\n if (storeData.openingHours && storeData.openingHours.length > 0) {\n var openingHours = formatOpeningHours(storeData.openingHours);\n var groupByHours = _.groupBy(openingHours, 'hour');\n var openingHoursTemplate = '';\n var openingHoursFormatted = [];\n\n Object.keys(groupByHours).forEach(function (hour) {\n var days = groupByHours[hour].map(function (h) { return h.day; }).join(' ');\n openingHoursFormatted.push(days + ': ' + hour);\n });\n\n openingHoursTemplate += openingHoursFormatted.join('. ') + '.';\n $openingHours.removeClass('d-none');\n $openingHours.empty().html(openingHoursTemplate);\n } else {\n $openingHours.addClass('d-none');\n }\n }\n}\n\n/**\n * This function rounds distance, sets and displays selected store as shipment address\n * @param {Object} settings store locator plugin settings\n */\nfunction selectAndFormatAllNearestStores(settings) {\n // round distance for stores locations list\n var storeLocationsDistance = $('.store').find('.distance').toArray();\n displayFormattedDistance(storeLocationsDistance, settings);\n\n // select store when checking radio button\n $('.store input[type=\"radio\"]').on('change', function () {\n var $this = $(this);\n var $li = $this.closest('li');\n var $parent = $this.parent();\n\n var store = {\n id: $li.find('#storeID').html(),\n name: $li.find('.store-name')\n .html(),\n primaryAddress: $parent.find('.store-address-one').html(),\n secondaryAddress: $parent.find('.store-address-two').html(),\n postalCode: $li.find('#zipCode').html(),\n city: $li.find('#city').html(),\n countryCode: $li.find('#countryCode').html(),\n openingHours: $li.find('#backup-openingHours'),\n url: $(this).data('action'),\n availabilities: {\n availableChildcare: $li.find('#availableChildcare').html(),\n availableMaternity: $li.find('#availableMaternity').html(),\n availableShoe: $li.find('#availableShoe').html(),\n availableTextile: $li.find('#availableTextile').html(),\n availableToy: $li.find('#availableToy').html()\n }\n };\n $('#inStoreLocatorDrawer').modal('hide');\n displaySelectedStore(store);\n $('#shippingMethodRestrictionMessage').remove();\n });\n\n // select store when clicking on select in map info window description\n $('.modal-body').on('click', '.gm-style-iw-d .select-loc-btn', function (e) {\n e.preventDefault();\n var $mapWindowParent = $(this).closest('.map-window-store');\n\n var store = {\n id: $mapWindowParent.find('#storeID').html(),\n name: $mapWindowParent.find('.store-name')\n .html(),\n primaryAddress: $mapWindowParent.find('.store-address-one').html(),\n secondaryAddress: $mapWindowParent.find('.store-address-two').html(),\n postalCode: $mapWindowParent.find('#zipCode').html(),\n city: $mapWindowParent.find('#city').html(),\n countryCode: $mapWindowParent.find('#countryCode').html(),\n openingHours: $mapWindowParent.find('#backup-openingHours'),\n availabilities: {\n availableChildcare: $mapWindowParent.find('#availableChildcare').html(),\n availableMaternity: $mapWindowParent.find('#availableMaternity').html(),\n availableShoe: $mapWindowParent.find('#availableShoe').html(),\n availableTextile: $mapWindowParent.find('#availableTextile').html(),\n availableToy: $mapWindowParent.find('#availableToy').html()\n }\n };\n\n $('#inStoreLocatorDrawer').modal('hide');\n displaySelectedStore(store);\n });\n\n // format opening hours to \"[days that share same opening hours]: opening hours\" in stores list\n var openingHoursStoresList = $('ul .store').find('.store-opening-hours').toArray();\n showOpeningHours(openingHoursStoresList);\n\n $(document).on('hidden.bs.modal', '#inStoreLocatorDrawer', function () {\n $('.stores-list').empty();\n $('.stores-map').empty();\n });\n}\n\n/**\n * This function rounds distance, sets and displays selected store as shipment address\n * @param {Object} settings store locator plugin settings\n */\nfunction displayInfoWindowContent(settings) {\n // format opening hours to \"[days that share same opening hours]: opening hours\" in map\n var $infoWindow = $('.gm-style-iw-d');\n var openingHours = $infoWindow.find('.store-opening-hours').toArray();\n showOpeningHours(openingHours);\n\n // round distance for map info window\n var distance = $infoWindow.find('.distance').toArray();\n displayFormattedDistance(distance, settings);\n}\n\n/**\n * display formatted opening hours in dom\n * @param {jQuery} openingHours dom elements of opening hours of stores\n */\nfunction showOpeningHours(openingHours) {\n if (openingHours.length > 0) {\n openingHours.forEach(function (opening) {\n var $opening = $(opening);\n var parsedOpeningHours = formatOpeningHours($opening);\n var groupByHours = _.groupBy(parsedOpeningHours, 'hour');\n\n var openingHoursFormatted = [];\n Object.keys(groupByHours).forEach(function (hour) {\n var days = groupByHours[hour].map(function (h) { return h.day; }).join(' ');\n openingHoursFormatted.push(days + ': ' + hour);\n });\n\n $opening.empty().text(openingHoursFormatted.join('. ') + '.');\n });\n }\n}\n/**\n * display rounded distance in dom element\n * @param {jQuery} distance dom element of distance\n * @param {Object} settings jquery store locator plugin settings\n */\nfunction displayFormattedDistance(distance, settings) {\n distance.forEach(function (item) {\n var distanceInteger = Number($(item).html());\n var roundDistance = Math.round(distanceInteger);\n $(item).text(roundDistance + settings.lengthUnit);\n });\n}\n\n/**\n * Parse encoded HTML and return opening hours in JSON format\n * @param {JQuery} encodedHtmlOpeningHours opening hours jquery selector\n * @returns {Array} of objects of the opening hours in the following format {\"day\": \"opening hours\"}\n * */\nfunction formatOpeningHours(encodedHtmlOpeningHours) {\n // using textarea as a safe way to decode html https://stackoverflow.com/a/1395954\n var element = document.createElement('textarea');\n element.innerHTML = encodedHtmlOpeningHours.text();\n var storeHoursStr = element.value;\n var $storeHoursStr = $(storeHoursStr).html();\n\n if (!$storeHoursStr) {\n return [];\n }\n\n var formattedOpeningHours = {};\n\n var storeHoursArray = $storeHoursStr.split('.').filter(function (el) {\n return el !== '';\n });\n for (var index = 0; index < storeHoursArray.length; index += 1) {\n var workingDaysWithHours = storeHoursArray[index].split(':').filter(function (el) {\n return el !== '';\n });\n var days = workingDaysWithHours[0].split(' ').filter(function (el) {\n return el !== '';\n });\n\n if (workingDaysWithHours.length > 1) {\n for (var idx = 0; idx < days.length; idx += 1) {\n formattedOpeningHours[days[idx]] = workingDaysWithHours[1].replace(';', '').trim();\n }\n }\n }\n\n var openingHours = Object.keys(formattedOpeningHours).map(function (key) {\n return {\n day: key,\n hour: formattedOpeningHours[key]\n };\n });\n\n return openingHours;\n}\n\nmodule.exports = {\n methods: {\n loadNearestStoreLocator: loadNearestStoreLocator,\n loadAllNearestStores: loadAllNearestStores\n }\n};\n","'use strict';\n\nvar _ = require('lodash');\n\nvar currentPosition = null;\n\n/**\n* Determines if the current web application is running as a Progressive Web App (PWA).\n*\n* This function checks if the application is being displayed in standalone mode,\n* which is a common characteristic of PWAs. It utilizes the `window.matchMedia`\n* API to verify the display mode and also checks the `window.navigator.standalone`\n* property for compatibility with certain browsers.\n*\n* @returns {boolean} - Returns `true` if the application is running as a PWA in standalone mode,\n* otherwise returns `false`.\n*/\nfunction isPWA() {\n return (window.matchMedia && window.matchMedia('(display-mode: standalone)').matches)\n || window.navigator.standalone === true;\n}\n\n/**\n * gets latitude and longitudes from navigation geolocation is browser supports it and user consented to it.\n * Otherwise, it gets latitude and longitude based on full address of connected user\n * @param {Function} geolocationFallBack fallback function when navigation location isnt enabled\n * @returns {Promise} pending promise of current user location\n */\nfunction getGeolocation(geolocationFallBack) {\n // If you are in a PWA, use the fallback\n if (isPWA()) {\n return geolocationFallBack();\n }\n // If you're in a standard environment, continue with the geolocation API\n if (navigator.geolocation) {\n return new Promise(function (resolve) {\n if (currentPosition !== null && currentPosition.latitude && currentPosition.longitude) {\n resolve(currentPosition);\n } else {\n navigator.geolocation.getCurrentPosition(\n function (position) {\n var geometry = _.get(position, 'coords', {});\n var location = {\n latitude: geometry.latitude,\n longitude: geometry.longitude,\n isNavigationGeolocEnabled: true\n };\n currentPosition = location;\n resolve(location);\n },\n function () {\n // Use the fallback function for all geolocation errors\n resolve(geolocationFallBack());\n },\n { enableHighAccuracy: false, maximumAge: Infinity, timeout: 1500 }\n );\n }\n });\n }\n\n // Fallback for no defined geolocation: rely on customer postal code\n return geolocationFallBack();\n}\n\nmodule.exports = { getGeolocation: getGeolocation, isPWA: isPWA };\n","'use strict';\n\n/*! jQuery Google Maps Store Locator - v3.1.4 - 2021-06-06\n* http://www.bjornblog.com/web/jquery-store-locator-plugin\n* Copyright (c) 2021 Bjorn Holine; Licensed MIT */\n\n/**\n * This pluging is customised to add:\n * - ability to import the template by its path using the direct template rather than its path.\n * - process custom kml file success callback\n * - display custom UI after the store locator list and map are loaded\n * - disable store list native click function if disableNativeListClick is set to true\n * - reset store location if shouldReset is set to true\n * - add dom manipulations on google map info window load\n * - Find user current location and load stores/map if navigation geolocation is enabled\n */\n\n// eslint-disable-next-line no-shadow-restricted-names\n(function ($, window, document, undefined) {\n var pluginName = 'storeLocator';\n\n // Only allow for one instantiation of this script and make sure Google Maps API is included\n if (typeof $.fn[pluginName] !== 'undefined' || typeof google === 'undefined') {\n return;\n }\n\n // Variables used across multiple methods\n var $this; var map; var listTemplate; var infowindowTemplate; var dataTypeRead; var originalOrigin; var originalData; var originalZoom; var dataRequest; var searchInput; var addressInput; var olat; var olng; var storeNum; var directionsDisplay; var directionsService; var prevSelectedMarkerBefore; var prevSelectedMarkerAfter; var firstRun; var\n reload;\n var featuredset = []; var locationset = []; var normalset = []; var\n markers = [];\n var filters = {}; var locationData = {}; var GeoCodeCalc = {}; var\n mappingObj = {};\n\n // Create the defaults once. DO NOT change these settings in this file - settings should be overridden in the plugin call\n var defaults = {\n ajaxData: null,\n altDistanceNoResult: false,\n autoComplete: false,\n autoCompleteDisableListener: false,\n autoCompleteOptions: {},\n autoGeocode: false,\n bounceMarker: true,\n catMarkers: null,\n dataLocation: 'data/locations.json',\n dataRaw: null,\n dataType: 'json',\n debug: false,\n defaultLat: null,\n defaultLng: null,\n defaultLoc: false,\n disableAlphaMarkers: false,\n distanceAlert: 200,\n dragSearch: false,\n exclusiveFiltering: false,\n exclusiveTax: null,\n featuredDistance: null,\n featuredLocations: false,\n fullMapStart: false,\n fullMapStartBlank: false,\n fullMapStartListLimit: false,\n infoBubble: null,\n inlineDirections: false,\n lengthUnit: 'm',\n listColor1: '#ffffff',\n listColor2: '#eeeeee',\n loading: false,\n locationsPerPage: 10,\n mapSettings: {\n mapTypeId: google.maps.MapTypeId.ROADMAP,\n zoom: 12\n },\n markerCluster: null,\n markerImg: null,\n markerDim: null,\n maxDistance: false,\n modal: false,\n nameAttribute: 'name',\n nameSearch: false,\n noForm: false,\n openNearest: false,\n originMarker: false,\n originMarkerDim: null,\n originMarkerImg: null,\n pagination: false,\n querystringParams: false,\n selectedMarkerImg: null,\n selectedMarkerImgDim: null,\n sessionStorage: false,\n slideMap: true,\n sortBy: null,\n storeLimit: 26,\n taxonomyFilters: null,\n visibleMarkersList: false,\n xmlElement: 'marker',\n // HTML elements\n addressID: 'bh-sl-address',\n closeIcon: 'bh-sl-close-icon',\n formContainer: 'bh-sl-form-container',\n formID: 'bh-sl-user-location',\n geocodeID: null,\n lengthSwapID: 'bh-sl-length-swap',\n loadingContainer: 'bh-sl-loading',\n locationList: 'bh-sl-loc-list',\n mapID: 'bh-sl-map',\n maxDistanceID: 'bh-sl-maxdistance',\n modalContent: 'bh-sl-modal-content',\n modalWindow: 'bh-sl-modal-window',\n orderID: 'bh-sl-order',\n overlay: 'bh-sl-overlay',\n regionID: 'bh-sl-region',\n searchID: 'bh-sl-search',\n sortID: 'bh-sl-sort',\n ctaButton: '',\n taxonomyFiltersContainer: 'bh-sl-filters-container',\n // Templates\n infowindowTemplatePath: '',\n listTemplatePath: '',\n KMLinfowindowTemplate: '',\n KMLlistTemplate: '',\n listTemplateID: null,\n infowindowTemplateID: null,\n // Callbacks\n callbackAutoGeoSuccess: null,\n callbackBeforeSend: null,\n callbackCloseDirections: null,\n callbackCreateMarker: null,\n callbackDirectionsRequest: null,\n callbackFilters: null,\n callbackFormVals: null,\n callbackGeocodeRestrictions: null,\n callbackJsonp: null,\n callbackListClick: null,\n callbackMapSet: null,\n callbackMarkerClick: null,\n callbackModalClose: null,\n callbackModalOpen: null,\n callbackModalReady: null,\n callbackNearestLoc: null,\n callbackNoResults: null,\n callbackNotify: null,\n callbackOrder: null,\n callbackPageChange: null,\n callbackRegion: null,\n callbackSorting: null,\n callbackSuccess: null,\n // Add custom settings propriety to this project needs\n processKmlLocationDataCallback: null,\n filterLocationsCallback: null,\n afterSuccessCallback: null,\n onInfoWindowLoadCallback: null,\n shouldReset: false,\n disableNativeListClick: false,\n findMylocationBtn: null,\n isNavigationGeolocationEnabled: false,\n // Language options\n addressErrorAlert: 'Unable to find address',\n autoGeocodeErrorAlert: 'Automatic location detection failed. Please fill in your address or zip code.',\n distanceErrorAlert: 'Unfortunately, our closest location is more than ',\n kilometerLang: 'kilometer',\n kilometersLang: 'kilometers',\n mileLang: 'mile',\n milesLang: 'miles',\n noResultsTitle: 'No results',\n noResultsDesc: 'No locations were found with the given criteria. Please modify your selections or input.',\n nextPage: 'Next »',\n prevPage: '« Prev'\n };\n\n // Plugin constructor\n function Plugin(element, options) {\n $this = $(element);\n this.element = element;\n this.settings = $.extend({}, defaults, options);\n this._defaults = defaults;\n this._name = pluginName;\n this.init();\n }\n\n // Avoid Plugin.prototype conflicts\n $.extend(Plugin.prototype, {\n\n /**\n\t\t * Init function\n\t\t */\n init: function () {\n var _this = this;\n this.writeDebug('init');\n // Calculate geocode distance functions\n if (this.settings.lengthUnit === 'km') {\n // Kilometers\n GeoCodeCalc.EarthRadius = 6367.0;\n } else {\n // Default is miles\n GeoCodeCalc.EarthRadius = 3956.0;\n }\n\n // KML is read as XML\n if (this.settings.dataType === 'kml') {\n dataTypeRead = 'xml';\n } else {\n dataTypeRead = this.settings.dataType;\n }\n\n // Add directions panel if enabled\n if (this.settings.inlineDirections === true) {\n $('.' + this.settings.locationList).prepend('<div class=\"bh-sl-directions-panel\"></div>');\n }\n\n // Save the original zoom setting so it can be retrieved if taxonomy filtering resets it\n originalZoom = this.settings.mapSettings.zoom;\n\n // Add Handlebars helper for handling URL output\n Handlebars.registerHelper('niceURL', function (url) {\n if (url) {\n return url.replace('https://', '').replace('http://', '');\n }\n });\n\n // Do taxonomy filtering if set\n if (this.settings.taxonomyFilters !== null) {\n this.taxonomyFiltering();\n }\n\n // Do sorting and ordering if set.\n this.sorting();\n this.order();\n\n // Add modal window divs if set\n if (this.settings.modal === true) {\n // Clone the filters if there are any so they can be used in the modal\n if (this.settings.taxonomyFilters !== null) {\n // Clone the filters\n $('.' + this.settings.taxonomyFiltersContainer).clone(true, true).prependTo($this);\n }\n\n $this.wrap('<div class=\"' + this.settings.overlay + '\"><div class=\"' + this.settings.modalWindow + '\"><div class=\"' + this.settings.modalContent + '\">');\n $('.' + this.settings.modalWindow).prepend('<div class=\"' + this.settings.closeIcon + '\"></div>');\n $('.' + this.settings.overlay).hide();\n }\n\n // Set up Google Places autocomplete if it's set to true\n if (this.settings.autoComplete === true) {\n var searchInput = document.getElementById(this.settings.addressID);\n var autoPlaces = new google.maps.places.Autocomplete(searchInput, this.settings.autoCompleteOptions);\n\n // Add listener when autoComplete selection changes.\n if (this.settings.autoComplete === true && this.settings.autoCompleteDisableListener !== true) {\n autoPlaces.addListener('place_changed', function (e) {\n _this.processForm(e);\n });\n }\n }\n\n // Load the templates and continue from there\n this._loadTemplates();\n },\n\n /**\n\t\t * Destroy\n\t\t * Note: The Google map is not destroyed here because Google recommends using a single instance and reusing it\n\t\t * (it's not really supported)\n\t\t */\n destroy: function () {\n this.writeDebug('destroy');\n // Reset\n this.reset();\n var $mapDiv = $('#' + this.settings.mapID);\n\n // Remove marker event listeners\n if (markers.length) {\n for (var i = 0; i <= markers.length; i++) {\n google.maps.event.removeListener(markers[i]);\n }\n }\n\n // Remove markup\n $('.' + this.settings.locationList + ' ul').empty();\n if ($mapDiv.hasClass('bh-sl-map-open')) {\n $mapDiv.empty().removeClass('bh-sl-map-open');\n }\n\n // Remove modal markup\n if (this.settings.modal === true) {\n $('. ' + this.settings.overlay).remove();\n }\n\n // Remove map style from container\n $mapDiv.attr('style', '');\n\n // Hide map container\n $this.hide();\n // Remove data\n $.removeData($this.get(0));\n // Remove namespaced events\n $(document).off(pluginName);\n // Unbind plugin\n $this.unbind();\n },\n\n /**\n\t\t * Reset function\n\t\t * This method clears out all the variables and removes events. It does not reload the map.\n\t\t */\n reset: function () {\n this.writeDebug('reset');\n locationset = [];\n featuredset = [];\n normalset = [];\n markers = [];\n firstRun = false;\n $(document).off('click.' + pluginName, '.' + this.settings.locationList + ' li');\n\n if ($('.' + this.settings.locationList + ' .bh-sl-close-directions-container').length) {\n $('.bh-sl-close-directions-container').remove();\n }\n\n if (this.settings.inlineDirections === true) {\n // Remove directions panel if it's there\n var $adp = $('.' + this.settings.locationList + ' .adp');\n if ($adp.length > 0) {\n $adp.remove();\n $('.' + this.settings.locationList + ' ul').fadeIn();\n }\n $(document).off('click', '.' + this.settings.locationList + ' li .loc-directions a');\n }\n\n if (this.settings.pagination === true) {\n $(document).off('click.' + pluginName, '.bh-sl-pagination li');\n }\n },\n\n /**\n\t\t * Reset the form filters\n\t\t */\n formFiltersReset: function () {\n this.writeDebug('formFiltersReset');\n if (this.settings.taxonomyFilters === null) {\n return;\n }\n\n var $inputs = $('.' + this.settings.taxonomyFiltersContainer + ' input');\n var $selects = $('.' + this.settings.taxonomyFiltersContainer + ' select');\n\n if (typeof ($inputs) !== 'object') {\n return;\n }\n\n // Loop over the input fields\n $inputs.each(function () {\n if ($(this).is('input[type=\"checkbox\"]') || $(this).is('input[type=\"radio\"]')) {\n $(this).prop('checked', false);\n }\n });\n\n // Loop over select fields\n $selects.each(function () {\n $(this).prop('selectedIndex', 0);\n });\n },\n\n /**\n\t\t * Reload everything\n\t\t * This method does a reset of everything and reloads the map as it would first appear.\n\t\t */\n mapReload: function () {\n this.writeDebug('mapReload');\n this.reset();\n reload = true;\n\n if (this.settings.taxonomyFilters !== null) {\n this.formFiltersReset();\n this.taxonomyFiltersInit();\n }\n\n if ((olat) && (olng)) {\n this.settings.mapSettings.zoom = originalZoom;\n this.processForm();\n } else {\n this.mapping(mappingObj);\n }\n },\n\n /**\n\t\t * Notifications\n\t\t * Some errors use alert by default. This is overridable with the callbackNotify option\n\t\t *\n\t\t * @param notifyText {string} the notification message\n\t\t */\n notify: function (notifyText) {\n this.writeDebug('notify', notifyText);\n if (this.settings.callbackNotify) {\n this.settings.callbackNotify.call(this, notifyText);\n } else {\n alert(notifyText);\n }\n },\n\n /**\n\t\t * Distance calculations\n\t\t */\n geoCodeCalcToRadian: function (v) {\n this.writeDebug('geoCodeCalcToRadian', v);\n return v * (Math.PI / 180);\n },\n geoCodeCalcDiffRadian: function (v1, v2) {\n this.writeDebug('geoCodeCalcDiffRadian', arguments);\n return this.geoCodeCalcToRadian(v2) - this.geoCodeCalcToRadian(v1);\n },\n geoCodeCalcCalcDistance: function (lat1, lng1, lat2, lng2, radius) {\n this.writeDebug('geoCodeCalcCalcDistance', arguments);\n return radius * 2 * Math.asin(Math.min(1, Math.sqrt((Math.pow(Math.sin((this.geoCodeCalcDiffRadian(lat1, lat2)) / 2.0), 2.0) + Math.cos(this.geoCodeCalcToRadian(lat1)) * Math.cos(this.geoCodeCalcToRadian(lat2)) * Math.pow(Math.sin((this.geoCodeCalcDiffRadian(lng1, lng2)) / 2.0), 2.0)))));\n },\n\n /**\n\t\t * Check for query string\n\t\t *\n\t\t * @param param {string} query string parameter to test\n\t\t *\n\t\t * @returns {string} query string value\n\t\t */\n getQueryString: function (param) {\n this.writeDebug('getQueryString', param);\n if (param) {\n param = param.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n var regex = new RegExp('[\\\\?&]' + param + '=([^&#]*)');\n var results = regex.exec(location.search);\n return (results === null) ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n }\n },\n\n /**\n\t\t * Get google.maps.Map instance\n\t\t *\n\t\t * @returns {Object} google.maps.Map instance\n\t\t */\n getMap: function () {\n return this.map;\n },\n\n /**\n\t\t * Load templates via Handlebars templates in /templates or inline via IDs - private\n\t\t */\n _loadTemplates: function () {\n this.writeDebug('_loadTemplates');\n var source;\n var _this = this;\n var templateError = '<div class=\"bh-sl-error\">Error: Could not load plugin templates. Check the paths and ensure they have been uploaded. Paths will be wrong if you do not run this from a web server.</div>';\n // Get the KML templates\n if (this.settings.dataType === 'kml' && this.settings.listTemplateID === null && this.settings.infowindowTemplateID === null) {\n // Try loading the external template files\n $.when(\n // KML infowindows\n infowindowTemplate = Handlebars.compile(this.settings.KMLinfowindowTemplate),\n // KML locations list\n listTemplate = Handlebars.compile(this.settings.KMLlistTemplate)\n ).then(function () {\n // Continue to the main script if templates are loaded successfully\n _this.locator();\n }, function () {\n // KML templates not loaded\n $('.' + _this.settings.formContainer).append(templateError);\n throw new Error('Could not load storeLocator plugin templates');\n });\n }\n // Handle script tag template method\n else if (this.settings.listTemplateID !== null && this.settings.infowindowTemplateID !== null) {\n // Infowindows\n infowindowTemplate = Handlebars.compile($('#' + this.settings.infowindowTemplateID).html());\n\n // Locations list\n listTemplate = Handlebars.compile($('#' + this.settings.listTemplateID).html());\n\n // Continue to the main script\n _this.locator();\n }\n // Get the JSON/XML templates\n else {\n // Try loading the external template files\n $.when(\n // Infowindows\n $.get(this.settings.infowindowTemplatePath, function (template) {\n source = template;\n infowindowTemplate = Handlebars.compile(source);\n }),\n\n // Locations list\n $.get(this.settings.listTemplatePath, function (template) {\n source = template;\n listTemplate = Handlebars.compile(source);\n })\n ).then(function () {\n // Continue to the main script if templates are loaded successfully\n _this.locator();\n }, function () {\n // JSON/XML templates not loaded\n $('.' + _this.settings.formContainer).append(templateError);\n throw new Error('Could not load storeLocator plugin templates');\n });\n }\n },\n\n /**\n\t\t * Primary locator function runs after the templates are loaded\n\t\t */\n locator: function () {\n this.writeDebug('locator');\n if (this.settings.slideMap === true) {\n // Let's hide the map container to begin\n $this.hide();\n }\n\n this._start();\n this._formEventHandler();\n },\n\n /**\n\t\t * Form event handler setup - private\n\t\t */\n _formEventHandler: function () {\n this.writeDebug('_formEventHandler');\n var _this = this;\n // ASP.net or regular submission?\n if (this.settings.noForm === true) {\n $(document).on('click.' + pluginName, '.' + this.settings.formContainer + ' button', function (e) {\n _this.processForm(e);\n });\n $(document).on('keydown.' + pluginName, function (e) {\n if (e.keyCode === 13 && $('#' + _this.settings.addressID).is(':focus')) {\n _this.processForm(e);\n }\n });\n } else {\n $(document).on('submit.' + pluginName, '#' + this.settings.formID, function (e) {\n _this.processForm(e);\n });\n }\n\n // find my location\n var $findMylocationBtn = $('.' + _this.settings.findMylocationBtn);\n\n if ($findMylocationBtn.length) {\n $($findMylocationBtn).on('click', function (e) {\n _this.findMyLocation(e);\n });\n }\n\n // Reset button trigger\n if ($('.bh-sl-reset').length && $('#' + this.settings.mapID).length) {\n $(document).on('click.' + pluginName, '.bh-sl-reset', function () {\n _this.mapReload();\n });\n }\n },\n\n /**\n\t\t * AJAX data request - private\n\t\t *\n\t\t * @param lat {number} latitude\n\t\t * @param lng {number} longitude\n\t\t * @param address {string} street address\n\t\t * @param geocodeData {object} full Google geocode results object\n\t\t * @param map (object} Google Maps object.\n\t\t *\n\t\t * @returns {Object} deferred object\n\t\t */\n _getData: function (lat, lng, address, geocodeData, map) {\n this.writeDebug('_getData', arguments);\n var _this = this;\n var northEast = '';\n var southWest = '';\n var formattedAddress = '';\n\n // Define extra geocode result info\n if (typeof geocodeData !== 'undefined' && typeof geocodeData.geometry.bounds !== 'undefined') {\n formattedAddress = geocodeData.formatted_address;\n northEast = JSON.stringify(geocodeData.geometry.bounds.getNorthEast());\n southWest = JSON.stringify(geocodeData.geometry.bounds.getSouthWest());\n }\n\n // Before send callback\n if (this.settings.callbackBeforeSend) {\n this.settings.callbackBeforeSend.call(this, lat, lng, address, formattedAddress, northEast, southWest, map);\n }\n\n // Raw data\n if (_this.settings.dataRaw !== null) {\n // XML\n if (dataTypeRead === 'xml') {\n return $.parseXML(_this.settings.dataRaw);\n }\n\n // JSON\n if (dataTypeRead === 'json') {\n if (Array.isArray && Array.isArray(_this.settings.dataRaw)) {\n return _this.settings.dataRaw;\n }\n if (typeof _this.settings.dataRaw === 'string') {\n return JSON.parse(_this.settings.dataRaw);\n }\n\n return [];\n }\n }\n // Remote data\n else {\n var d = $.Deferred();\n\n // Loading\n if (this.settings.loading === true) {\n $('.' + this.settings.formContainer).append('<div class=\"' + this.settings.loadingContainer + '\"></div>');\n }\n\n // Data to pass with the AJAX request\n var ajaxData = {\n origLat: lat,\n origLng: lng,\n origAddress: address,\n formattedAddress: formattedAddress,\n boundsNorthEast: northEast,\n boundsSouthWest: southWest\n };\n\n // Set up extra object for custom extra data to be passed with the AJAX request\n if (this.settings.ajaxData !== null && typeof this.settings.ajaxData === 'object') {\n $.extend(ajaxData, this.settings.ajaxData);\n }\n // Hide CTA button\n if (this.settings.ctaButton) {\n $(this.settings.ctaButton).hide();\n }\n // AJAX request\n $.ajax({\n type: 'GET',\n url: this.settings.dataLocation + (this.settings.dataType === 'jsonp' ? (this.settings.dataLocation.match(/\\?/) ? '&' : '?') + 'callback=?' : ''),\n // Passing the lat, lng, address, formatted address and bounds with the AJAX request so they can optionally be used by back-end languages\n data: ajaxData,\n dataType: dataTypeRead,\n jsonpCallback: (this.settings.dataType === 'jsonp' ? this.settings.callbackJsonp : null)\n }).done(function (p) {\n d.resolve(p);\n\n // Loading remove\n if (_this.settings.loading === true) {\n $('.' + _this.settings.formContainer + ' .' + _this.settings.loadingContainer).remove();\n }\n }).fail(d.reject);\n return d.promise();\n }\n },\n\n /**\n\t\t * Checks for default location, full map, and HTML5 geolocation settings - private\n\t\t */\n _start: function () {\n this.writeDebug('_start');\n var _this = this;\n var doAutoGeo = this.settings.autoGeocode;\n var latlng;\n\n // Full map blank start\n if (_this.settings.fullMapStartBlank !== false) {\n var $mapDiv = $('#' + _this.settings.mapID);\n $mapDiv.addClass('bh-sl-map-open');\n var myOptions = _this.settings.mapSettings;\n myOptions.zoom = _this.settings.fullMapStartBlank;\n\n latlng = new google.maps.LatLng(this.settings.defaultLat, this.settings.defaultLng);\n myOptions.center = latlng;\n\n // Create the map\n _this.map = new google.maps.Map(document.getElementById(_this.settings.mapID), myOptions);\n\n // Re-center the map when the browser is re-sized\n google.maps.event.addDomListener(window, 'resize', function () {\n var center = _this.map.getCenter();\n google.maps.event.trigger(_this.map, 'resize');\n _this.map.setCenter(center);\n });\n\n // Only do this once\n _this.settings.fullMapStartBlank = false;\n myOptions.zoom = originalZoom;\n } else {\n // If a default location is set\n if (this.settings.defaultLoc === true) {\n this.defaultLocation();\n }\n\n // If there is already have a value in the address bar\n if ($.trim($('#' + this.settings.addressID).val()) !== '') {\n _this.writeDebug('Using Address Field');\n _this.processForm(null);\n doAutoGeo = false; // No need for additional processing\n }\n // If show full map option is true\n else if (this.settings.fullMapStart === true) {\n if ((this.settings.querystringParams === true && this.getQueryString(this.settings.addressID)) || (this.settings.querystringParams === true && this.getQueryString(this.settings.searchID)) || (this.settings.querystringParams === true && this.getQueryString(this.settings.maxDistanceID))) {\n _this.writeDebug('Using Query String');\n this.processForm(null);\n doAutoGeo = false; // No need for additional processing\n } else {\n this.mapping(null);\n }\n }\n }\n\n // HTML5 auto geolocation API option\n if (this.settings.autoGeocode === true && doAutoGeo === true) {\n _this.writeDebug('Auto Geo');\n\n _this.htmlGeocode();\n }\n\n // HTML5 geolocation API button option\n if (this.settings.autoGeocode !== null) {\n _this.writeDebug('Button Geo');\n\n $(document).on('click.' + pluginName, '#' + this.settings.geocodeID, function () {\n _this.htmlGeocode();\n });\n }\n },\n\n /**\n\t\t * Geocode function used for auto geocode setting and geocodeID button\n\t\t */\n htmlGeocode: function () {\n this.writeDebug('htmlGeocode', arguments);\n var _this = this;\n\n if (_this.settings.sessionStorage === true && window.sessionStorage && window.sessionStorage.getItem('myGeo')) {\n _this.writeDebug('Using Session Saved Values for GEO');\n _this.autoGeocodeQuery(JSON.parse(window.sessionStorage.getItem('myGeo')));\n return false;\n }\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function (position) {\n _this.writeDebug('Current Position Result');\n // To not break autoGeocodeQuery then we create the obj to match the geolocation format\n var pos = {\n coords: {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy\n }\n };\n\n // Have to do this to get around scope issues\n if (_this.settings.sessionStorage === true && window.sessionStorage) {\n window.sessionStorage.setItem('myGeo', JSON.stringify(pos));\n }\n\n // Callback\n if (_this.settings.callbackAutoGeoSuccess) {\n _this.settings.callbackAutoGeoSuccess.call(this, pos);\n }\n\n _this.autoGeocodeQuery(pos);\n }, function (error) {\n _this._autoGeocodeError(error);\n });\n }\n },\n\n /**\n\t\t * Geocode function used to geocode the origin (entered location)\n\t\t */\n googleGeocode: function (thisObj) {\n thisObj.writeDebug('googleGeocode', arguments);\n var geocoder = new google.maps.Geocoder();\n this.geocode = function (request, callbackFunction) {\n geocoder.geocode(request, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n var result = {};\n result.latitude = results[0].geometry.location.lat();\n result.longitude = results[0].geometry.location.lng();\n result.geocodeResult = results[0];\n\n sessionStorage.setItem('geocoder-result', JSON.stringify({\n address: result.geocodeResult.formatted_address,\n fullResult: result.geocodeResult\n }));\n\n callbackFunction(result);\n } else {\n callbackFunction(null);\n throw new Error('Geocode was not successful for the following reason: ' + status);\n }\n });\n };\n },\n\n /**\n\t\t * Reverse geocode to get address for automatic options needed for directions link\n\t\t */\n reverseGoogleGeocode: function (thisObj) {\n thisObj.writeDebug('reverseGoogleGeocode', arguments);\n var geocoder = new google.maps.Geocoder();\n this.geocode = function (request, callbackFunction) {\n var locResult = sessionStorage.getItem('geocoder-result');\n\n if (locResult) {\n callbackFunction(JSON.parse(locResult));\n } else {\n geocoder.geocode(request, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n if (results[0]) {\n var result = {};\n result.address = results[0].formatted_address;\n result.fullResult = results[0];\n sessionStorage.setItem('geocoder-result', JSON.stringify(result));\n callbackFunction(result);\n }\n } else {\n callbackFunction(null);\n throw new Error('Reverse geocode was not successful for the following reason: ' + status);\n }\n });\n }\n };\n },\n\n /**\n\t\t * Rounding function used for distances\n\t\t *\n\t\t * @param num {number} the full number\n\t\t * @param dec {number} the number of digits to show after the decimal\n\t\t *\n\t\t * @returns {number}\n\t\t */\n roundNumber: function (num, dec) {\n this.writeDebug('roundNumber', arguments);\n return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);\n },\n\n /**\n\t\t * Checks to see if the object is empty. Using this instead of $.isEmptyObject for legacy browser support\n\t\t *\n\t\t * @param obj {Object} the object to check\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n isEmptyObject: function (obj) {\n this.writeDebug('isEmptyObject', arguments);\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n\t\t * Checks to see if all the property values in the object are empty\n\t\t *\n\t\t * @param obj {Object} the object to check\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n hasEmptyObjectVals: function (obj) {\n this.writeDebug('hasEmptyObjectVals', arguments);\n var objTest = true;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (obj[key] !== '' && obj[key].length !== 0) {\n objTest = false;\n }\n }\n }\n\n return objTest;\n },\n\n /**\n\t\t * Modal window close function\n\t\t */\n modalClose: function () {\n this.writeDebug('modalClose');\n // Callback\n if (this.settings.callbackModalClose) {\n this.settings.callbackModalClose.call(this);\n }\n\n // Reset the filters\n filters = {};\n\n // Undo category selections\n $('.' + this.settings.overlay + ' select').prop('selectedIndex', 0);\n $('.' + this.settings.overlay + ' input').prop('checked', false);\n\n // Hide the modal\n $('.' + this.settings.overlay).hide();\n },\n\n /**\n\t\t * Create the location variables - private\n\t\t *\n\t\t * @param loopcount {number} current marker id\n\t\t */\n _createLocationVariables: function (loopcount) {\n this.writeDebug('_createLocationVariables', arguments);\n var value;\n locationData = {};\n\n for (var key in locationset[loopcount]) {\n if (locationset[loopcount].hasOwnProperty(key)) {\n value = locationset[loopcount][key];\n\n if (key === 'distance' || key === 'altdistance') {\n value = this.roundNumber(value, 2);\n }\n\n locationData[key] = value;\n }\n }\n },\n\n /**\n\t\t * Location alphabetical sorting function\n\t\t *\n\t\t * @param locationsarray {array} locationset array\n\t\t */\n sortAlpha: function (locationsarray) {\n this.writeDebug('sortAlpha', arguments);\n var property = (this.settings.sortBy.hasOwnProperty('prop') && typeof this.settings.sortBy.prop !== 'undefined') ? this.settings.sortBy.prop : 'name';\n\n if (this.settings.sortBy.hasOwnProperty('order') && this.settings.sortBy.order.toString() === 'desc') {\n locationsarray.sort(function (a, b) {\n return b[property].toLowerCase().localeCompare(a[property].toLowerCase());\n });\n } else {\n locationsarray.sort(function (a, b) {\n return a[property].toLowerCase().localeCompare(b[property].toLowerCase());\n });\n }\n },\n\n /**\n\t\t * Location date sorting function\n\t\t *\n\t\t * @param locationsarray {array} locationset array\n\t\t */\n sortDate: function (locationsarray) {\n this.writeDebug('sortDate', arguments);\n var property = (this.settings.sortBy.hasOwnProperty('prop') && typeof this.settings.sortBy.prop !== 'undefined') ? this.settings.sortBy.prop : 'date';\n\n if (this.settings.sortBy.hasOwnProperty('order') && this.settings.sortBy.order.toString() === 'desc') {\n locationsarray.sort(function (a, b) {\n return new Date(b[property]).getTime() - new Date(a[property]).getTime();\n });\n } else {\n locationsarray.sort(function (a, b) {\n return new Date(a[property]).getTime() - new Date(b[property]).getTime();\n });\n }\n },\n\n /**\n\t\t * Location distance sorting function\n\t\t *\n\t\t * @param locationsarray {array} locationset array\n\t\t */\n sortNumerically: function (locationsarray) {\n this.writeDebug('sortNumerically', arguments);\n var property = (\n this.settings.sortBy !== null\n\t\t\t\t&& this.settings.sortBy.hasOwnProperty('prop')\n\t\t\t\t&& typeof this.settings.sortBy.prop !== 'undefined'\n ) ? this.settings.sortBy.prop : 'distance';\n\n if (this.settings.sortBy !== null && this.settings.sortBy.hasOwnProperty('order') && this.settings.sortBy.order.toString() === 'desc') {\n locationsarray.sort(function (a, b) {\n return ((b[property] < a[property]) ? -1 : ((b[property] > a[property]) ? 1 : 0));\n });\n } else {\n locationsarray.sort(function (a, b) {\n return ((a[property] < b[property]) ? -1 : ((a[property] > b[property]) ? 1 : 0));\n });\n }\n },\n\n /**\n\t\t * Alternative sorting setup\n\t\t *\n\t\t * @param locationsarray {array} locationset array\n\t\t */\n sortCustom: function (locationsarray) {\n this.writeDebug('sortCustom', arguments);\n\n // Alphabetically, date, or numeric\n if (this.settings.sortBy.hasOwnProperty('method') && this.settings.sortBy.method.toString() === 'alpha') {\n this.sortAlpha(locationsarray);\n } else if (this.settings.sortBy.hasOwnProperty('method') && this.settings.sortBy.method.toString() === 'date') {\n this.sortDate(locationsarray);\n } else {\n this.sortNumerically(locationsarray);\n }\n },\n\n /**\n\t\t * Run the matching between regular expression filters and string value\n\t\t *\n\t\t * @param filter {array} One or multiple filters to apply\n\t\t * @param val {string} Value to compare\n\t\t * @param inclusive {boolean} Inclusive (default) or exclusive\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n filterMatching: function (filter, val, inclusive) {\n this.writeDebug('inclusiveFilter', arguments);\n inclusive = (typeof inclusive !== 'undefined') ? inclusive : true;\n var applyFilters;\n\n // Undefined check.\n if (typeof val === 'undefined') {\n return false;\n }\n\n // Modify the join depending on inclusive (AND) vs exclusive (OR).\n if (inclusive === true) {\n applyFilters = filter.join('');\n } else {\n applyFilters = filter.join('|');\n }\n\n if ((new RegExp(applyFilters, 'i').test(val.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\]|&\\s+)/g, '')))) {\n return true;\n }\n\n return false;\n },\n\n /**\n\t\t * Filter the data with Regex\n\t\t *\n\t\t * @param data {array} data array to check for filter values\n\t\t * @param filters {Object} taxonomy filters object\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n filterData: function (data, filters) {\n this.writeDebug('filterData', arguments);\n var filterTest = true;\n\n for (var k in filters) {\n if (filters.hasOwnProperty(k)) {\n var testResults = [];\n\n for (var l = 0; l < filters[k].length; l++) {\n // Exclusive filtering\n if (this.settings.exclusiveFiltering === true || (this.settings.exclusiveTax !== null && Array.isArray(this.settings.exclusiveTax) && this.settings.exclusiveTax.indexOf(k) !== -1)) {\n testResults[l] = this.filterMatching(filters[k], data[k], false);\n }\n // Inclusive filtering\n else {\n testResults[l] = this.filterMatching(filters[k], data[k]);\n }\n }\n\n if (testResults.indexOf(true) === -1) {\n filterTest = false;\n }\n }\n }\n\n return filterTest;\n },\n\n /**\n\t\t * Build pagination numbers and next/prev links - private\n\t\t *\n\t\t * @param currentPage {number}\n\t\t * @param totalPages {number}\n\t\t *\n\t\t * @returns {string}\n\t\t */\n _paginationOutput: function (currentPage, totalPages) {\n this.writeDebug('_paginationOutput', arguments);\n\n currentPage = parseFloat(currentPage);\n var output = '';\n var nextPage = currentPage + 1;\n var prevPage = currentPage - 1;\n\n // Previous page\n if (currentPage > 0) {\n output += '<li class=\"bh-sl-next-prev\" data-page=\"' + prevPage + '\">' + this.settings.prevPage + '</li>';\n }\n\n // Add the numbers\n for (var p = 0; p < Math.ceil(totalPages); p++) {\n var n = p + 1;\n\n if (p === currentPage) {\n output += '<li class=\"bh-sl-current\" data-page=\"' + p + '\">' + n + '</li>';\n } else {\n output += '<li data-page=\"' + p + '\">' + n + '</li>';\n }\n }\n\n // Next page\n if (nextPage < totalPages) {\n output += '<li class=\"bh-sl-next-prev\" data-page=\"' + nextPage + '\">' + this.settings.nextPage + '</li>';\n }\n\n return output;\n },\n\n /**\n\t\t * Set up the pagination pages\n\t\t *\n\t\t * @param currentPage {number} optional current page\n\t\t */\n paginationSetup: function (currentPage) {\n this.writeDebug('paginationSetup', arguments);\n var pagesOutput = '';\n var totalPages;\n var $paginationList = $('.bh-sl-pagination-container .bh-sl-pagination');\n\n // Total pages\n if (this.settings.storeLimit === -1 || locationset.length < this.settings.storeLimit) {\n totalPages = locationset.length / this.settings.locationsPerPage;\n } else {\n totalPages = this.settings.storeLimit / this.settings.locationsPerPage;\n }\n\n // Current page check\n if (typeof currentPage === 'undefined') {\n currentPage = 0;\n }\n\n // Initial pagination setup\n if ($paginationList.length === 0) {\n pagesOutput = this._paginationOutput(currentPage, totalPages);\n }\n // Update pagination on page change\n else {\n // Remove the old pagination\n $paginationList.empty();\n\n // Add the numbers\n pagesOutput = this._paginationOutput(currentPage, totalPages);\n }\n\n $paginationList.append(pagesOutput);\n },\n\n /**\n\t\t * Marker image setup\n\t\t *\n\t\t * @param markerUrl {string} path to marker image\n\t\t * @param markerWidth {number} width of marker\n\t\t * @param markerHeight {number} height of marker\n\t\t *\n\t\t * @returns {Object} Google Maps icon object\n\t\t */\n markerImage: function (markerUrl, markerWidth, markerHeight) {\n this.writeDebug('markerImage', arguments);\n var markerImg;\n\n // User defined marker dimensions\n if (typeof markerWidth !== 'undefined' && typeof markerHeight !== 'undefined') {\n markerImg = {\n url: markerUrl,\n size: new google.maps.Size(markerWidth, markerHeight),\n scaledSize: new google.maps.Size(markerWidth, markerHeight)\n };\n }\n // Default marker dimensions: 32px x 32px\n else {\n markerImg = {\n url: markerUrl,\n size: new google.maps.Size(32, 32),\n scaledSize: new google.maps.Size(32, 32)\n };\n }\n\n return markerImg;\n },\n\n /**\n\t\t * Map marker setup\n\t\t *\n\t\t * @param point {Object} LatLng of current location\n\t\t * @param name {string} location name\n\t\t * @param address {string} location address\n\t\t * @param letter {string} optional letter used for front-end identification and correlation between list and\n\t\t * points\n\t\t * @param map {Object} the Google Map\n\t\t * @param category {string} location category/categories\n\t\t *\n\t\t * @returns {Object} Google Maps marker\n\t\t */\n createMarker: function (point, name, address, letter, map, category) {\n this.writeDebug('createMarker', arguments);\n var marker; var markerImg; var\n letterMarkerImg;\n var categories = [];\n\n // Custom multi-marker image override (different markers for different categories\n if (this.settings.catMarkers !== null) {\n if (typeof category !== 'undefined') {\n // Multiple categories\n if (category.indexOf(',') !== -1) {\n // Break the category variable into an array if there are multiple categories for the location\n categories = category.split(',');\n // With multiple categories the color will be determined by the last matched category in the data\n for (var i = 0; i < categories.length; i++) {\n if (categories[i] in this.settings.catMarkers) {\n markerImg = this.markerImage(this.settings.catMarkers[categories[i]][0], parseInt(this.settings.catMarkers[categories[i]][1]), parseInt(this.settings.catMarkers[categories[i]][2]));\n }\n }\n }\n // Single category\n else if (category in this.settings.catMarkers) {\n markerImg = this.markerImage(this.settings.catMarkers[category][0], parseInt(this.settings.catMarkers[category][1]), parseInt(this.settings.catMarkers[category][2]));\n }\n }\n }\n\n // Custom single marker image override\n if (this.settings.markerImg !== null) {\n if (this.settings.markerDim === null) {\n markerImg = this.markerImage(this.settings.markerImg);\n } else {\n markerImg = this.markerImage(this.settings.markerImg, this.settings.markerDim.width, this.settings.markerDim.height);\n }\n }\n\n // Marker setup\n if (this.settings.callbackCreateMarker) {\n // Marker override callback\n marker = this.settings.callbackCreateMarker.call(this, map, point, letter, category);\n } else {\n // Create the default markers\n if (this.settings.disableAlphaMarkers === true || this.settings.storeLimit === -1 || this.settings.storeLimit > 26 || this.settings.catMarkers !== null || this.settings.markerImg !== null || (this.settings.fullMapStart === true && firstRun === true && (isNaN(this.settings.fullMapStartListLimit) || this.settings.fullMapStartListLimit > 26 || this.settings.fullMapStartListLimit === -1))) {\n marker = new google.maps.Marker({\n position: point,\n map: map,\n draggable: false,\n icon: markerImg // Reverts to default marker if nothing is passed\n });\n } else {\n // Letter markers image\n letterMarkerImg = {\n url: 'https://mt.googleapis.com/vt/icon/name=icons/spotlight/spotlight-waypoint-b.png&text=' + letter + '&psize=16&font=fonts/Roboto-Regular.ttf&color=ff333333&ax=44&ay=48'\n };\n\n // Letter markers\n marker = new google.maps.Marker({\n position: point,\n map: map,\n icon: letterMarkerImg,\n draggable: false\n });\n }\n }\n\n return marker;\n },\n\n /**\n\t\t * Define the location data for the templates - private\n\t\t *\n\t\t * @param currentMarker {Object} Google Maps marker\n\t\t * @param storeStart {number} optional first location on the current page\n\t\t * @param page {number} optional current page\n\t\t *\n\t\t * @returns {Object} extended location data object\n\t\t */\n _defineLocationData: function (currentMarker, storeStart, page) {\n this.writeDebug('_defineLocationData', arguments);\n var indicator = '';\n this._createLocationVariables(currentMarker.get('id'));\n\n var altDistLength;\n var distLength;\n\n if (locationData.distance <= 1) {\n if (this.settings.lengthUnit === 'km') {\n distLength = this.settings.kilometerLang;\n altDistLength = this.settings.mileLang;\n } else {\n distLength = this.settings.mileLang;\n altDistLength = this.settings.kilometerLang;\n }\n } else if (this.settings.lengthUnit === 'km') {\n distLength = this.settings.kilometersLang;\n altDistLength = this.settings.milesLang;\n } else {\n distLength = this.settings.milesLang;\n altDistLength = this.settings.kilometersLang;\n }\n\n // Set up alpha character\n var markerId = currentMarker.get('id');\n // Use dot markers instead of alpha if there are more than 26 locations\n if (this.settings.disableAlphaMarkers === true || this.settings.storeLimit === -1 || this.settings.storeLimit > 26 || (this.settings.fullMapStart === true && firstRun === true && (isNaN(this.settings.fullMapStartListLimit) || this.settings.fullMapStartListLimit > 26 || this.settings.fullMapStartListLimit === -1))) {\n indicator = markerId + 1;\n } else if (page > 0) {\n indicator = String.fromCharCode('A'.charCodeAt(0) + (storeStart + markerId));\n } else {\n indicator = String.fromCharCode('A'.charCodeAt(0) + markerId);\n }\n\n // Define location data\n return {\n location: [$.extend(locationData, {\n markerid: markerId,\n marker: indicator,\n altlength: altDistLength,\n length: distLength,\n origin: originalOrigin\n })]\n };\n },\n\n /**\n\t\t * Set up the list templates\n\t\t *\n\t\t * @param marker {Object} Google Maps marker\n\t\t * @param storeStart {number} optional first location on the current page\n\t\t * @param page {number} optional current page\n\t\t */\n listSetup: function (marker, storeStart, page) {\n this.writeDebug('listSetup', arguments);\n // Define the location data\n var locations = this._defineLocationData(marker, storeStart, page);\n\n // Set up the list template with the location data\n var listHtml = listTemplate(locations);\n $('.' + this.settings.locationList + ' > ul').append(listHtml);\n },\n\n /**\n\t\t * Change the selected marker image\n\t\t *\n\t\t * @param marker {Object} Google Maps marker object\n\t\t */\n changeSelectedMarker: function (marker) {\n var markerImg;\n\n // Reset the previously selected marker\n if (typeof prevSelectedMarkerAfter !== 'undefined') {\n prevSelectedMarkerAfter.setIcon(prevSelectedMarkerBefore);\n }\n\n // Change the selected marker icon\n if (this.settings.selectedMarkerImgDim === null) {\n markerImg = this.markerImage(this.settings.selectedMarkerImg);\n } else {\n markerImg = this.markerImage(this.settings.selectedMarkerImg, this.settings.selectedMarkerImgDim.width, this.settings.selectedMarkerImgDim.height);\n }\n\n // Save the marker before switching it\n prevSelectedMarkerBefore = marker.icon;\n\n marker.setIcon(markerImg);\n\n // Save the marker to a variable so it can be reverted when another marker is clicked\n prevSelectedMarkerAfter = marker;\n },\n\n /**\n\t\t * Create the infowindow\n\t\t *\n\t\t * @param marker {Object} Google Maps marker object\n\t\t * @param location {string} indicates if the list or a map marker was clicked\n\t\t * @param infowindow Google Maps InfoWindow constructor\n\t\t * @param storeStart {number}\n\t\t * @param page {number}\n\t\t */\n createInfowindow: function (marker, location, infowindow, storeStart, page) {\n this.writeDebug('createInfowindow', arguments);\n var _this = this;\n // Define the location data\n var locations = this._defineLocationData(marker, storeStart, page);\n\n // Set up the infowindow template with the location data\n var formattedAddress = infowindowTemplate(locations);\n\n // Opens the infowindow when list item is clicked\n if (location === 'left') {\n infowindow.setContent(formattedAddress);\n infowindow.open(marker.get('map'), marker);\n }\n // Opens the infowindow when the marker is clicked\n else {\n google.maps.event.addListener(marker, 'click', function () {\n infowindow.setContent(formattedAddress);\n infowindow.open(marker.get('map'), marker);\n // Focus on the list\n var markerId = marker.get('id');\n var $selectedLocation = $('.' + _this.settings.locationList + ' li[data-markerid=' + markerId + ']');\n\n if ($selectedLocation.length > 0) {\n // Marker click callback\n if (_this.settings.callbackMarkerClick) {\n _this.settings.callbackMarkerClick.call(this, marker, markerId, $selectedLocation, locationset[markerId]);\n }\n\n $('.' + _this.settings.locationList + ' li').removeClass('list-focus');\n $selectedLocation.addClass('list-focus');\n\n // Scroll list to selected marker\n var $container = $('.' + _this.settings.locationList);\n $container.animate({\n scrollTop: $selectedLocation.offset().top - $container.offset().top + $container.scrollTop()\n });\n }\n\n // Custom selected marker override\n if (_this.settings.selectedMarkerImg !== null) {\n _this.changeSelectedMarker(marker);\n }\n });\n }\n },\n\n /**\n\t\t * HTML5 geocoding function for automatic location detection\n\t\t *\n\t\t * @param position {Object} coordinates\n\t\t */\n autoGeocodeQuery: function (position) {\n this.writeDebug('autoGeocodeQuery', arguments);\n var _this = this;\n var distance = null;\n var $distanceInput = $('#' + this.settings.maxDistanceID);\n var originAddress;\n\n // Query string parameters\n if (this.settings.querystringParams === true) {\n // Check for distance query string parameters\n if (this.getQueryString(this.settings.maxDistanceID)) {\n distance = this.getQueryString(this.settings.maxDistanceID);\n\n if ($distanceInput.val() !== '') {\n distance = $distanceInput.val();\n }\n } else {\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n } else {\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n\n // The address needs to be determined for the directions link\n var r = new this.reverseGoogleGeocode(this);\n var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\n r.geocode({ latLng: latlng }, function (data) {\n if (data !== null) {\n originAddress = addressInput = data.address;\n olat = mappingObj.lat = position.coords.latitude;\n olng = mappingObj.lng = position.coords.longitude;\n mappingObj.origin = originAddress;\n mappingObj.distance = distance;\n _this.mapping(mappingObj);\n\n // Fill in the search box.\n if (typeof originAddress !== 'undefined') {\n $('#' + _this.settings.addressID).val(originAddress);\n }\n } else {\n // Unable to geocode\n _this.notify(_this.settings.addressErrorAlert);\n }\n });\n },\n\n /**\n\t\t * Handle autoGeocode failure - private\n\t\t *\n\t\t */\n _autoGeocodeError: function () {\n this.writeDebug('_autoGeocodeError');\n // If automatic detection doesn't work show an error\n this.notify(this.settings.autoGeocodeErrorAlert);\n },\n\n /**\n\t\t * Default location method\n\t\t */\n defaultLocation: function () {\n this.writeDebug('defaultLocation');\n var _this = this;\n var distance = null;\n var $distanceInput = $('#' + this.settings.maxDistanceID);\n var originAddress;\n\n // Query string parameters\n if (this.settings.querystringParams === true) {\n // Check for distance query string parameters\n if (this.getQueryString(this.settings.maxDistanceID)) {\n distance = this.getQueryString(this.settings.maxDistanceID);\n\n if ($distanceInput.val() !== '') {\n distance = $distanceInput.val();\n }\n } else {\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n } else {\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n\n // The address needs to be determined for the directions link\n var r = new this.reverseGoogleGeocode(this);\n var latlng = new google.maps.LatLng(this.settings.defaultLat, this.settings.defaultLng);\n r.geocode({ latLng: latlng }, function (data) {\n if (data !== null) {\n originAddress = addressInput = data.address;\n olat = mappingObj.lat = _this.settings.defaultLat;\n olng = mappingObj.lng = _this.settings.defaultLng;\n mappingObj.distance = distance;\n mappingObj.origin = originAddress;\n _this.mapping(mappingObj);\n } else {\n // Unable to geocode\n _this.notify(_this.settings.addressErrorAlert);\n }\n });\n },\n\n /**\n\t\t * Change the page\n\t\t *\n\t\t * @param newPage {number} page to change to\n\t\t */\n paginationChange: function (newPage) {\n this.writeDebug('paginationChange', arguments);\n\n // Page change callback\n if (this.settings.callbackPageChange) {\n this.settings.callbackPageChange.call(this, newPage);\n }\n\n mappingObj.page = newPage;\n this.mapping(mappingObj);\n },\n\n /**\n\t\t * Get the address by marker ID\n\t\t *\n\t\t * @param markerID {number} location ID\n\t\t *\n\t\t * @returns {string} formatted address\n\t\t */\n getAddressByMarker: function (markerID) {\n this.writeDebug('getAddressByMarker', arguments);\n var formattedAddress = '';\n // Set up formatted address\n if (locationset[markerID].address) { formattedAddress += locationset[markerID].address + ' '; }\n if (locationset[markerID].address2) { formattedAddress += locationset[markerID].address2 + ' '; }\n if (locationset[markerID].city) { formattedAddress += locationset[markerID].city + ', '; }\n if (locationset[markerID].state) { formattedAddress += locationset[markerID].state + ' '; }\n if (locationset[markerID].postal) { formattedAddress += locationset[markerID].postal + ' '; }\n if (locationset[markerID].country) { formattedAddress += locationset[markerID].country + ' '; }\n\n return formattedAddress;\n },\n\n /**\n\t\t * Clear the markers from the map\n\t\t */\n clearMarkers: function () {\n this.writeDebug('clearMarkers');\n var locationsLimit = null;\n\n if (locationset.length < this.settings.storeLimit) {\n locationsLimit = locationset.length;\n } else {\n locationsLimit = this.settings.storeLimit;\n }\n\n for (var i = 0; i < locationsLimit; i++) {\n markers[i].setMap(null);\n }\n },\n\n /**\n\t\t * Handle inline direction requests\n\t\t *\n\t\t * @param origin {string} origin address\n\t\t * @param locID {number} location ID\n\t\t * @param map {Object} Google Map\n\t\t */\n directionsRequest: function (origin, locID, map) {\n this.writeDebug('directionsRequest', arguments);\n\n // Directions request callback\n if (this.settings.callbackDirectionsRequest) {\n this.settings.callbackDirectionsRequest.call(this, origin, locID, map, locationset[locID]);\n }\n\n var destination = this.getAddressByMarker(locID);\n\n if (destination) {\n // Hide the location list\n $('.' + this.settings.locationList + ' ul').hide();\n // Remove the markers\n this.clearMarkers();\n\n // Clear the previous directions request\n if (directionsDisplay !== null && typeof directionsDisplay !== 'undefined') {\n directionsDisplay.setMap(null);\n directionsDisplay = null;\n }\n\n directionsDisplay = new google.maps.DirectionsRenderer();\n directionsService = new google.maps.DirectionsService();\n\n // Directions request\n directionsDisplay.setMap(map);\n directionsDisplay.setPanel($('.bh-sl-directions-panel').get(0));\n\n var request = {\n origin: origin,\n destination: destination,\n travelMode: google.maps.TravelMode.DRIVING\n };\n directionsService.route(request, function (response, status) {\n if (status === google.maps.DirectionsStatus.OK) {\n directionsDisplay.setDirections(response);\n }\n });\n\n $('.' + this.settings.locationList).prepend('<div class=\"bh-sl-close-directions-container\"><div class=\"' + this.settings.closeIcon + '\"></div></div>');\n }\n\n $(document).off('click', '.' + this.settings.locationList + ' li .loc-directions a');\n },\n\n /**\n\t\t * Close the directions panel and reset the map with the original locationset and zoom\n\t\t */\n closeDirections: function () {\n this.writeDebug('closeDirections');\n\n // Close directions callback\n if (this.settings.callbackCloseDirections) {\n this.settings.callbackCloseDirections.call(this);\n }\n\n // Remove the close icon, remove the directions, add the list back\n this.reset();\n\n if ((olat) && (olng)) {\n if (this.countFilters() === 0) {\n this.settings.mapSettings.zoom = originalZoom;\n } else {\n this.settings.mapSettings.zoom = 0;\n }\n this.processForm(null);\n }\n\n $(document).off('click.' + pluginName, '.' + this.settings.locationList + ' .bh-sl-close-icon');\n },\n\n /**\n\t\t * Handle length unit swap\n\t\t *\n\t\t * @param $lengthSwap\n\t\t */\n lengthUnitSwap: function ($lengthSwap) {\n this.writeDebug('lengthUnitSwap', arguments);\n\n if ($lengthSwap.val() === 'alt-distance') {\n $('.' + this.settings.locationList + ' .loc-alt-dist').show();\n $('.' + this.settings.locationList + ' .loc-default-dist').hide();\n } else if ($lengthSwap.val() === 'default-distance') {\n $('.' + this.settings.locationList + ' .loc-default-dist').show();\n $('.' + this.settings.locationList + ' .loc-alt-dist').hide();\n }\n },\n\n /**\n\t\t * Find my location\n\t\t *\n\t\t * @param e {Object} event\n\t\t */\n findMyLocation: function (e) {\n // Stop the form submission\n if (typeof e !== 'undefined' && e !== null) {\n e.preventDefault();\n }\n\n if (this.settings.isNavigationGeolocationEnabled) {\n this._start();\n }\n },\n\n /**\n\t\t * Process the form values and/or query string\n\t\t *\n\t\t * @param e {Object} event\n\t\t */\n processForm: function (e) {\n this.writeDebug('processForm', arguments);\n var _this = this;\n var distance = null;\n var geocodeRestrictions = {};\n var $addressInput = $('#' + this.settings.addressID);\n var $searchInput = $('#' + this.settings.searchID);\n var $distanceInput = $('#' + this.settings.maxDistanceID);\n var region = '';\n\n // Stop the form submission\n if (typeof e !== 'undefined' && e !== null) {\n e.preventDefault();\n }\n\n // Blur any form field to hide mobile keyboards.\n $('.' + _this.settings.formContainer + ' input, .' + _this.settings.formContainer + ' select').blur();\n\n // Query string parameters\n if (this.settings.querystringParams === true) {\n // Check for query string parameters\n if (this.getQueryString(this.settings.addressID) || this.getQueryString(this.settings.searchID) || this.getQueryString(this.settings.maxDistanceID)) {\n addressInput = this.getQueryString(this.settings.addressID);\n searchInput = this.getQueryString(this.settings.searchID);\n distance = this.getQueryString(this.settings.maxDistanceID);\n\n // The form should override the query string parameters\n if ($addressInput.val() !== '') {\n addressInput = $addressInput.val();\n }\n if ($searchInput.val() !== '') {\n searchInput = $searchInput.val();\n }\n if ($distanceInput.val() !== '') {\n distance = $distanceInput.val();\n }\n } else {\n // Get the user input and use it\n addressInput = $addressInput.val() || '';\n searchInput = $searchInput.val() || '';\n\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n } else {\n // Get the user input and use it\n addressInput = $addressInput.val() || '';\n searchInput = $searchInput.val() || '';\n // Get the distance if set\n if (this.settings.maxDistance === true) {\n distance = $distanceInput.val() || '';\n }\n }\n\n // Region\n if (this.settings.callbackRegion) {\n // Region override callback\n region = this.settings.callbackRegion.call(this, addressInput, searchInput, distance);\n } else {\n // Region setting\n region = $('#' + this.settings.regionID).val();\n }\n\n // Form values callback\n if (this.settings.callbackFormVals) {\n this.settings.callbackFormVals.call(this, addressInput, searchInput, distance, region);\n }\n\n // Add component restriction if the region has been set.\n if (typeof region !== 'undefined') {\n geocodeRestrictions = {\n country: region\n };\n }\n\n // Component restriction value via callback.\n if (typeof this.settings.callbackGeocodeRestrictions === 'function') {\n // Component restriction override callback\n geocodeRestrictions = this.settings.callbackGeocodeRestrictions.call(this, addressInput, searchInput, distance);\n }\n\n if (addressInput === '' && searchInput === '' && this.settings.autoGeocode !== true) {\n this._start();\n } else if (addressInput !== '') {\n // Check for existing name search and remove if address input is blank.\n if (searchInput === '' && filters.hasOwnProperty('name')) {\n delete filters.name;\n }\n\n // Geocode the origin if needed\n if (typeof originalOrigin !== 'undefined' && typeof olat !== 'undefined' && typeof olng !== 'undefined' && (addressInput === originalOrigin)) {\n // Run the mapping function\n mappingObj.lat = olat;\n mappingObj.lng = olng;\n mappingObj.origin = addressInput;\n mappingObj.name = searchInput;\n mappingObj.distance = distance;\n _this.mapping(mappingObj);\n } else {\n var g = new this.googleGeocode(this);\n g.geocode({\n address: addressInput,\n componentRestrictions: geocodeRestrictions,\n region: region\n }, function (data) {\n if (data !== null) {\n olat = data.latitude;\n olng = data.longitude;\n\n // Run the mapping function\n mappingObj.lat = olat;\n mappingObj.lng = olng;\n mappingObj.origin = addressInput;\n mappingObj.name = searchInput;\n mappingObj.distance = distance;\n mappingObj.geocodeResult = data.geocodeResult;\n _this.mapping(mappingObj);\n } else {\n // Unable to geocode\n _this.notify(_this.settings.addressErrorAlert);\n }\n });\n }\n } else if (searchInput !== '') {\n // Check for existing origin and remove if address input is blank.\n if (addressInput === '') {\n delete mappingObj.origin;\n }\n\n mappingObj.name = searchInput;\n _this.mapping(mappingObj);\n } else if (this.settings.autoGeocode === true) {\n // Run the mapping function\n mappingObj.lat = olat;\n mappingObj.lng = olng;\n mappingObj.origin = addressInput;\n mappingObj.name = searchInput;\n mappingObj.distance = distance;\n _this.mapping(mappingObj);\n }\n },\n\n /**\n\t\t * Checks distance of each location and sets up the locationset array\n\t\t *\n\t\t * @param data {Object} location data object\n\t\t * @param lat {number} origin latitude\n\t\t * @param lng {number} origin longitude\n\t\t * @param origin {string} origin address\n\t\t * @param maxDistance {number} maximum distance if set\n\t\t */\n locationsSetup: function (data, lat, lng, origin, maxDistance) {\n this.writeDebug('locationsSetup', arguments);\n if (typeof origin !== 'undefined') {\n if (!data.distance) {\n data.distance = this.geoCodeCalcCalcDistance(lat, lng, data.lat, data.lng, GeoCodeCalc.EarthRadius);\n\n // Alternative distance length unit\n if (this.settings.lengthUnit === 'm') {\n // Miles to kilometers\n data.altdistance = parseFloat(data.distance) * 1.609344;\n } else if (this.settings.lengthUnit === 'km') {\n // Kilometers to miles\n data.altdistance = parseFloat(data.distance) / 1.609344;\n }\n }\n }\n\n // Create the array\n if (this.settings.maxDistance === true && typeof maxDistance !== 'undefined' && maxDistance !== null) {\n if (data.distance <= maxDistance) {\n locationset.push(data);\n } else {\n\n }\n } else if (this.settings.maxDistance === true && this.settings.querystringParams === true && typeof maxDistance !== 'undefined' && maxDistance !== null) {\n if (data.distance <= maxDistance) {\n locationset.push(data);\n } else {\n\n }\n } else {\n locationset.push(data);\n }\n },\n\n /**\n\t\t * Set up front-end sorting functionality\n\t\t */\n sorting: function () {\n this.writeDebug('sorting', arguments);\n var _this = this;\n var $mapDiv = $('#' + _this.settings.mapID);\n var $sortSelect = $('#' + _this.settings.sortID);\n\n if ($sortSelect.length === 0) {\n return;\n }\n\n $sortSelect.on('change.' + pluginName, function (e) {\n e.stopPropagation();\n\n // Reset pagination.\n if (_this.settings.pagination === true) {\n _this.paginationChange(0);\n }\n\n var sortMethod;\n var sortVal;\n\n sortMethod = (typeof $(this).find(':selected').attr('data-method') !== 'undefined') ? $(this).find(':selected').attr('data-method') : 'distance';\n sortVal = $(this).val();\n\n _this.settings.sortBy.method = sortMethod;\n _this.settings.sortBy.prop = sortVal;\n\n // Callback\n if (_this.settings.callbackSorting) {\n _this.settings.callbackSorting.call(this, _this.settings.sortBy);\n }\n\n if ($mapDiv.hasClass('bh-sl-map-open')) {\n _this.mapping(mappingObj);\n }\n });\n },\n\n /**\n\t\t * Set up front-end ordering functionality - this ties in to sorting and that has to be enabled for this to\n\t\t * work.\n\t\t */\n order: function () {\n this.writeDebug('order', arguments);\n var _this = this;\n var $mapDiv = $('#' + _this.settings.mapID);\n var $orderSelect = $('#' + _this.settings.orderID);\n\n if ($orderSelect.length === 0) {\n return;\n }\n\n $orderSelect.on('change.' + pluginName, function (e) {\n e.stopPropagation();\n\n // Reset pagination.\n if (_this.settings.pagination === true) {\n _this.paginationChange(0);\n }\n\n _this.settings.sortBy.order = $(this).val();\n\n // Callback\n if (_this.settings.callbackOrder) {\n _this.settings.callbackOrder.call(this, _this.settings.order);\n }\n\n if ($mapDiv.hasClass('bh-sl-map-open')) {\n _this.mapping(mappingObj);\n }\n });\n },\n\n /**\n\t\t * Count the selected filters\n\t\t *\n\t\t * @returns {number}\n\t\t */\n countFilters: function () {\n this.writeDebug('countFilters');\n var filterCount = 0;\n\n if (!this.isEmptyObject(filters)) {\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n filterCount += filters[key].length;\n }\n }\n }\n\n return filterCount;\n },\n\n /**\n\t\t * Find the existing checked boxes for each checkbox filter - private\n\t\t *\n\t\t * @param key {string} object key\n\t\t */\n _existingCheckedFilters: function (key) {\n this.writeDebug('_existingCheckedFilters', arguments);\n $('#' + this.settings.taxonomyFilters[key] + ' input[type=checkbox]').each(function () {\n if ($(this).prop('checked')) {\n var filterVal = $(this).val();\n\n // Only add the taxonomy id if it doesn't already exist\n if (typeof filterVal !== 'undefined' && filterVal !== '' && filters[key].indexOf(filterVal) === -1) {\n filters[key].push(filterVal);\n }\n }\n });\n },\n\n /**\n\t\t * Find the existing selected value for each select filter - private\n\t\t *\n\t\t * @param key {string} object key\n\t\t */\n _existingSelectedFilters: function (key) {\n this.writeDebug('_existingSelectedFilters', arguments);\n $('#' + this.settings.taxonomyFilters[key] + ' select').each(function () {\n var filterVal = $(this).val();\n\n // Only add the taxonomy id if it doesn't already exist\n if (typeof filterVal !== 'undefined' && filterVal !== '' && filters[key].indexOf(filterVal) === -1) {\n filters[key] = [filterVal];\n }\n });\n },\n\n /**\n\t\t * Find the existing selected value for each radio button filter - private\n\t\t *\n\t\t * @param key {string} object key\n\t\t */\n _existingRadioFilters: function (key) {\n this.writeDebug('_existingRadioFilters', arguments);\n $('#' + this.settings.taxonomyFilters[key] + ' input[type=radio]').each(function () {\n if ($(this).prop('checked')) {\n var filterVal = $(this).val();\n\n // Only add the taxonomy id if it doesn't already exist\n if (typeof filterVal !== 'undefined' && filterVal !== '' && filters[key].indexOf(filterVal) === -1) {\n filters[key] = [filterVal];\n }\n }\n });\n },\n\n /**\n\t\t * Check for existing filter selections\n\t\t */\n checkFilters: function () {\n this.writeDebug('checkFilters');\n for (var key in this.settings.taxonomyFilters) {\n if (this.settings.taxonomyFilters.hasOwnProperty(key)) {\n // Find the existing checked boxes for each checkbox filter\n this._existingCheckedFilters(key);\n\n // Find the existing selected value for each select filter\n this._existingSelectedFilters(key);\n\n // Find the existing value for each radio button filter\n this._existingRadioFilters(key);\n }\n }\n },\n\n /**\n\t\t * Select the indicated values from query string parameters.\n\t\t *\n\t\t * @param taxonomy {string} Current taxonomy.\n\t\t * @param value {array} Query string array values.\n\t\t */\n selectQueryStringFilters: function (taxonomy, value) {\n this.writeDebug('selectQueryStringFilters', arguments);\n\n var $taxGroupContainer = $('#' + this.settings.taxonomyFilters[taxonomy]);\n\n // Handle checkboxes.\n if ($taxGroupContainer.find('input[type=\"checkbox\"]').length) {\n for (var i = 0; i < value.length; i++) {\n $taxGroupContainer.find('input:checkbox[value=\"' + value[i] + '\"]').prop('checked', true);\n }\n }\n\n // Handle select fields.\n if ($taxGroupContainer.find('select').length) {\n // Only expecting one value for select fields.\n $taxGroupContainer.find('option[value=\"' + value[0] + '\"]').prop('selected', true);\n }\n\n // Handle radio buttons.\n if ($taxGroupContainer.find('input[type=\"radio\"]').length) {\n // Only one value for radio button.\n $taxGroupContainer.find('input:radio[value=\"' + value[0] + '\"]').prop('checked', true);\n }\n },\n\n /**\n\t\t * Check query string parameters for filter values.\n\t\t */\n checkQueryStringFilters: function () {\n this.writeDebug('checkQueryStringFilters', arguments);\n\n // Loop through the filters.\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var filterVal = this.getQueryString(key);\n\n // Check for multiple values separated by comma.\n if (filterVal.indexOf(',') !== -1) {\n filterVal = filterVal.split(',');\n }\n\n // Only add the taxonomy id if it doesn't already exist\n if (typeof filterVal !== 'undefined' && filterVal !== '' && filters[key].indexOf(filterVal) === -1) {\n if (Array.isArray(filterVal)) {\n filters[key] = filterVal;\n } else {\n filters[key] = [filterVal];\n }\n }\n\n // Select the filters indicated in the query string.\n if (filters[key].length) {\n this.selectQueryStringFilters(key, filters[key]);\n }\n }\n }\n },\n\n /**\n\t\t * Get the filter key from the taxonomyFilter setting\n\t\t *\n\t\t * @param filterContainer {string} ID of the changed filter's container\n\t\t */\n getFilterKey: function (filterContainer) {\n this.writeDebug('getFilterKey', arguments);\n for (var key in this.settings.taxonomyFilters) {\n if (this.settings.taxonomyFilters.hasOwnProperty(key)) {\n for (var i = 0; i < this.settings.taxonomyFilters[key].length; i++) {\n if (this.settings.taxonomyFilters[key] === filterContainer) {\n return key;\n }\n }\n }\n }\n },\n\n /**\n\t\t * Initialize or reset the filters object to its original state\n\t\t */\n taxonomyFiltersInit: function () {\n this.writeDebug('taxonomyFiltersInit');\n\n // Set up the filters\n for (var key in this.settings.taxonomyFilters) {\n if (this.settings.taxonomyFilters.hasOwnProperty(key)) {\n filters[key] = [];\n }\n }\n },\n\n /**\n\t\t * Taxonomy filtering\n\t\t */\n taxonomyFiltering: function () {\n this.writeDebug('taxonomyFiltering');\n var _this = this;\n\n // Set up the filters\n _this.taxonomyFiltersInit();\n\n // Check query string for taxonomy parameter keys.\n _this.checkQueryStringFilters();\n\n // Handle filter updates\n $('.' + this.settings.taxonomyFiltersContainer).on('change.' + pluginName, 'input, select', function (e) {\n e.stopPropagation();\n\n var filterVal; var filterContainer; var\n filterKey;\n\n // Reset pagination.\n if (_this.settings.pagination === true) {\n _this.paginationChange(0);\n }\n\n // Handle checkbox filters\n if ($(this).is('input[type=\"checkbox\"]')) {\n // First check for existing selections\n _this.checkFilters();\n\n filterVal = $(this).val();\n filterContainer = $(this).closest('.bh-sl-filters').attr('id');\n filterKey = _this.getFilterKey(filterContainer);\n\n if (filterKey) {\n // Add or remove filters based on checkbox values\n if ($(this).prop('checked')) {\n // Add ids to the filter arrays as they are checked\n if (filters[filterKey].indexOf(filterVal) === -1) {\n filters[filterKey].push(filterVal);\n }\n\n if ($('#' + _this.settings.mapID).hasClass('bh-sl-map-open') === true) {\n if ((olat) && (olng)) {\n _this.settings.mapSettings.zoom = 0;\n _this.processForm();\n } else {\n _this.mapping(mappingObj);\n }\n }\n } else {\n // Remove ids from the filter arrays as they are unchecked\n var filterIndex = filters[filterKey].indexOf(filterVal);\n if (filterIndex > -1) {\n filters[filterKey].splice(filterIndex, 1);\n if ($('#' + _this.settings.mapID).hasClass('bh-sl-map-open') === true) {\n if ((olat) && (olng)) {\n if (_this.countFilters() === 0) {\n _this.settings.mapSettings.zoom = originalZoom;\n } else {\n _this.settings.mapSettings.zoom = 0;\n }\n _this.processForm();\n } else {\n _this.mapping(mappingObj);\n }\n }\n }\n }\n }\n }\n // Handle select or radio filters\n else if ($(this).is('select') || $(this).is('input[type=\"radio\"]')) {\n // First check for existing selections\n _this.checkFilters();\n\n filterVal = $(this).val();\n filterContainer = $(this).closest('.bh-sl-filters').attr('id');\n filterKey = _this.getFilterKey(filterContainer);\n\n // Check for blank filter on select since default val could be empty\n if (filterVal) {\n if (filterKey) {\n filters[filterKey] = [filterVal];\n if ($('#' + _this.settings.mapID).hasClass('bh-sl-map-open') === true) {\n if ((olat) && (olng)) {\n _this.settings.mapSettings.zoom = 0;\n _this.processForm();\n } else {\n _this.mapping(mappingObj);\n }\n }\n }\n }\n // Reset if the default option is selected\n else {\n if (filterKey) {\n filters[filterKey] = [];\n }\n _this.reset();\n if ((olat) && (olng)) {\n _this.settings.mapSettings.zoom = originalZoom;\n _this.processForm();\n } else {\n _this.mapping(mappingObj);\n }\n }\n }\n });\n },\n\n /**\n\t\t * Updates the location list to reflect the markers that are displayed on the map\n\t\t *\n\t\t * @param markers {Object} Map markers\n\t\t * @param map {Object} Google map\n\t\t */\n checkVisibleMarkers: function (markers, map) {\n this.writeDebug('checkVisibleMarkers', arguments);\n var _this = this;\n var locations; var\n listHtml;\n\n // Empty the location list\n $('.' + this.settings.locationList + ' ul').empty();\n\n // Set up the new list\n $(markers).each(function (x, marker) {\n if (map.getBounds().contains(marker.getPosition())) {\n // Define the location data\n _this.listSetup(marker, 0, 0);\n\n // Set up the list template with the location data\n listHtml = listTemplate(locations);\n $('.' + _this.settings.locationList + ' > ul').append(listHtml);\n }\n });\n\n // Re-add the list background colors\n $('.' + this.settings.locationList + ' ul li:even').css('background', this.settings.listColor1);\n $('.' + this.settings.locationList + ' ul li:odd').css('background', this.settings.listColor2);\n },\n\n /**\n\t\t * Performs a new search when the map is dragged to a new position\n\t\t *\n\t\t * @param map {Object} Google map\n\t\t */\n dragSearch: function (map) {\n this.writeDebug('dragSearch', arguments);\n var newCenter = map.getCenter();\n var newCenterCoords;\n var _this = this;\n\n // Save the new zoom setting\n this.settings.mapSettings.zoom = map.getZoom();\n\n olat = mappingObj.lat = newCenter.lat();\n olng = mappingObj.lng = newCenter.lng();\n\n // Determine the new origin addresss\n var newAddress = new this.reverseGoogleGeocode(this);\n newCenterCoords = new google.maps.LatLng(mappingObj.lat, mappingObj.lng);\n newAddress.geocode({ latLng: newCenterCoords }, function (data) {\n if (data !== null) {\n mappingObj.origin = addressInput = data.address;\n _this.mapping(mappingObj);\n } else {\n // Unable to geocode\n _this.notify(_this.settings.addressErrorAlert);\n }\n });\n },\n\n /**\n\t\t * Handle no results\n\t\t */\n emptyResult: function () {\n this.writeDebug('emptyResult', arguments);\n var center;\n var locList = $('.' + this.settings.locationList + ' ul');\n var myOptions = this.settings.mapSettings;\n var noResults;\n\n // Create the map\n this.map = new google.maps.Map(document.getElementById(this.settings.mapID), myOptions);\n\n // Callback\n if (this.settings.callbackNoResults) {\n this.settings.callbackNoResults.call(this, this.map, myOptions);\n }\n\n // Empty the location list\n locList.empty();\n\n // Append the no results message\n noResults = $('<li><div class=\"bh-sl-noresults-title\">' + this.settings.noResultsTitle + '</div><br><div class=\"bh-sl-noresults-desc\">' + this.settings.noResultsDesc + '</li>').hide().fadeIn();\n locList.append(noResults);\n\n // Center on the original origin or 0,0 if not available\n if ((olat) && (olng)) {\n center = new google.maps.LatLng(olat, olng);\n } else {\n center = new google.maps.LatLng(0, 0);\n }\n\n this.map.setCenter(center);\n\n if (originalZoom) {\n this.map.setZoom(originalZoom);\n }\n },\n\n /**\n\t\t * Origin marker setup\n\t\t *\n\t\t * @param map {Object} Google map\n\t\t * @param origin {string} Origin address\n\t\t * @param originPoint {Object} LatLng of origin point\n\t\t */\n originMarker: function (map, origin, originPoint) {\n this.writeDebug('originMarker', arguments);\n\n if (this.settings.originMarker !== true) {\n return;\n }\n\n var marker;\n var originImg = '';\n\n if (typeof origin !== 'undefined') {\n if (this.settings.originMarkerImg !== null) {\n if (this.settings.originMarkerDim === null) {\n originImg = this.markerImage(this.settings.originMarkerImg);\n } else {\n originImg = this.markerImage(this.settings.originMarkerImg, this.settings.originMarkerDim.width, this.settings.originMarkerDim.height);\n }\n } else {\n originImg = {\n url: 'https://mt.googleapis.com/vt/icon/name=icons/spotlight/spotlight-waypoint-a.png'\n };\n }\n\n marker = new google.maps.Marker({\n position: originPoint,\n map: map,\n icon: originImg,\n draggable: false\n });\n }\n },\n\n /**\n\t\t * Modal window setup\n\t\t */\n modalWindow: function () {\n this.writeDebug('modalWindow');\n\n if (this.settings.modal !== true) {\n return;\n }\n\n var _this = this;\n\n // Callback\n if (_this.settings.callbackModalOpen) {\n _this.settings.callbackModalOpen.call(this);\n }\n\n // Pop up the modal window\n $('.' + _this.settings.overlay).fadeIn();\n // Close modal when close icon is clicked and when background overlay is clicked\n $(document).on('click.' + pluginName, '.' + _this.settings.closeIcon + ', .' + _this.settings.overlay, function () {\n _this.modalClose();\n });\n // Prevent clicks within the modal window from closing the entire thing\n $(document).on('click.' + pluginName, '.' + _this.settings.modalWindow, function (e) {\n e.stopPropagation();\n });\n // Close modal when escape key is pressed\n $(document).on('keyup.' + pluginName, function (e) {\n if (e.keyCode === 27) {\n _this.modalClose();\n }\n });\n },\n\n /**\n\t\t * Open and select the location closest to the origin\n\t\t *\n\t\t * @param nearestLoc {Object} Details for the nearest location\n\t\t * @param infowindow {Object} Info window object\n\t\t * @param storeStart {number} Starting point of current page when pagination is enabled\n\t\t * @param page {number} Current page number when pagination is enabled\n\t\t */\n openNearestLocation: function (nearestLoc, infowindow, storeStart, page) {\n this.writeDebug('openNearestLocation', arguments);\n\n if (this.settings.openNearest !== true || typeof nearestLoc === 'undefined' || (this.settings.fullMapStart === true && firstRun === true) || (this.settings.defaultLoc === true && firstRun === true)) {\n return;\n }\n\n var _this = this;\n\n // Callback\n if (_this.settings.callbackNearestLoc) {\n _this.settings.callbackNearestLoc.call(this, _this.map, nearestLoc, infowindow, storeStart, page);\n }\n\n var markerId = 0;\n var selectedMarker = markers[markerId];\n\n _this.createInfowindow(selectedMarker, 'left', infowindow, storeStart, page);\n\n // Scroll list to selected marker\n var $container = $('.' + _this.settings.locationList);\n var $selectedLocation = $('.' + _this.settings.locationList + ' li[data-markerid=' + markerId + ']');\n\n // Focus on the list\n $('.' + _this.settings.locationList + ' li').removeClass('list-focus');\n $selectedLocation.addClass('list-focus');\n\n $container.animate({\n scrollTop: $selectedLocation.offset().top - $container.offset().top + $container.scrollTop()\n });\n },\n\n /**\n\t\t * Handle clicks from the location list\n\t\t *\n\t\t * @param map {Object} Google map\n\t\t * @param infowindow {Object} Info window object\n\t\t * @param storeStart {number} Starting point of current page when pagination is enabled\n\t\t * @param page {number} Current page number when pagination is enabled\n\t\t */\n listClick: function (map, infowindow, storeStart, page) {\n this.writeDebug('listClick', arguments);\n var _this = this;\n\n $(document).on('click.' + pluginName, '.' + _this.settings.locationList + ' li', function () {\n var markerId = $(this).data('markerid');\n var selectedMarker = markers[markerId];\n\n // List click callback\n if (_this.settings.callbackListClick) {\n _this.settings.callbackListClick.call(this, markerId, selectedMarker, locationset[markerId], map);\n }\n\n map.panTo(selectedMarker.getPosition());\n var listLoc = 'left';\n if (_this.settings.bounceMarker === true) {\n selectedMarker.setAnimation(google.maps.Animation.BOUNCE);\n setTimeout(function () {\n selectedMarker.setAnimation(null);\n _this.createInfowindow(selectedMarker, listLoc, infowindow, storeStart, page);\n }, 700);\n } else {\n _this.createInfowindow(selectedMarker, listLoc, infowindow, storeStart, page);\n }\n\n // Custom selected marker override\n if (_this.settings.selectedMarkerImg !== null) {\n _this.changeSelectedMarker(selectedMarker);\n }\n\n // Focus on the list\n $('.' + _this.settings.locationList + ' li').removeClass('list-focus');\n $('.' + _this.settings.locationList + ' li[data-markerid=' + markerId + ']').addClass('list-focus');\n });\n\n // Prevent bubbling from list content links\n $(document).on('click.' + pluginName, '.' + _this.settings.locationList + ' li a', function (e) {\n e.stopPropagation();\n });\n },\n\n /**\n\t\t * Output total results count if HTML element with .bh-sl-total-results class exists\n\t\t *\n\t\t * @param locCount\n\t\t */\n resultsTotalCount: function (locCount) {\n this.writeDebug('resultsTotalCount', arguments);\n\n var $resultsContainer = $('.bh-sl-total-results');\n\n if (typeof locCount === 'undefined' || locCount <= 0 || $resultsContainer.length === 0) {\n return;\n }\n\n $resultsContainer.text(locCount);\n },\n\n /**\n\t\t * Inline directions setup\n\t\t *\n\t\t * @param map {Object} Google map\n\t\t * @param origin {string} Origin address\n\t\t */\n inlineDirections: function (map, origin) {\n this.writeDebug('inlineDirections', arguments);\n\n if (this.settings.inlineDirections !== true || typeof origin === 'undefined') {\n return;\n }\n\n var _this = this;\n\n // Open directions\n $(document).on('click.' + pluginName, '.' + _this.settings.locationList + ' li .loc-directions a', function (e) {\n e.preventDefault();\n var locID = $(this).closest('li').attr('data-markerid');\n _this.directionsRequest(origin, parseInt(locID), map);\n\n // Close directions\n $(document).on('click.' + pluginName, '.' + _this.settings.locationList + ' .bh-sl-close-icon', function () {\n _this.closeDirections();\n });\n });\n },\n\n /**\n\t\t * Visible markers list setup\n\t\t *\n\t\t * @param map {Object} Google map\n\t\t * @param markers {Object} Map markers\n\t\t */\n visibleMarkersList: function (map, markers) {\n this.writeDebug('visibleMarkersList', arguments);\n\n if (this.settings.visibleMarkersList !== true) {\n return;\n }\n\n var _this = this;\n\n // Add event listener to filter the list when the map is fully loaded\n google.maps.event.addListenerOnce(map, 'idle', function () {\n _this.checkVisibleMarkers(markers, map);\n });\n\n // Add event listener for center change\n google.maps.event.addListener(map, 'center_changed', function () {\n _this.checkVisibleMarkers(markers, map);\n });\n\n // Add event listener for zoom change\n google.maps.event.addListener(map, 'zoom_changed', function () {\n _this.checkVisibleMarkers(markers, map);\n });\n },\n\n /**\n\t\t * Restrict featured locations from displaying in results by a specific distance\n\t\t *\n\t\t * @returns {Array}\n\t\t */\n featuredDistanceRestriction: function () {\n this.writeDebug('featuredDistanceRestriction', arguments);\n var _this = this;\n\n featuredset = $.grep(featuredset, function (val) {\n if (val.hasOwnProperty('distance')) {\n return parseFloat(val.distance) <= parseFloat(_this.settings.featuredDistance);\n }\n });\n\n return featuredset;\n },\n\n /**\n\t\t * Restrict featured locations by distance.\n\t\t *\n\t\t * @returns {Array}\n\t\t */\n featuredRestrictions: function (mappingObject) {\n this.writeDebug('featuredRestrictions', arguments);\n\n if (this.settings.featuredDistance === null) {\n return featuredset;\n }\n\n // Featured locations radius restriction.\n if (this.settings.featuredDistance !== null) {\n featuredset = this.featuredDistanceRestriction(mappingObject);\n }\n\n return featuredset;\n },\n\n /**\n\t\t * The primary mapping function that runs everything\n\t\t *\n\t\t * @param mappingObject {Object} all the potential mapping properties - latitude, longitude, origin, name, max\n\t\t * distance, page\n\t\t */\n mapping: function (mappingObject) {\n this.writeDebug('mapping', arguments);\n var _this = this;\n var orig_lat; var orig_lng; var geocodeData; var origin; var originPoint; var\n page;\n if (!this.isEmptyObject(mappingObject)) {\n orig_lat = mappingObject.lat;\n orig_lng = mappingObject.lng;\n geocodeData = mappingObject.geocodeResult;\n origin = mappingObject.origin;\n page = mappingObject.page;\n }\n\n // Set the initial page to zero if not set\n if (_this.settings.pagination === true) {\n if (typeof page === 'undefined' || originalOrigin !== addressInput) {\n page = 0;\n }\n }\n\n // Data request\n if (typeof origin === 'undefined' && this.settings.nameSearch === true) {\n dataRequest = _this._getData();\n } else {\n // Setup the origin point\n originPoint = new google.maps.LatLng(orig_lat, orig_lng);\n\n // If the origin hasn't changed use the existing data so we aren't making unneeded AJAX requests\n if ((typeof originalOrigin !== 'undefined') && (origin === originalOrigin) && (typeof originalData !== 'undefined')) {\n origin = originalOrigin;\n dataRequest = originalData;\n } else {\n // Do the data request - doing this in mapping so the lat/lng and address can be passed over and used if needed\n dataRequest = _this._getData(olat, olng, origin, geocodeData, mappingObject);\n }\n }\n\n // Check filters here to handle selected filtering after page reload\n if (_this.settings.taxonomyFilters !== null && _this.hasEmptyObjectVals(filters)) {\n _this.checkFilters();\n }\n /**\n\t\t\t * Process the location data\n\t\t\t */\n // Raw data\n if (_this.settings.dataRaw !== null) {\n _this.processData(mappingObject, originPoint, dataRequest, page);\n }\n // Remote data\n else {\n dataRequest.done(function (data) {\n _this.processData(mappingObject, originPoint, data, page);\n });\n }\n },\n\n /**\n\t\t * Processes the location data\n\t\t *\n\t\t * @param mappingObject {Object} all the potential mapping properties - latitude, longitude, origin, name, max\n\t\t * distance, page\n\t\t * @param originPoint {Object} LatLng of origin point\n\t\t * @param data {Object} location data\n\t\t * @param page {number} current page number\n\t\t */\n processData: function (mappingObject, originPoint, data, page) {\n this.writeDebug('processData', arguments);\n var _this = this;\n var i = 0;\n var orig_lat; var orig_lng; var origin; var name; var maxDistance; var marker; var bounds; var storeStart; var storeNumToShow; var myOptions; var distError; var openMap; var infowindow; var\n nearestLoc;\n var taxFilters = {};\n var $lengthSwap = $('#' + _this.settings.lengthSwapID);\n\n if (!this.isEmptyObject(mappingObject)) {\n orig_lat = mappingObject.lat;\n orig_lng = mappingObject.lng;\n origin = mappingObject.origin;\n name = mappingObject.name;\n maxDistance = mappingObject.distance;\n }\n\n var $mapDiv = $('#' + _this.settings.mapID);\n // Get the length unit\n var distUnit = (_this.settings.lengthUnit === 'km') ? _this.settings.kilometersLang : _this.settings.milesLang;\n\n // Save data and origin separately so we can potentially avoid multiple AJAX requests\n originalData = dataRequest;\n if (typeof origin !== 'undefined') {\n originalOrigin = origin;\n }\n\n // Callback\n if (_this.settings.callbackSuccess) {\n _this.settings.callbackSuccess.call(this, mappingObject, originPoint, data, page);\n }\n\n openMap = $mapDiv.hasClass('bh-sl-map-open');\n\n // Set a variable for fullMapStart so we can detect the first run\n if (\n (_this.settings.fullMapStart === true && openMap === false)\n\t\t\t\t|| (_this.settings.autoGeocode === true && openMap === false)\n\t\t\t\t|| (_this.settings.defaultLoc === true && openMap === false)\n\t\t\t\t|| reload === true\n ) {\n firstRun = true;\n } else {\n _this.reset();\n }\n\n $mapDiv.addClass('bh-sl-map-open');\n\n // Process the location data depending on the data format type\n if (_this.settings.dataType === 'json' || _this.settings.dataType === 'jsonp') {\n // Process JSON\n for (var x = 0; i < data.length; x++) {\n var obj = data[x];\n var locationData = {};\n\n // Parse each data variable\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n locationData[key] = obj[key];\n }\n }\n\n _this.locationsSetup(locationData, orig_lat, orig_lng, origin, maxDistance);\n\n i++;\n }\n } else if (_this.settings.dataType === 'kml') {\n // Process KML\n $(data).find('Placemark').each(function () {\n var locationData = {};\n\n if (_this.settings.processKmlLocationDataCallback) {\n locationData = _this.settings.processKmlLocationDataCallback.call(this, $(this));\n } else {\n locationData = {\n name: $(this).find('name').text(),\n lat: $(this).find('coordinates').text().split(',')[1],\n lng: $(this).find('coordinates').text().split(',')[0],\n description: $(this).find('description').text()\n };\n }\n\n _this.locationsSetup(locationData, orig_lat, orig_lng, origin, maxDistance);\n\n i++;\n });\n } else {\n // Process XML\n $(data).find(_this.settings.xmlElement).each(function () {\n var locationData = {};\n\n for (var key in this.attributes) {\n if (this.attributes.hasOwnProperty(key)) {\n locationData[this.attributes[key].name] = this.attributes[key].value;\n }\n }\n\n _this.locationsSetup(locationData, orig_lat, orig_lng, origin, maxDistance);\n\n i++;\n });\n }\n\n // Name search - using taxonomy filter to handle\n if (_this.settings.nameSearch === true) {\n if (typeof searchInput !== 'undefined' && searchInput !== '') {\n filters[_this.settings.nameAttribute] = [searchInput];\n }\n }\n\n // Taxonomy filtering setup\n if (_this.settings.taxonomyFilters !== null || _this.settings.nameSearch === true) {\n for (var k in filters) {\n if (filters.hasOwnProperty(k) && filters[k].length > 0) {\n // Let's use regex\n for (var z = 0; z < filters[k].length; z++) {\n // Creating a new object so we don't mess up the original filters\n if (!taxFilters[k]) {\n taxFilters[k] = [];\n }\n\n // Swap pattern matching depending on name search vs. taxonomy filtering.\n if (k === _this.settings.nameAttribute) {\n taxFilters[k][z] = '(?:^|\\\\s)' + filters[k][z].replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\]|&\\s+)/g, '');\n } else {\n taxFilters[k][z] = '(?=.*' + filters[k][z].replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\]|&\\s+)/g, '') + '(?!\\\\s))';\n }\n }\n }\n }\n // Filter the data\n if (!_this.isEmptyObject(taxFilters)) {\n locationset = $.grep(locationset, function (val) {\n return _this.filterData(val, taxFilters);\n });\n }\n }\n\n // Sorting\n if (_this.settings.sortBy !== null && typeof _this.settings.sortBy === 'object') {\n _this.sortCustom(locationset);\n } else {\n // Sort the multi-dimensional array by distance\n if (typeof origin !== 'undefined') {\n _this.sortNumerically(locationset);\n }\n\n // Check the closest marker\n if (_this.isEmptyObject(taxFilters)) {\n if (_this.settings.maxDistance === true && maxDistance) {\n if (typeof locationset[0] === 'undefined' || locationset[0].distance > maxDistance) {\n _this.notify(_this.settings.distanceErrorAlert + maxDistance + ' ' + distUnit);\n }\n } else if (typeof locationset[0] !== 'undefined') {\n if (_this.settings.distanceAlert !== -1 && locationset[0].distance > _this.settings.distanceAlert) {\n _this.notify(_this.settings.distanceErrorAlert + _this.settings.distanceAlert + ' ' + distUnit);\n distError = true;\n }\n } else {\n throw new Error('No locations found. Please check the dataLocation setting and path.');\n }\n }\n\n // Save the closest location to a variable for openNearest setting.\n if (typeof locationset[0] !== 'undefined') {\n nearestLoc = locationset[0];\n }\n }\n\n // filter locations to display only n stores based on location prop\n if (_this.settings.filterLocationsCallback) {\n var _locationSet = locationset;\n locationset = _this.settings.filterLocationsCallback.call(this, _locationSet);\n }\n\n // Featured locations filtering\n if (_this.settings.featuredLocations === true) {\n // Create array for featured locations\n featuredset = $.grep(locationset, function (val) {\n if (val.hasOwnProperty('featured')) {\n return val.featured === 'true';\n }\n });\n\n // Featured location restrictions.\n featuredset = _this.featuredRestrictions(mappingObject);\n\n // Create array for normal locations\n normalset = $.grep(locationset, function (val) {\n if (val.hasOwnProperty('featured')) {\n return val.featured !== 'true';\n }\n });\n\n // Combine the arrays\n locationset = [];\n locationset = featuredset.concat(normalset);\n }\n\n // Slide in the map container\n if (_this.settings.slideMap === true) {\n $this.slideDown();\n }\n\n // Output page numbers if pagination setting is true\n if (_this.settings.pagination === true) {\n _this.paginationSetup(page);\n }\n\n // Alternative method to display no results if locations are too far away instead of all locations.\n if (_this.settings.altDistanceNoResult === true && nearestLoc.distance > _this.settings.distanceAlert) {\n _this.emptyResult();\n return;\n }\n\n // Handle no results\n if (_this.isEmptyObject(locationset) || locationset[0].result === 'none') {\n _this.emptyResult();\n return;\n }\n\n // Set up the modal window\n _this.modalWindow();\n\n // Avoid error if number of locations is less than the default of 26\n if (_this.settings.storeLimit === -1 || locationset.length < _this.settings.storeLimit || (this.settings.fullMapStart === true && firstRun === true && (!isNaN(this.settings.fullMapStartListLimit) || this.settings.fullMapStartListLimit > 26 || this.settings.fullMapStartListLimit === -1))) {\n storeNum = locationset.length;\n } else {\n storeNum = _this.settings.storeLimit;\n }\n\n // If pagination is on, change the store limit to the setting and slice the locationset array\n if (_this.settings.pagination === true) {\n storeNumToShow = _this.settings.locationsPerPage;\n storeStart = page * _this.settings.locationsPerPage;\n\n if ((storeStart + storeNumToShow) > locationset.length) {\n storeNumToShow = _this.settings.locationsPerPage - ((storeStart + storeNumToShow) - locationset.length);\n }\n\n locationset = locationset.slice(storeStart, storeStart + storeNumToShow);\n storeNum = locationset.length;\n } else {\n storeNumToShow = storeNum;\n storeStart = 0;\n }\n\n // Output location results count\n _this.resultsTotalCount(locationset.length);\n\n // Google maps settings\n if ((_this.settings.fullMapStart === true && firstRun === true && _this.settings.querystringParams !== true) || (_this.settings.mapSettings.zoom === 0) || (typeof origin === 'undefined') || (distError === true)) {\n myOptions = _this.settings.mapSettings;\n bounds = new google.maps.LatLngBounds();\n } else if (_this.settings.pagination === true) {\n // Update the map to focus on the first point in the new set\n var nextPoint = new google.maps.LatLng(locationset[0].lat, locationset[0].lng);\n\n if (page === 0) {\n _this.settings.mapSettings.center = originPoint;\n myOptions = _this.settings.mapSettings;\n } else {\n _this.settings.mapSettings.center = nextPoint;\n myOptions = _this.settings.mapSettings;\n }\n } else {\n _this.settings.mapSettings.center = originPoint;\n myOptions = _this.settings.mapSettings;\n }\n\n // Create the map\n _this.map = new google.maps.Map(document.getElementById(_this.settings.mapID), myOptions);\n\n // Re-center the map when the browser is re-sized\n google.maps.event.addDomListener(window, 'resize', function () {\n var center = _this.map.getCenter();\n google.maps.event.trigger(_this.map, 'resize');\n _this.map.setCenter(center);\n });\n\n // Add map drag listener if setting is enabled and re-search on drag end\n if (_this.settings.dragSearch === true) {\n _this.map.addListener('dragend', function () {\n _this.dragSearch(_this.map);\n });\n }\n\n // Load the map\n $this.data(_this.settings.mapID.replace('#', ''), _this.map);\n\n // Map set callback.\n if (_this.settings.callbackMapSet) {\n _this.settings.callbackMapSet.call(this, _this.map, originPoint, originalZoom, myOptions);\n }\n\n // Initialize the infowondow\n if (typeof InfoBubble !== 'undefined' && _this.settings.infoBubble !== null) {\n var infoBubbleSettings = _this.settings.infoBubble;\n infoBubbleSettings.map = _this.map;\n\n infowindow = new InfoBubble(infoBubbleSettings);\n } else {\n infowindow = new google.maps.InfoWindow();\n }\n\n // Add origin marker if the setting is set\n _this.originMarker(_this.map, origin, originPoint);\n\n // Handle pagination\n $(document).on('click.' + pluginName, '.bh-sl-pagination li', function (e) {\n e.preventDefault();\n // Run paginationChange\n _this.paginationChange($(this).attr('data-page'));\n });\n\n // Inline directions\n _this.inlineDirections(_this.map, origin);\n\n // Add markers and infowindows loop\n for (var y = 0; y <= storeNumToShow - 1; y++) {\n var letter = '';\n\n if (page > 0) {\n letter = String.fromCharCode('A'.charCodeAt(0) + (storeStart + y));\n } else {\n letter = String.fromCharCode('A'.charCodeAt(0) + y);\n }\n\n var point = new google.maps.LatLng(locationset[y].lat, locationset[y].lng);\n marker = _this.createMarker(point, locationset[y].name, locationset[y].address, letter, _this.map, locationset[y].category);\n marker.set('id', y);\n markers[y] = marker;\n if ((_this.settings.fullMapStart === true && firstRun === true && _this.settings.querystringParams !== true) || (_this.settings.mapSettings.zoom === 0) || (typeof origin === 'undefined') || (distError === true)) {\n bounds.extend(point);\n }\n // Pass variables to the pop-up infowindows\n _this.createInfowindow(marker, null, infowindow, storeStart, page);\n }\n\n // Center and zoom if no origin or zoom was provided, or distance of first marker is greater than distanceAlert\n if ((_this.settings.fullMapStart === true && firstRun === true && _this.settings.querystringParams !== true) || (_this.settings.mapSettings.zoom === 0) || (typeof origin === 'undefined') || (distError === true)) {\n _this.map.fitBounds(bounds);\n }\n\n // Create the links that focus on the related marker\n var locList = $('.' + _this.settings.locationList + ' ul');\n locList.empty();\n\n // Set up the location list markup\n if (firstRun && _this.settings.fullMapStartListLimit !== false && !isNaN(_this.settings.fullMapStartListLimit) && _this.settings.fullMapStartListLimit !== -1 && markers.length > _this.settings.fullMapStartListLimit) {\n for (var m = 0; m < _this.settings.fullMapStartListLimit; m++) {\n var currentMarker = markers[m];\n _this.listSetup(currentMarker, storeStart, page);\n }\n } else {\n $(markers).each(function (x) {\n var currentMarker = markers[x];\n _this.listSetup(currentMarker, storeStart, page);\n });\n }\n\n // Length unit swap setup\n if ($lengthSwap.length) {\n _this.lengthUnitSwap($lengthSwap);\n\n $lengthSwap.on('change.' + pluginName, function (e) {\n e.stopPropagation();\n _this.lengthUnitSwap($lengthSwap);\n });\n }\n\n // Open nearest location.\n _this.openNearestLocation(nearestLoc, infowindow, storeStart, page);\n\n // MarkerClusterer setup\n if (typeof MarkerClusterer !== 'undefined' && _this.settings.markerCluster !== null) {\n var markerCluster = new MarkerClusterer(_this.map, markers, _this.settings.markerCluster);\n }\n\n // Handle clicks from the list\n if (!_this.settings.disableNativeListClick) {\n _this.listClick(_this.map, infowindow, storeStart, page);\n }\n\n // Add the list li background colors - this wil be dropped in a future version in favor of CSS\n $('.' + _this.settings.locationList + ' ul > li:even').css('background', _this.settings.listColor1);\n $('.' + _this.settings.locationList + ' ul > li:odd').css('background', _this.settings.listColor2);\n\n // Visible markers list\n _this.visibleMarkersList(_this.map, markers);\n\n // Modal ready callback\n if (_this.settings.modal === true && _this.settings.callbackModalReady) {\n _this.settings.callbackModalReady.call(this, mappingObject);\n }\n\n if (_this.settings.onInfoWindowLoadCallback) {\n google.maps.event.addListener(infowindow, 'domready', function () {\n _this.settings.onInfoWindowLoadCallback.call(this, _this.settings);\n });\n }\n\n // Filters callback\n\n if (_this.settings.callbackFilters) {\n _this.settings.callbackFilters.call(this, filters, mappingObject);\n }\n\n // callback called when all is loaded\n if (_this.settings.afterSuccessCallback) {\n _this.settings.afterSuccessCallback.call(this, _this.settings);\n }\n\n if (_this.settings.shouldReset) {\n this.reset();\n }\n },\n\n /**\n\t\t * console.log helper function\n\t\t *\n\t\t * http://www.briangrinstead.com/blog/console-log-helper-function\n\t\t */\n writeDebug: function () {\n if (window.console && this.settings.debug) {\n // Only run on the first time through - reset this function to the appropriate console.log helper\n if (Function.prototype.bind) {\n this.writeDebug = Function.prototype.bind.call(console.log, console, 'StoreLocator :');\n } else {\n this.writeDebug = function () {\n arguments[0] = 'StoreLocator : ' + arguments[0];\n Function.prototype.apply.call(console.log, console, arguments);\n };\n }\n this.writeDebug.apply(this, arguments);\n }\n }\n\n });\n\n // A really lightweight plugin wrapper around the constructor,\n // preventing against multiple instantiations and allowing any\n // public function (ie. a function whose name doesn't start\n // with an underscore) to be called via the jQuery plugin,\n // e.g. $(element).defaultPluginName('functionName', arg1, arg2)\n $.fn[pluginName] = function (options) {\n var args = arguments;\n // Is the first parameter an object (options), or was omitted, instantiate a new instance of the plugin\n if (options === undefined || typeof options === 'object') {\n return this.each(function () {\n // Only allow the plugin to be instantiated once, so we check that the element has no plugin instantiation yet\n if (!$.data(this, 'plugin_' + pluginName)) {\n // If it has no instance, create a new one, pass options to our plugin constructor, and store the plugin instance in the elements jQuery data object.\n $.data(this, 'plugin_' + pluginName, new Plugin(this, options));\n }\n });\n // Treat this as a call to a public method\n } if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {\n // Cache the method call to make it possible to return a value\n var returns;\n\n this.each(function () {\n var instance = $.data(this, 'plugin_' + pluginName);\n\n // Tests that there's already a plugin-instance and checks that the requested public method exists\n if (instance instanceof Plugin && typeof instance[options] === 'function') {\n // Call the method of our plugin instance, and pass it the supplied arguments.\n returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));\n }\n\n // Allow instances to be destroyed via the 'destroy' method\n if (options === 'destroy') {\n $.data(this, 'plugin_' + pluginName, null);\n }\n });\n\n // If the earlier cached method gives a value back return the value, otherwise return this to preserve chainability.\n return returns !== undefined ? returns : this;\n }\n };\n}(jQuery, window, document));\n","'use strict';\n\nvar notificationHelpers = require('../common/notifications');\nvar inStore = require('./inStore');\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#inStoreLocatorDrawer').length !== 0) {\n $('#inStoreLocatorDrawer').remove();\n }\n var htmlString = '<!-- Modal -->'\n + '<div class=\"modal right fade\" id=\"inStoreLocatorDrawer\" tabindex=\"-1\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog quick-view-dialog\">'\n + '<!-- Modal content-->'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span aria-hidden=\"true\">×</span>'\n + ' <span class=\"sr-only\"> </span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '<div class=\"modal-footer\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n\n $('body').append(htmlString);\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.in-store');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window for popup book address.\n * @param {string} url - url to be used to retrieve store locator drawer elements\n */\nfunction fillOutDrawerElements(url) {\n $.spinner().start();\n var drawer = $('#inStoreLocatorDrawer');\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n drawer.find('.modal-body').empty().html(parsedHtml.body);\n drawer.find('.modal-footer').html(parsedHtml.footer);\n drawer.find('.modal-header .close .sr-only').text(data.closeButtonText);\n drawer.find('.enter-message').text(data.enterDialogMessage);\n drawer.modal('show');\n\n var storeLocatorTemplates = $(parsedHtml.body).find('.all-stores-locator-templates');\n initStoreLocator(storeLocatorTemplates);\n\n $.spinner().stop();\n },\n error: function (err) {\n $.spinner().stop();\n drawer.modal('hide');\n if (err.responseJSON) {\n notificationHelpers.createErrorNotification(err.responseJSON.errorMessage);\n }\n }\n });\n}\n\n/**\n * Init Store locator for in store drawer\n * @param {jQuery} templates handlebars templates for jquery store locator plugin\n */\nfunction initStoreLocator(templates) {\n var url = $('#nearestStoreUrl').val();\n inStore.methods.loadAllNearestStores(url, templates);\n}\n\n$('.btn-change-store').on('click', function (e) {\n e.preventDefault();\n getModalHtmlElement();\n var url = $(this).attr('href');\n fillOutDrawerElements(url);\n});\n\n$('body').on('storedrawer:reinit', function () {\n $('.btn-change-store').off('click').on('click', function (e) {\n e.preventDefault();\n getModalHtmlElement();\n var url = $(this).attr('href');\n fillOutDrawerElements(url);\n });\n});\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\nvar base = require('./base');\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n $('button.add-to-cart-global').attr('disabled', enableOrDisable);\n}\n\nmodule.exports = {\n methods: {\n updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n },\n\n availability: base.availability,\n\n addToCart: base.addToCart,\n\n updateAttributesAndDetails: function () {\n $('body').on('product:statusUpdate', function (e, data) {\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n $productContainer.find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description')\n .addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details')\n .addClass('hidden-xl-down');\n }\n });\n },\n\n showSpinner: function () {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.product-detail>.bundle-items').length) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else if ($('.product-set-detail').eq(0)) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.product-id').text(response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n var enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n $('.availability-msg', response.$productContainer)\n .empty().html(response.message);\n\n if ($('.global-availability').length) {\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n }\n });\n },\n sizeChart: function () {\n $('.size-chart a').on('click', function (e) {\n e.preventDefault();\n var url = $(this).attr('href');\n var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\n if ($prodSizeChart.is(':empty')) {\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $prodSizeChart.append(data.content);\n }\n });\n }\n $prodSizeChart.toggleClass('active');\n });\n\n var $sizeChart = $('.size-chart-collapsible');\n $('body').on('click touchstart', function (e) {\n if ($('.size-chart').has(e.target).length <= 0) {\n $sizeChart.removeClass('active');\n }\n });\n },\n copyProductLink: function () {\n $('body').on('click', '#fa-link', function () {\n event.preventDefault();\n var $temp = $('<input>');\n $('body').append($temp);\n $temp.val($('#shareUrl').val()).select();\n document.execCommand('copy');\n $temp.remove();\n $('.copy-link-message').attr('role', 'alert');\n $('.copy-link-message').removeClass('d-none');\n setTimeout(function () {\n $('.copy-link-message').addClass('d-none');\n }, 3000);\n });\n },\n\n focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n","/*\n _ _ _ _\n ___| (_) ___| | __ (_)___\n/ __| | |/ __| |/ / | / __|\n\\__ \\ | | (__| < _ | \\__ \\\n|___/_|_|\\___|_|\\_(_)/ |___/\n |__/\n\n Version: 1.8.1\n Author: Ken Wheeler\n Website: http://kenwheeler.github.io\n Docs: http://kenwheeler.github.io/slick\n Repo: http://github.com/kenwheeler/slick\n Issues: http://github.com/kenwheeler/slick/issues\n\n */\n/* global window, document, define, jQuery, setInterval, clearInterval */\n;(function(factory) {\n 'use strict';\n if (typeof define === 'function' && define.amd) {\n define(['jquery'], factory);\n } else if (typeof exports !== 'undefined') {\n module.exports = factory(require('jquery'));\n } else {\n factory(jQuery);\n }\n\n}(function($) {\n 'use strict';\n var Slick = window.Slick || {};\n\n Slick = (function() {\n\n var instanceUid = 0;\n\n function Slick(element, settings) {\n\n var _ = this, dataSettings;\n\n _.defaults = {\n accessibility: true,\n adaptiveHeight: false,\n appendArrows: $(element),\n appendDots: $(element),\n arrows: true,\n asNavFor: null,\n prevArrow: '<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',\n nextArrow: '<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',\n autoplay: false,\n autoplaySpeed: 3000,\n centerMode: false,\n centerPadding: '50px',\n cssEase: 'ease',\n customPaging: function(slider, i) {\n return $('<button type=\"button\" />').text(i + 1);\n },\n dots: false,\n dotsClass: 'slick-dots',\n draggable: true,\n easing: 'linear',\n edgeFriction: 0.35,\n fade: false,\n focusOnSelect: false,\n focusOnChange: false,\n infinite: true,\n initialSlide: 0,\n lazyLoad: 'ondemand',\n mobileFirst: false,\n pauseOnHover: true,\n pauseOnFocus: true,\n pauseOnDotsHover: false,\n respondTo: 'window',\n responsive: null,\n rows: 1,\n rtl: false,\n slide: '',\n slidesPerRow: 1,\n slidesToShow: 1,\n slidesToScroll: 1,\n speed: 500,\n swipe: true,\n swipeToSlide: false,\n touchMove: true,\n touchThreshold: 5,\n useCSS: true,\n useTransform: true,\n variableWidth: false,\n vertical: false,\n verticalSwiping: false,\n waitForAnimate: true,\n zIndex: 1000\n };\n\n _.initials = {\n animating: false,\n dragging: false,\n autoPlayTimer: null,\n currentDirection: 0,\n currentLeft: null,\n currentSlide: 0,\n direction: 1,\n $dots: null,\n listWidth: null,\n listHeight: null,\n loadIndex: 0,\n $nextArrow: null,\n $prevArrow: null,\n scrolling: false,\n slideCount: null,\n slideWidth: null,\n $slideTrack: null,\n $slides: null,\n sliding: false,\n slideOffset: 0,\n swipeLeft: null,\n swiping: false,\n $list: null,\n touchObject: {},\n transformsEnabled: false,\n unslicked: false\n };\n\n $.extend(_, _.initials);\n\n _.activeBreakpoint = null;\n _.animType = null;\n _.animProp = null;\n _.breakpoints = [];\n _.breakpointSettings = [];\n _.cssTransitions = false;\n _.focussed = false;\n _.interrupted = false;\n _.hidden = 'hidden';\n _.paused = true;\n _.positionProp = null;\n _.respondTo = null;\n _.rowCount = 1;\n _.shouldClick = true;\n _.$slider = $(element);\n _.$slidesCache = null;\n _.transformType = null;\n _.transitionType = null;\n _.visibilityChange = 'visibilitychange';\n _.windowWidth = 0;\n _.windowTimer = null;\n\n dataSettings = $(element).data('slick') || {};\n\n _.options = $.extend({}, _.defaults, settings, dataSettings);\n\n _.currentSlide = _.options.initialSlide;\n\n _.originalSettings = _.options;\n\n if (typeof document.mozHidden !== 'undefined') {\n _.hidden = 'mozHidden';\n _.visibilityChange = 'mozvisibilitychange';\n } else if (typeof document.webkitHidden !== 'undefined') {\n _.hidden = 'webkitHidden';\n _.visibilityChange = 'webkitvisibilitychange';\n }\n\n _.autoPlay = $.proxy(_.autoPlay, _);\n _.autoPlayClear = $.proxy(_.autoPlayClear, _);\n _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);\n _.changeSlide = $.proxy(_.changeSlide, _);\n _.clickHandler = $.proxy(_.clickHandler, _);\n _.selectHandler = $.proxy(_.selectHandler, _);\n _.setPosition = $.proxy(_.setPosition, _);\n _.swipeHandler = $.proxy(_.swipeHandler, _);\n _.dragHandler = $.proxy(_.dragHandler, _);\n _.keyHandler = $.proxy(_.keyHandler, _);\n\n _.instanceUid = instanceUid++;\n\n // A simple way to check for HTML strings\n // Strict HTML recognition (must start with <)\n // Extracted from jQuery v1.11 source\n _.htmlExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*)$/;\n\n\n _.registerBreakpoints();\n _.init(true);\n\n }\n\n return Slick;\n\n }());\n\n Slick.prototype.activateADA = function() {\n var _ = this;\n\n _.$slideTrack.find('.slick-active').attr({\n 'aria-hidden': 'false'\n }).find('a, input, button, select').attr({\n 'tabindex': '0'\n });\n\n };\n\n Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {\n\n var _ = this;\n\n if (typeof(index) === 'boolean') {\n addBefore = index;\n index = null;\n } else if (index < 0 || (index >= _.slideCount)) {\n return false;\n }\n\n _.unload();\n\n if (typeof(index) === 'number') {\n if (index === 0 && _.$slides.length === 0) {\n $(markup).appendTo(_.$slideTrack);\n } else if (addBefore) {\n $(markup).insertBefore(_.$slides.eq(index));\n } else {\n $(markup).insertAfter(_.$slides.eq(index));\n }\n } else {\n if (addBefore === true) {\n $(markup).prependTo(_.$slideTrack);\n } else {\n $(markup).appendTo(_.$slideTrack);\n }\n }\n\n _.$slides = _.$slideTrack.children(this.options.slide);\n\n _.$slideTrack.children(this.options.slide).detach();\n\n _.$slideTrack.append(_.$slides);\n\n _.$slides.each(function(index, element) {\n $(element).attr('data-slick-index', index);\n });\n\n _.$slidesCache = _.$slides;\n\n _.reinit();\n\n };\n\n Slick.prototype.animateHeight = function() {\n var _ = this;\n if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n _.$list.animate({\n height: targetHeight\n }, _.options.speed);\n }\n };\n\n Slick.prototype.animateSlide = function(targetLeft, callback) {\n\n var animProps = {},\n _ = this;\n\n _.animateHeight();\n\n if (_.options.rtl === true && _.options.vertical === false) {\n targetLeft = -targetLeft;\n }\n if (_.transformsEnabled === false) {\n if (_.options.vertical === false) {\n _.$slideTrack.animate({\n left: targetLeft\n }, _.options.speed, _.options.easing, callback);\n } else {\n _.$slideTrack.animate({\n top: targetLeft\n }, _.options.speed, _.options.easing, callback);\n }\n\n } else {\n\n if (_.cssTransitions === false) {\n if (_.options.rtl === true) {\n _.currentLeft = -(_.currentLeft);\n }\n $({\n animStart: _.currentLeft\n }).animate({\n animStart: targetLeft\n }, {\n duration: _.options.speed,\n easing: _.options.easing,\n step: function(now) {\n now = Math.ceil(now);\n if (_.options.vertical === false) {\n animProps[_.animType] = 'translate(' +\n now + 'px, 0px)';\n _.$slideTrack.css(animProps);\n } else {\n animProps[_.animType] = 'translate(0px,' +\n now + 'px)';\n _.$slideTrack.css(animProps);\n }\n },\n complete: function() {\n if (callback) {\n callback.call();\n }\n }\n });\n\n } else {\n\n _.applyTransition();\n targetLeft = Math.ceil(targetLeft);\n\n if (_.options.vertical === false) {\n animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';\n } else {\n animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';\n }\n _.$slideTrack.css(animProps);\n\n if (callback) {\n setTimeout(function() {\n\n _.disableTransition();\n\n callback.call();\n }, _.options.speed);\n }\n\n }\n\n }\n\n };\n\n Slick.prototype.getNavTarget = function() {\n\n var _ = this,\n asNavFor = _.options.asNavFor;\n\n if ( asNavFor && asNavFor !== null ) {\n asNavFor = $(asNavFor).not(_.$slider);\n }\n\n return asNavFor;\n\n };\n\n Slick.prototype.asNavFor = function(index) {\n\n var _ = this,\n asNavFor = _.getNavTarget();\n\n if ( asNavFor !== null && typeof asNavFor === 'object' ) {\n asNavFor.each(function() {\n var target = $(this).slick('getSlick');\n if(!target.unslicked) {\n target.slideHandler(index, true);\n }\n });\n }\n\n };\n\n Slick.prototype.applyTransition = function(slide) {\n\n var _ = this,\n transition = {};\n\n if (_.options.fade === false) {\n transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;\n } else {\n transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;\n }\n\n if (_.options.fade === false) {\n _.$slideTrack.css(transition);\n } else {\n _.$slides.eq(slide).css(transition);\n }\n\n };\n\n Slick.prototype.autoPlay = function() {\n\n var _ = this;\n\n _.autoPlayClear();\n\n if ( _.slideCount > _.options.slidesToShow ) {\n _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );\n }\n\n };\n\n Slick.prototype.autoPlayClear = function() {\n\n var _ = this;\n\n if (_.autoPlayTimer) {\n clearInterval(_.autoPlayTimer);\n }\n\n };\n\n Slick.prototype.autoPlayIterator = function() {\n\n var _ = this,\n slideTo = _.currentSlide + _.options.slidesToScroll;\n\n if ( !_.paused && !_.interrupted && !_.focussed ) {\n\n if ( _.options.infinite === false ) {\n\n if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {\n _.direction = 0;\n }\n\n else if ( _.direction === 0 ) {\n\n slideTo = _.currentSlide - _.options.slidesToScroll;\n\n if ( _.currentSlide - 1 === 0 ) {\n _.direction = 1;\n }\n\n }\n\n }\n\n _.slideHandler( slideTo );\n\n }\n\n };\n\n Slick.prototype.buildArrows = function() {\n\n var _ = this;\n\n if (_.options.arrows === true ) {\n\n _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');\n _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');\n\n if( _.slideCount > _.options.slidesToShow ) {\n\n _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n\n if (_.htmlExpr.test(_.options.prevArrow)) {\n _.$prevArrow.prependTo(_.options.appendArrows);\n }\n\n if (_.htmlExpr.test(_.options.nextArrow)) {\n _.$nextArrow.appendTo(_.options.appendArrows);\n }\n\n if (_.options.infinite !== true) {\n _.$prevArrow\n .addClass('slick-disabled')\n .attr('aria-disabled', 'true');\n }\n\n } else {\n\n _.$prevArrow.add( _.$nextArrow )\n\n .addClass('slick-hidden')\n .attr({\n 'aria-disabled': 'true',\n 'tabindex': '-1'\n });\n\n }\n\n }\n\n };\n\n Slick.prototype.buildDots = function() {\n\n var _ = this,\n i, dot;\n\n if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n _.$slider.addClass('slick-dotted');\n\n dot = $('<ul />').addClass(_.options.dotsClass);\n\n for (i = 0; i <= _.getDotCount(); i += 1) {\n dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));\n }\n\n _.$dots = dot.appendTo(_.options.appendDots);\n\n _.$dots.find('li').first().addClass('slick-active');\n\n }\n\n };\n\n Slick.prototype.buildOut = function() {\n\n var _ = this;\n\n _.$slides =\n _.$slider\n .children( _.options.slide + ':not(.slick-cloned)')\n .addClass('slick-slide');\n\n _.slideCount = _.$slides.length;\n\n _.$slides.each(function(index, element) {\n $(element)\n .attr('data-slick-index', index)\n .data('originalStyling', $(element).attr('style') || '');\n });\n\n _.$slider.addClass('slick-slider');\n\n _.$slideTrack = (_.slideCount === 0) ?\n $('<div class=\"slick-track\"/>').appendTo(_.$slider) :\n _.$slides.wrapAll('<div class=\"slick-track\"/>').parent();\n\n _.$list = _.$slideTrack.wrap(\n '<div class=\"slick-list\"/>').parent();\n _.$slideTrack.css('opacity', 0);\n\n if (_.options.centerMode === true || _.options.swipeToSlide === true) {\n _.options.slidesToScroll = 1;\n }\n\n $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');\n\n _.setupInfinite();\n\n _.buildArrows();\n\n _.buildDots();\n\n _.updateDots();\n\n\n _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n if (_.options.draggable === true) {\n _.$list.addClass('draggable');\n }\n\n };\n\n Slick.prototype.buildRows = function() {\n\n var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;\n\n newSlides = document.createDocumentFragment();\n originalSlides = _.$slider.children();\n\n if(_.options.rows > 0) {\n\n slidesPerSection = _.options.slidesPerRow * _.options.rows;\n numOfSlides = Math.ceil(\n originalSlides.length / slidesPerSection\n );\n\n for(a = 0; a < numOfSlides; a++){\n var slide = document.createElement('div');\n for(b = 0; b < _.options.rows; b++) {\n var row = document.createElement('div');\n for(c = 0; c < _.options.slidesPerRow; c++) {\n var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));\n if (originalSlides.get(target)) {\n row.appendChild(originalSlides.get(target));\n }\n }\n slide.appendChild(row);\n }\n newSlides.appendChild(slide);\n }\n\n _.$slider.empty().append(newSlides);\n _.$slider.children().children().children()\n .css({\n 'width':(100 / _.options.slidesPerRow) + '%',\n 'display': 'inline-block'\n });\n\n }\n\n };\n\n Slick.prototype.checkResponsive = function(initial, forceUpdate) {\n\n var _ = this,\n breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;\n var sliderWidth = _.$slider.width();\n var windowWidth = window.innerWidth || $(window).width();\n\n if (_.respondTo === 'window') {\n respondToWidth = windowWidth;\n } else if (_.respondTo === 'slider') {\n respondToWidth = sliderWidth;\n } else if (_.respondTo === 'min') {\n respondToWidth = Math.min(windowWidth, sliderWidth);\n }\n\n if ( _.options.responsive &&\n _.options.responsive.length &&\n _.options.responsive !== null) {\n\n targetBreakpoint = null;\n\n for (breakpoint in _.breakpoints) {\n if (_.breakpoints.hasOwnProperty(breakpoint)) {\n if (_.originalSettings.mobileFirst === false) {\n if (respondToWidth < _.breakpoints[breakpoint]) {\n targetBreakpoint = _.breakpoints[breakpoint];\n }\n } else {\n if (respondToWidth > _.breakpoints[breakpoint]) {\n targetBreakpoint = _.breakpoints[breakpoint];\n }\n }\n }\n }\n\n if (targetBreakpoint !== null) {\n if (_.activeBreakpoint !== null) {\n if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {\n _.activeBreakpoint =\n targetBreakpoint;\n if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n _.unslick(targetBreakpoint);\n } else {\n _.options = $.extend({}, _.originalSettings,\n _.breakpointSettings[\n targetBreakpoint]);\n if (initial === true) {\n _.currentSlide = _.options.initialSlide;\n }\n _.refresh(initial);\n }\n triggerBreakpoint = targetBreakpoint;\n }\n } else {\n _.activeBreakpoint = targetBreakpoint;\n if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n _.unslick(targetBreakpoint);\n } else {\n _.options = $.extend({}, _.originalSettings,\n _.breakpointSettings[\n targetBreakpoint]);\n if (initial === true) {\n _.currentSlide = _.options.initialSlide;\n }\n _.refresh(initial);\n }\n triggerBreakpoint = targetBreakpoint;\n }\n } else {\n if (_.activeBreakpoint !== null) {\n _.activeBreakpoint = null;\n _.options = _.originalSettings;\n if (initial === true) {\n _.currentSlide = _.options.initialSlide;\n }\n _.refresh(initial);\n triggerBreakpoint = targetBreakpoint;\n }\n }\n\n // only trigger breakpoints during an actual break. not on initialize.\n if( !initial && triggerBreakpoint !== false ) {\n _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);\n }\n }\n\n };\n\n Slick.prototype.changeSlide = function(event, dontAnimate) {\n\n var _ = this,\n $target = $(event.currentTarget),\n indexOffset, slideOffset, unevenOffset;\n\n // If target is a link, prevent default action.\n if($target.is('a')) {\n event.preventDefault();\n }\n\n // If target is not the <li> element (ie: a child), find the <li>.\n if(!$target.is('li')) {\n $target = $target.closest('li');\n }\n\n unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);\n indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;\n\n switch (event.data.message) {\n\n case 'previous':\n slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;\n if (_.slideCount > _.options.slidesToShow) {\n _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);\n }\n break;\n\n case 'next':\n slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;\n if (_.slideCount > _.options.slidesToShow) {\n _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);\n }\n break;\n\n case 'index':\n var index = event.data.index === 0 ? 0 :\n event.data.index || $target.index() * _.options.slidesToScroll;\n\n _.slideHandler(_.checkNavigable(index), false, dontAnimate);\n $target.children().trigger('focus');\n break;\n\n default:\n return;\n }\n\n };\n\n Slick.prototype.checkNavigable = function(index) {\n\n var _ = this,\n navigables, prevNavigable;\n\n navigables = _.getNavigableIndexes();\n prevNavigable = 0;\n if (index > navigables[navigables.length - 1]) {\n index = navigables[navigables.length - 1];\n } else {\n for (var n in navigables) {\n if (index < navigables[n]) {\n index = prevNavigable;\n break;\n }\n prevNavigable = navigables[n];\n }\n }\n\n return index;\n };\n\n Slick.prototype.cleanUpEvents = function() {\n\n var _ = this;\n\n if (_.options.dots && _.$dots !== null) {\n\n $('li', _.$dots)\n .off('click.slick', _.changeSlide)\n .off('mouseenter.slick', $.proxy(_.interrupt, _, true))\n .off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n if (_.options.accessibility === true) {\n _.$dots.off('keydown.slick', _.keyHandler);\n }\n }\n\n _.$slider.off('focus.slick blur.slick');\n\n if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);\n _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);\n\n if (_.options.accessibility === true) {\n _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);\n _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);\n }\n }\n\n _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);\n _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);\n _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);\n _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);\n\n _.$list.off('click.slick', _.clickHandler);\n\n $(document).off(_.visibilityChange, _.visibility);\n\n _.cleanUpSlideEvents();\n\n if (_.options.accessibility === true) {\n _.$list.off('keydown.slick', _.keyHandler);\n }\n\n if (_.options.focusOnSelect === true) {\n $(_.$slideTrack).children().off('click.slick', _.selectHandler);\n }\n\n $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);\n\n $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);\n\n $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);\n\n $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);\n\n };\n\n Slick.prototype.cleanUpSlideEvents = function() {\n\n var _ = this;\n\n _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));\n _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n };\n\n Slick.prototype.cleanUpRows = function() {\n\n var _ = this, originalSlides;\n\n if(_.options.rows > 0) {\n originalSlides = _.$slides.children().children();\n originalSlides.removeAttr('style');\n _.$slider.empty().append(originalSlides);\n }\n\n };\n\n Slick.prototype.clickHandler = function(event) {\n\n var _ = this;\n\n if (_.shouldClick === false) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n }\n\n };\n\n Slick.prototype.destroy = function(refresh) {\n\n var _ = this;\n\n _.autoPlayClear();\n\n _.touchObject = {};\n\n _.cleanUpEvents();\n\n $('.slick-cloned', _.$slider).detach();\n\n if (_.$dots) {\n _.$dots.remove();\n }\n\n if ( _.$prevArrow && _.$prevArrow.length ) {\n\n _.$prevArrow\n .removeClass('slick-disabled slick-arrow slick-hidden')\n .removeAttr('aria-hidden aria-disabled tabindex')\n .css('display','');\n\n if ( _.htmlExpr.test( _.options.prevArrow )) {\n _.$prevArrow.remove();\n }\n }\n\n if ( _.$nextArrow && _.$nextArrow.length ) {\n\n _.$nextArrow\n .removeClass('slick-disabled slick-arrow slick-hidden')\n .removeAttr('aria-hidden aria-disabled tabindex')\n .css('display','');\n\n if ( _.htmlExpr.test( _.options.nextArrow )) {\n _.$nextArrow.remove();\n }\n }\n\n\n if (_.$slides) {\n\n _.$slides\n .removeClass('slick-slide slick-active slick-center slick-visible slick-current')\n .removeAttr('aria-hidden')\n .removeAttr('data-slick-index')\n .each(function(){\n $(this).attr('style', $(this).data('originalStyling'));\n });\n\n _.$slideTrack.children(this.options.slide).detach();\n\n _.$slideTrack.detach();\n\n _.$list.detach();\n\n _.$slider.append(_.$slides);\n }\n\n _.cleanUpRows();\n\n _.$slider.removeClass('slick-slider');\n _.$slider.removeClass('slick-initialized');\n _.$slider.removeClass('slick-dotted');\n\n _.unslicked = true;\n\n if(!refresh) {\n _.$slider.trigger('destroy', [_]);\n }\n\n };\n\n Slick.prototype.disableTransition = function(slide) {\n\n var _ = this,\n transition = {};\n\n transition[_.transitionType] = '';\n\n if (_.options.fade === false) {\n _.$slideTrack.css(transition);\n } else {\n _.$slides.eq(slide).css(transition);\n }\n\n };\n\n Slick.prototype.fadeSlide = function(slideIndex, callback) {\n\n var _ = this;\n\n if (_.cssTransitions === false) {\n\n _.$slides.eq(slideIndex).css({\n zIndex: _.options.zIndex\n });\n\n _.$slides.eq(slideIndex).animate({\n opacity: 1\n }, _.options.speed, _.options.easing, callback);\n\n } else {\n\n _.applyTransition(slideIndex);\n\n _.$slides.eq(slideIndex).css({\n opacity: 1,\n zIndex: _.options.zIndex\n });\n\n if (callback) {\n setTimeout(function() {\n\n _.disableTransition(slideIndex);\n\n callback.call();\n }, _.options.speed);\n }\n\n }\n\n };\n\n Slick.prototype.fadeSlideOut = function(slideIndex) {\n\n var _ = this;\n\n if (_.cssTransitions === false) {\n\n _.$slides.eq(slideIndex).animate({\n opacity: 0,\n zIndex: _.options.zIndex - 2\n }, _.options.speed, _.options.easing);\n\n } else {\n\n _.applyTransition(slideIndex);\n\n _.$slides.eq(slideIndex).css({\n opacity: 0,\n zIndex: _.options.zIndex - 2\n });\n\n }\n\n };\n\n Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {\n\n var _ = this;\n\n if (filter !== null) {\n\n _.$slidesCache = _.$slides;\n\n _.unload();\n\n _.$slideTrack.children(this.options.slide).detach();\n\n _.$slidesCache.filter(filter).appendTo(_.$slideTrack);\n\n _.reinit();\n\n }\n\n };\n\n Slick.prototype.focusHandler = function() {\n\n var _ = this;\n\n _.$slider\n .off('focus.slick blur.slick')\n .on('focus.slick blur.slick', '*', function(event) {\n\n event.stopImmediatePropagation();\n var $sf = $(this);\n\n setTimeout(function() {\n\n if( _.options.pauseOnFocus ) {\n _.focussed = $sf.is(':focus');\n _.autoPlay();\n }\n\n }, 0);\n\n });\n };\n\n Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {\n\n var _ = this;\n return _.currentSlide;\n\n };\n\n Slick.prototype.getDotCount = function() {\n\n var _ = this;\n\n var breakPoint = 0;\n var counter = 0;\n var pagerQty = 0;\n\n if (_.options.infinite === true) {\n if (_.slideCount <= _.options.slidesToShow) {\n ++pagerQty;\n } else {\n while (breakPoint < _.slideCount) {\n ++pagerQty;\n breakPoint = counter + _.options.slidesToScroll;\n counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n }\n }\n } else if (_.options.centerMode === true) {\n pagerQty = _.slideCount;\n } else if(!_.options.asNavFor) {\n pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);\n }else {\n while (breakPoint < _.slideCount) {\n ++pagerQty;\n breakPoint = counter + _.options.slidesToScroll;\n counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n }\n }\n\n return pagerQty - 1;\n\n };\n\n Slick.prototype.getLeft = function(slideIndex) {\n\n var _ = this,\n targetLeft,\n verticalHeight,\n verticalOffset = 0,\n targetSlide,\n coef;\n\n _.slideOffset = 0;\n verticalHeight = _.$slides.first().outerHeight(true);\n\n if (_.options.infinite === true) {\n if (_.slideCount > _.options.slidesToShow) {\n _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;\n coef = -1\n\n if (_.options.vertical === true && _.options.centerMode === true) {\n if (_.options.slidesToShow === 2) {\n coef = -1.5;\n } else if (_.options.slidesToShow === 1) {\n coef = -2\n }\n }\n verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;\n }\n if (_.slideCount % _.options.slidesToScroll !== 0) {\n if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {\n if (slideIndex > _.slideCount) {\n _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;\n verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;\n } else {\n _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;\n verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;\n }\n }\n }\n } else {\n if (slideIndex + _.options.slidesToShow > _.slideCount) {\n _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;\n verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;\n }\n }\n\n if (_.slideCount <= _.options.slidesToShow) {\n _.slideOffset = 0;\n verticalOffset = 0;\n }\n\n if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {\n _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);\n } else if (_.options.centerMode === true && _.options.infinite === true) {\n _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;\n } else if (_.options.centerMode === true) {\n _.slideOffset = 0;\n _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);\n }\n\n if (_.options.vertical === false) {\n targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;\n } else {\n targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;\n }\n\n if (_.options.variableWidth === true) {\n\n if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n } else {\n targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);\n }\n\n if (_.options.rtl === true) {\n if (targetSlide[0]) {\n targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n } else {\n targetLeft = 0;\n }\n } else {\n targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n }\n\n if (_.options.centerMode === true) {\n if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n } else {\n targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);\n }\n\n if (_.options.rtl === true) {\n if (targetSlide[0]) {\n targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n } else {\n targetLeft = 0;\n }\n } else {\n targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n }\n\n targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;\n }\n }\n\n return targetLeft;\n\n };\n\n Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {\n\n var _ = this;\n\n return _.options[option];\n\n };\n\n Slick.prototype.getNavigableIndexes = function() {\n\n var _ = this,\n breakPoint = 0,\n counter = 0,\n indexes = [],\n max;\n\n if (_.options.infinite === false) {\n max = _.slideCount;\n } else {\n breakPoint = _.options.slidesToScroll * -1;\n counter = _.options.slidesToScroll * -1;\n max = _.slideCount * 2;\n }\n\n while (breakPoint < max) {\n indexes.push(breakPoint);\n breakPoint = counter + _.options.slidesToScroll;\n counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n }\n\n return indexes;\n\n };\n\n Slick.prototype.getSlick = function() {\n\n return this;\n\n };\n\n Slick.prototype.getSlideCount = function() {\n\n var _ = this,\n slidesTraversed, swipedSlide, centerOffset;\n\n centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;\n\n if (_.options.swipeToSlide === true) {\n _.$slideTrack.find('.slick-slide').each(function(index, slide) {\n if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {\n swipedSlide = slide;\n return false;\n }\n });\n\n slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;\n\n return slidesTraversed;\n\n } else {\n return _.options.slidesToScroll;\n }\n\n };\n\n Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {\n\n var _ = this;\n\n _.changeSlide({\n data: {\n message: 'index',\n index: parseInt(slide)\n }\n }, dontAnimate);\n\n };\n\n Slick.prototype.init = function(creation) {\n\n var _ = this;\n\n if (!$(_.$slider).hasClass('slick-initialized')) {\n\n $(_.$slider).addClass('slick-initialized');\n\n _.buildRows();\n _.buildOut();\n _.setProps();\n _.startLoad();\n _.loadSlider();\n _.initializeEvents();\n _.updateArrows();\n _.updateDots();\n _.checkResponsive(true);\n _.focusHandler();\n\n }\n\n if (creation) {\n _.$slider.trigger('init', [_]);\n }\n\n if (_.options.accessibility === true) {\n _.initADA();\n }\n\n if ( _.options.autoplay ) {\n\n _.paused = false;\n _.autoPlay();\n\n }\n\n };\n\n Slick.prototype.initADA = function() {\n var _ = this,\n numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),\n tabControlIndexes = _.getNavigableIndexes().filter(function(val) {\n return (val >= 0) && (val < _.slideCount);\n });\n\n _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({\n 'aria-hidden': 'true',\n 'tabindex': '-1'\n }).find('a, input, button, select').attr({\n 'tabindex': '-1'\n });\n\n if (_.$dots !== null) {\n _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) {\n var slideControlIndex = tabControlIndexes.indexOf(i);\n\n $(this).attr({\n 'role': 'tabpanel',\n 'id': 'slick-slide' + _.instanceUid + i,\n 'tabindex': -1\n });\n\n if (slideControlIndex !== -1) {\n var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex\n if ($('#' + ariaButtonControl).length) {\n $(this).attr({\n 'aria-describedby': ariaButtonControl\n });\n }\n }\n });\n\n _.$dots.attr('role', 'tablist').find('li').each(function(i) {\n var mappedSlideIndex = tabControlIndexes[i];\n\n $(this).attr({\n 'role': 'presentation'\n });\n\n $(this).find('button').first().attr({\n 'role': 'tab',\n 'id': 'slick-slide-control' + _.instanceUid + i,\n 'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex,\n 'aria-label': (i + 1) + ' of ' + numDotGroups,\n 'aria-selected': null,\n 'tabindex': '-1'\n });\n\n }).eq(_.currentSlide).find('button').attr({\n 'aria-selected': 'true',\n 'tabindex': '0'\n }).end();\n }\n\n for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) {\n if (_.options.focusOnChange) {\n _.$slides.eq(i).attr({'tabindex': '0'});\n } else {\n _.$slides.eq(i).removeAttr('tabindex');\n }\n }\n\n _.activateADA();\n\n };\n\n Slick.prototype.initArrowEvents = function() {\n\n var _ = this;\n\n if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n _.$prevArrow\n .off('click.slick')\n .on('click.slick', {\n message: 'previous'\n }, _.changeSlide);\n _.$nextArrow\n .off('click.slick')\n .on('click.slick', {\n message: 'next'\n }, _.changeSlide);\n\n if (_.options.accessibility === true) {\n _.$prevArrow.on('keydown.slick', _.keyHandler);\n _.$nextArrow.on('keydown.slick', _.keyHandler);\n }\n }\n\n };\n\n Slick.prototype.initDotEvents = function() {\n\n var _ = this;\n\n if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n $('li', _.$dots).on('click.slick', {\n message: 'index'\n }, _.changeSlide);\n\n if (_.options.accessibility === true) {\n _.$dots.on('keydown.slick', _.keyHandler);\n }\n }\n\n if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {\n\n $('li', _.$dots)\n .on('mouseenter.slick', $.proxy(_.interrupt, _, true))\n .on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n }\n\n };\n\n Slick.prototype.initSlideEvents = function() {\n\n var _ = this;\n\n if ( _.options.pauseOnHover ) {\n\n _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));\n _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n }\n\n };\n\n Slick.prototype.initializeEvents = function() {\n\n var _ = this;\n\n _.initArrowEvents();\n\n _.initDotEvents();\n _.initSlideEvents();\n\n _.$list.on('touchstart.slick mousedown.slick', {\n action: 'start'\n }, _.swipeHandler);\n _.$list.on('touchmove.slick mousemove.slick', {\n action: 'move'\n }, _.swipeHandler);\n _.$list.on('touchend.slick mouseup.slick', {\n action: 'end'\n }, _.swipeHandler);\n _.$list.on('touchcancel.slick mouseleave.slick', {\n action: 'end'\n }, _.swipeHandler);\n\n _.$list.on('click.slick', _.clickHandler);\n\n $(document).on(_.visibilityChange, $.proxy(_.visibility, _));\n\n if (_.options.accessibility === true) {\n _.$list.on('keydown.slick', _.keyHandler);\n }\n\n if (_.options.focusOnSelect === true) {\n $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n }\n\n $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));\n\n $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));\n\n $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);\n\n $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);\n $(_.setPosition);\n\n };\n\n Slick.prototype.initUI = function() {\n\n var _ = this;\n\n if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n _.$prevArrow.show();\n _.$nextArrow.show();\n\n }\n\n if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n _.$dots.show();\n\n }\n\n };\n\n Slick.prototype.keyHandler = function(event) {\n\n var _ = this;\n //Dont slide if the cursor is inside the form fields and arrow keys are pressed\n if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {\n if (event.keyCode === 37 && _.options.accessibility === true) {\n _.changeSlide({\n data: {\n message: _.options.rtl === true ? 'next' : 'previous'\n }\n });\n } else if (event.keyCode === 39 && _.options.accessibility === true) {\n _.changeSlide({\n data: {\n message: _.options.rtl === true ? 'previous' : 'next'\n }\n });\n }\n }\n\n };\n\n Slick.prototype.lazyLoad = function() {\n\n var _ = this,\n loadRange, cloneRange, rangeStart, rangeEnd;\n\n function loadImages(imagesScope) {\n\n $('img[data-lazy]', imagesScope).each(function() {\n\n var image = $(this),\n imageSource = $(this).attr('data-lazy'),\n imageSrcSet = $(this).attr('data-srcset'),\n imageSizes = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),\n imageToLoad = document.createElement('img');\n\n imageToLoad.onload = function() {\n\n image\n .animate({ opacity: 0 }, 100, function() {\n\n if (imageSrcSet) {\n image\n .attr('srcset', imageSrcSet );\n\n if (imageSizes) {\n image\n .attr('sizes', imageSizes );\n }\n }\n\n image\n .attr('src', imageSource)\n .animate({ opacity: 1 }, 200, function() {\n image\n .removeAttr('data-lazy data-srcset data-sizes')\n .removeClass('slick-loading');\n });\n _.$slider.trigger('lazyLoaded', [_, image, imageSource]);\n });\n\n };\n\n imageToLoad.onerror = function() {\n\n image\n .removeAttr( 'data-lazy' )\n .removeClass( 'slick-loading' )\n .addClass( 'slick-lazyload-error' );\n\n _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n };\n\n imageToLoad.src = imageSource;\n\n });\n\n }\n\n if (_.options.centerMode === true) {\n if (_.options.infinite === true) {\n rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);\n rangeEnd = rangeStart + _.options.slidesToShow + 2;\n } else {\n rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));\n rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;\n }\n } else {\n rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;\n rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);\n if (_.options.fade === true) {\n if (rangeStart > 0) rangeStart--;\n if (rangeEnd <= _.slideCount) rangeEnd++;\n }\n }\n\n loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);\n\n if (_.options.lazyLoad === 'anticipated') {\n var prevSlide = rangeStart - 1,\n nextSlide = rangeEnd,\n $slides = _.$slider.find('.slick-slide');\n\n for (var i = 0; i < _.options.slidesToScroll; i++) {\n if (prevSlide < 0) prevSlide = _.slideCount - 1;\n loadRange = loadRange.add($slides.eq(prevSlide));\n loadRange = loadRange.add($slides.eq(nextSlide));\n prevSlide--;\n nextSlide++;\n }\n }\n\n loadImages(loadRange);\n\n if (_.slideCount <= _.options.slidesToShow) {\n cloneRange = _.$slider.find('.slick-slide');\n loadImages(cloneRange);\n } else\n if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {\n cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);\n loadImages(cloneRange);\n } else if (_.currentSlide === 0) {\n cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);\n loadImages(cloneRange);\n }\n\n };\n\n Slick.prototype.loadSlider = function() {\n\n var _ = this;\n\n _.setPosition();\n\n _.$slideTrack.css({\n opacity: 1\n });\n\n _.$slider.removeClass('slick-loading');\n\n _.initUI();\n\n if (_.options.lazyLoad === 'progressive') {\n _.progressiveLazyLoad();\n }\n\n };\n\n Slick.prototype.next = Slick.prototype.slickNext = function() {\n\n var _ = this;\n\n _.changeSlide({\n data: {\n message: 'next'\n }\n });\n\n };\n\n Slick.prototype.orientationChange = function() {\n\n var _ = this;\n\n _.checkResponsive();\n _.setPosition();\n\n };\n\n Slick.prototype.pause = Slick.prototype.slickPause = function() {\n\n var _ = this;\n\n _.autoPlayClear();\n _.paused = true;\n\n };\n\n Slick.prototype.play = Slick.prototype.slickPlay = function() {\n\n var _ = this;\n\n _.autoPlay();\n _.options.autoplay = true;\n _.paused = false;\n _.focussed = false;\n _.interrupted = false;\n\n };\n\n Slick.prototype.postSlide = function(index) {\n\n var _ = this;\n\n if( !_.unslicked ) {\n\n _.$slider.trigger('afterChange', [_, index]);\n\n _.animating = false;\n\n if (_.slideCount > _.options.slidesToShow) {\n _.setPosition();\n }\n\n _.swipeLeft = null;\n\n if ( _.options.autoplay ) {\n _.autoPlay();\n }\n\n if (_.options.accessibility === true) {\n _.initADA();\n\n if (_.options.focusOnChange) {\n var $currentSlide = $(_.$slides.get(_.currentSlide));\n $currentSlide.attr('tabindex', 0).focus();\n }\n }\n\n }\n\n };\n\n Slick.prototype.prev = Slick.prototype.slickPrev = function() {\n\n var _ = this;\n\n _.changeSlide({\n data: {\n message: 'previous'\n }\n });\n\n };\n\n Slick.prototype.preventDefault = function(event) {\n\n event.preventDefault();\n\n };\n\n Slick.prototype.progressiveLazyLoad = function( tryCount ) {\n\n tryCount = tryCount || 1;\n\n var _ = this,\n $imgsToLoad = $( 'img[data-lazy]', _.$slider ),\n image,\n imageSource,\n imageSrcSet,\n imageSizes,\n imageToLoad;\n\n if ( $imgsToLoad.length ) {\n\n image = $imgsToLoad.first();\n imageSource = image.attr('data-lazy');\n imageSrcSet = image.attr('data-srcset');\n imageSizes = image.attr('data-sizes') || _.$slider.attr('data-sizes');\n imageToLoad = document.createElement('img');\n\n imageToLoad.onload = function() {\n\n if (imageSrcSet) {\n image\n .attr('srcset', imageSrcSet );\n\n if (imageSizes) {\n image\n .attr('sizes', imageSizes );\n }\n }\n\n image\n .attr( 'src', imageSource )\n .removeAttr('data-lazy data-srcset data-sizes')\n .removeClass('slick-loading');\n\n if ( _.options.adaptiveHeight === true ) {\n _.setPosition();\n }\n\n _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);\n _.progressiveLazyLoad();\n\n };\n\n imageToLoad.onerror = function() {\n\n if ( tryCount < 3 ) {\n\n /**\n * try to load the image 3 times,\n * leave a slight delay so we don't get\n * servers blocking the request.\n */\n setTimeout( function() {\n _.progressiveLazyLoad( tryCount + 1 );\n }, 500 );\n\n } else {\n\n image\n .removeAttr( 'data-lazy' )\n .removeClass( 'slick-loading' )\n .addClass( 'slick-lazyload-error' );\n\n _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n _.progressiveLazyLoad();\n\n }\n\n };\n\n imageToLoad.src = imageSource;\n\n } else {\n\n _.$slider.trigger('allImagesLoaded', [ _ ]);\n\n }\n\n };\n\n Slick.prototype.refresh = function( initializing ) {\n\n var _ = this, currentSlide, lastVisibleIndex;\n\n lastVisibleIndex = _.slideCount - _.options.slidesToShow;\n\n // in non-infinite sliders, we don't want to go past the\n // last visible index.\n if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {\n _.currentSlide = lastVisibleIndex;\n }\n\n // if less slides than to show, go to start.\n if ( _.slideCount <= _.options.slidesToShow ) {\n _.currentSlide = 0;\n\n }\n\n currentSlide = _.currentSlide;\n\n _.destroy(true);\n\n $.extend(_, _.initials, { currentSlide: currentSlide });\n\n _.init();\n\n if( !initializing ) {\n\n _.changeSlide({\n data: {\n message: 'index',\n index: currentSlide\n }\n }, false);\n\n }\n\n };\n\n Slick.prototype.registerBreakpoints = function() {\n\n var _ = this, breakpoint, currentBreakpoint, l,\n responsiveSettings = _.options.responsive || null;\n\n if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {\n\n _.respondTo = _.options.respondTo || 'window';\n\n for ( breakpoint in responsiveSettings ) {\n\n l = _.breakpoints.length-1;\n\n if (responsiveSettings.hasOwnProperty(breakpoint)) {\n currentBreakpoint = responsiveSettings[breakpoint].breakpoint;\n\n // loop through the breakpoints and cut out any existing\n // ones with the same breakpoint number, we don't want dupes.\n while( l >= 0 ) {\n if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {\n _.breakpoints.splice(l,1);\n }\n l--;\n }\n\n _.breakpoints.push(currentBreakpoint);\n _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;\n\n }\n\n }\n\n _.breakpoints.sort(function(a, b) {\n return ( _.options.mobileFirst ) ? a-b : b-a;\n });\n\n }\n\n };\n\n Slick.prototype.reinit = function() {\n\n var _ = this;\n\n _.$slides =\n _.$slideTrack\n .children(_.options.slide)\n .addClass('slick-slide');\n\n _.slideCount = _.$slides.length;\n\n if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {\n _.currentSlide = _.currentSlide - _.options.slidesToScroll;\n }\n\n if (_.slideCount <= _.options.slidesToShow) {\n _.currentSlide = 0;\n }\n\n _.registerBreakpoints();\n\n _.setProps();\n _.setupInfinite();\n _.buildArrows();\n _.updateArrows();\n _.initArrowEvents();\n _.buildDots();\n _.updateDots();\n _.initDotEvents();\n _.cleanUpSlideEvents();\n _.initSlideEvents();\n\n _.checkResponsive(false, true);\n\n if (_.options.focusOnSelect === true) {\n $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n }\n\n _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n _.setPosition();\n _.focusHandler();\n\n _.paused = !_.options.autoplay;\n _.autoPlay();\n\n _.$slider.trigger('reInit', [_]);\n\n };\n\n Slick.prototype.resize = function() {\n\n var _ = this;\n\n if ($(window).width() !== _.windowWidth) {\n clearTimeout(_.windowDelay);\n _.windowDelay = window.setTimeout(function() {\n _.windowWidth = $(window).width();\n _.checkResponsive();\n if( !_.unslicked ) { _.setPosition(); }\n }, 50);\n }\n };\n\n Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {\n\n var _ = this;\n\n if (typeof(index) === 'boolean') {\n removeBefore = index;\n index = removeBefore === true ? 0 : _.slideCount - 1;\n } else {\n index = removeBefore === true ? --index : index;\n }\n\n if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {\n return false;\n }\n\n _.unload();\n\n if (removeAll === true) {\n _.$slideTrack.children().remove();\n } else {\n _.$slideTrack.children(this.options.slide).eq(index).remove();\n }\n\n _.$slides = _.$slideTrack.children(this.options.slide);\n\n _.$slideTrack.children(this.options.slide).detach();\n\n _.$slideTrack.append(_.$slides);\n\n _.$slidesCache = _.$slides;\n\n _.reinit();\n\n };\n\n Slick.prototype.setCSS = function(position) {\n\n var _ = this,\n positionProps = {},\n x, y;\n\n if (_.options.rtl === true) {\n position = -position;\n }\n x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';\n y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';\n\n positionProps[_.positionProp] = position;\n\n if (_.transformsEnabled === false) {\n _.$slideTrack.css(positionProps);\n } else {\n positionProps = {};\n if (_.cssTransitions === false) {\n positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';\n _.$slideTrack.css(positionProps);\n } else {\n positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';\n _.$slideTrack.css(positionProps);\n }\n }\n\n };\n\n Slick.prototype.setDimensions = function() {\n\n var _ = this;\n\n if (_.options.vertical === false) {\n if (_.options.centerMode === true) {\n _.$list.css({\n padding: ('0px ' + _.options.centerPadding)\n });\n }\n } else {\n _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);\n if (_.options.centerMode === true) {\n _.$list.css({\n padding: (_.options.centerPadding + ' 0px')\n });\n }\n }\n\n _.listWidth = _.$list.width();\n _.listHeight = _.$list.height();\n\n\n if (_.options.vertical === false && _.options.variableWidth === false) {\n _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);\n _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));\n\n } else if (_.options.variableWidth === true) {\n _.$slideTrack.width(5000 * _.slideCount);\n } else {\n _.slideWidth = Math.ceil(_.listWidth);\n _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));\n }\n\n var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();\n if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);\n\n };\n\n Slick.prototype.setFade = function() {\n\n var _ = this,\n targetLeft;\n\n _.$slides.each(function(index, element) {\n targetLeft = (_.slideWidth * index) * -1;\n if (_.options.rtl === true) {\n $(element).css({\n position: 'relative',\n right: targetLeft,\n top: 0,\n zIndex: _.options.zIndex - 2,\n opacity: 0\n });\n } else {\n $(element).css({\n position: 'relative',\n left: targetLeft,\n top: 0,\n zIndex: _.options.zIndex - 2,\n opacity: 0\n });\n }\n });\n\n _.$slides.eq(_.currentSlide).css({\n zIndex: _.options.zIndex - 1,\n opacity: 1\n });\n\n };\n\n Slick.prototype.setHeight = function() {\n\n var _ = this;\n\n if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n _.$list.css('height', targetHeight);\n }\n\n };\n\n Slick.prototype.setOption =\n Slick.prototype.slickSetOption = function() {\n\n /**\n * accepts arguments in format of:\n *\n * - for changing a single option's value:\n * .slick(\"setOption\", option, value, refresh )\n *\n * - for changing a set of responsive options:\n * .slick(\"setOption\", 'responsive', [{}, ...], refresh )\n *\n * - for updating multiple values at once (not responsive)\n * .slick(\"setOption\", { 'option': value, ... }, refresh )\n */\n\n var _ = this, l, item, option, value, refresh = false, type;\n\n if( $.type( arguments[0] ) === 'object' ) {\n\n option = arguments[0];\n refresh = arguments[1];\n type = 'multiple';\n\n } else if ( $.type( arguments[0] ) === 'string' ) {\n\n option = arguments[0];\n value = arguments[1];\n refresh = arguments[2];\n\n if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {\n\n type = 'responsive';\n\n } else if ( typeof arguments[1] !== 'undefined' ) {\n\n type = 'single';\n\n }\n\n }\n\n if ( type === 'single' ) {\n\n _.options[option] = value;\n\n\n } else if ( type === 'multiple' ) {\n\n $.each( option , function( opt, val ) {\n\n _.options[opt] = val;\n\n });\n\n\n } else if ( type === 'responsive' ) {\n\n for ( item in value ) {\n\n if( $.type( _.options.responsive ) !== 'array' ) {\n\n _.options.responsive = [ value[item] ];\n\n } else {\n\n l = _.options.responsive.length-1;\n\n // loop through the responsive object and splice out duplicates.\n while( l >= 0 ) {\n\n if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {\n\n _.options.responsive.splice(l,1);\n\n }\n\n l--;\n\n }\n\n _.options.responsive.push( value[item] );\n\n }\n\n }\n\n }\n\n if ( refresh ) {\n\n _.unload();\n _.reinit();\n\n }\n\n };\n\n Slick.prototype.setPosition = function() {\n\n var _ = this;\n\n _.setDimensions();\n\n _.setHeight();\n\n if (_.options.fade === false) {\n _.setCSS(_.getLeft(_.currentSlide));\n } else {\n _.setFade();\n }\n\n _.$slider.trigger('setPosition', [_]);\n\n };\n\n Slick.prototype.setProps = function() {\n\n var _ = this,\n bodyStyle = document.body.style;\n\n _.positionProp = _.options.vertical === true ? 'top' : 'left';\n\n if (_.positionProp === 'top') {\n _.$slider.addClass('slick-vertical');\n } else {\n _.$slider.removeClass('slick-vertical');\n }\n\n if (bodyStyle.WebkitTransition !== undefined ||\n bodyStyle.MozTransition !== undefined ||\n bodyStyle.msTransition !== undefined) {\n if (_.options.useCSS === true) {\n _.cssTransitions = true;\n }\n }\n\n if ( _.options.fade ) {\n if ( typeof _.options.zIndex === 'number' ) {\n if( _.options.zIndex < 3 ) {\n _.options.zIndex = 3;\n }\n } else {\n _.options.zIndex = _.defaults.zIndex;\n }\n }\n\n if (bodyStyle.OTransform !== undefined) {\n _.animType = 'OTransform';\n _.transformType = '-o-transform';\n _.transitionType = 'OTransition';\n if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n }\n if (bodyStyle.MozTransform !== undefined) {\n _.animType = 'MozTransform';\n _.transformType = '-moz-transform';\n _.transitionType = 'MozTransition';\n if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;\n }\n if (bodyStyle.webkitTransform !== undefined) {\n _.animType = 'webkitTransform';\n _.transformType = '-webkit-transform';\n _.transitionType = 'webkitTransition';\n if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n }\n if (bodyStyle.msTransform !== undefined) {\n _.animType = 'msTransform';\n _.transformType = '-ms-transform';\n _.transitionType = 'msTransition';\n if (bodyStyle.msTransform === undefined) _.animType = false;\n }\n if (bodyStyle.transform !== undefined && _.animType !== false) {\n _.animType = 'transform';\n _.transformType = 'transform';\n _.transitionType = 'transition';\n }\n _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);\n };\n\n\n Slick.prototype.setSlideClasses = function(index) {\n\n var _ = this,\n centerOffset, allSlides, indexOffset, remainder;\n\n allSlides = _.$slider\n .find('.slick-slide')\n .removeClass('slick-active slick-center slick-current')\n .attr('aria-hidden', 'true');\n\n _.$slides\n .eq(index)\n .addClass('slick-current');\n\n if (_.options.centerMode === true) {\n\n var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;\n\n centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n if (_.options.infinite === true) {\n\n if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {\n _.$slides\n .slice(index - centerOffset + evenCoef, index + centerOffset + 1)\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n } else {\n\n indexOffset = _.options.slidesToShow + index;\n allSlides\n .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n }\n\n if (index === 0) {\n\n allSlides\n .eq(allSlides.length - 1 - _.options.slidesToShow)\n .addClass('slick-center');\n\n } else if (index === _.slideCount - 1) {\n\n allSlides\n .eq(_.options.slidesToShow)\n .addClass('slick-center');\n\n }\n\n }\n\n _.$slides\n .eq(index)\n .addClass('slick-center');\n\n } else {\n\n if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {\n\n _.$slides\n .slice(index, index + _.options.slidesToShow)\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n } else if (allSlides.length <= _.options.slidesToShow) {\n\n allSlides\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n } else {\n\n remainder = _.slideCount % _.options.slidesToShow;\n indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;\n\n if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {\n\n allSlides\n .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n } else {\n\n allSlides\n .slice(indexOffset, indexOffset + _.options.slidesToShow)\n .addClass('slick-active')\n .attr('aria-hidden', 'false');\n\n }\n\n }\n\n }\n\n if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {\n _.lazyLoad();\n }\n };\n\n Slick.prototype.setupInfinite = function() {\n\n var _ = this,\n i, slideIndex, infiniteCount;\n\n if (_.options.fade === true) {\n _.options.centerMode = false;\n }\n\n if (_.options.infinite === true && _.options.fade === false) {\n\n slideIndex = null;\n\n if (_.slideCount > _.options.slidesToShow) {\n\n if (_.options.centerMode === true) {\n infiniteCount = _.options.slidesToShow + 1;\n } else {\n infiniteCount = _.options.slidesToShow;\n }\n\n for (i = _.slideCount; i > (_.slideCount -\n infiniteCount); i -= 1) {\n slideIndex = i - 1;\n $(_.$slides[slideIndex]).clone(true).attr('id', '')\n .attr('data-slick-index', slideIndex - _.slideCount)\n .prependTo(_.$slideTrack).addClass('slick-cloned');\n }\n for (i = 0; i < infiniteCount + _.slideCount; i += 1) {\n slideIndex = i;\n $(_.$slides[slideIndex]).clone(true).attr('id', '')\n .attr('data-slick-index', slideIndex + _.slideCount)\n .appendTo(_.$slideTrack).addClass('slick-cloned');\n }\n _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {\n $(this).attr('id', '');\n });\n\n }\n\n }\n\n };\n\n Slick.prototype.interrupt = function( toggle ) {\n\n var _ = this;\n\n if( !toggle ) {\n _.autoPlay();\n }\n _.interrupted = toggle;\n\n };\n\n Slick.prototype.selectHandler = function(event) {\n\n var _ = this;\n\n var targetElement =\n $(event.target).is('.slick-slide') ?\n $(event.target) :\n $(event.target).parents('.slick-slide');\n\n var index = parseInt(targetElement.attr('data-slick-index'));\n\n if (!index) index = 0;\n\n if (_.slideCount <= _.options.slidesToShow) {\n\n _.slideHandler(index, false, true);\n return;\n\n }\n\n _.slideHandler(index);\n\n };\n\n Slick.prototype.slideHandler = function(index, sync, dontAnimate) {\n\n var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,\n _ = this, navTarget;\n\n sync = sync || false;\n\n if (_.animating === true && _.options.waitForAnimate === true) {\n return;\n }\n\n if (_.options.fade === true && _.currentSlide === index) {\n return;\n }\n\n if (sync === false) {\n _.asNavFor(index);\n }\n\n targetSlide = index;\n targetLeft = _.getLeft(targetSlide);\n slideLeft = _.getLeft(_.currentSlide);\n\n _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;\n\n if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {\n if (_.options.fade === false) {\n targetSlide = _.currentSlide;\n if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n _.animateSlide(slideLeft, function() {\n _.postSlide(targetSlide);\n });\n } else {\n _.postSlide(targetSlide);\n }\n }\n return;\n } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {\n if (_.options.fade === false) {\n targetSlide = _.currentSlide;\n if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n _.animateSlide(slideLeft, function() {\n _.postSlide(targetSlide);\n });\n } else {\n _.postSlide(targetSlide);\n }\n }\n return;\n }\n\n if ( _.options.autoplay ) {\n clearInterval(_.autoPlayTimer);\n }\n\n if (targetSlide < 0) {\n if (_.slideCount % _.options.slidesToScroll !== 0) {\n animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);\n } else {\n animSlide = _.slideCount + targetSlide;\n }\n } else if (targetSlide >= _.slideCount) {\n if (_.slideCount % _.options.slidesToScroll !== 0) {\n animSlide = 0;\n } else {\n animSlide = targetSlide - _.slideCount;\n }\n } else {\n animSlide = targetSlide;\n }\n\n _.animating = true;\n\n _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);\n\n oldSlide = _.currentSlide;\n _.currentSlide = animSlide;\n\n _.setSlideClasses(_.currentSlide);\n\n if ( _.options.asNavFor ) {\n\n navTarget = _.getNavTarget();\n navTarget = navTarget.slick('getSlick');\n\n if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {\n navTarget.setSlideClasses(_.currentSlide);\n }\n\n }\n\n _.updateDots();\n _.updateArrows();\n\n if (_.options.fade === true) {\n if (dontAnimate !== true) {\n\n _.fadeSlideOut(oldSlide);\n\n _.fadeSlide(animSlide, function() {\n _.postSlide(animSlide);\n });\n\n } else {\n _.postSlide(animSlide);\n }\n _.animateHeight();\n return;\n }\n\n if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n _.animateSlide(targetLeft, function() {\n _.postSlide(animSlide);\n });\n } else {\n _.postSlide(animSlide);\n }\n\n };\n\n Slick.prototype.startLoad = function() {\n\n var _ = this;\n\n if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n _.$prevArrow.hide();\n _.$nextArrow.hide();\n\n }\n\n if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n _.$dots.hide();\n\n }\n\n _.$slider.addClass('slick-loading');\n\n };\n\n Slick.prototype.swipeDirection = function() {\n\n var xDist, yDist, r, swipeAngle, _ = this;\n\n xDist = _.touchObject.startX - _.touchObject.curX;\n yDist = _.touchObject.startY - _.touchObject.curY;\n r = Math.atan2(yDist, xDist);\n\n swipeAngle = Math.round(r * 180 / Math.PI);\n if (swipeAngle < 0) {\n swipeAngle = 360 - Math.abs(swipeAngle);\n }\n\n if ((swipeAngle <= 45) && (swipeAngle >= 0)) {\n return (_.options.rtl === false ? 'left' : 'right');\n }\n if ((swipeAngle <= 360) && (swipeAngle >= 315)) {\n return (_.options.rtl === false ? 'left' : 'right');\n }\n if ((swipeAngle >= 135) && (swipeAngle <= 225)) {\n return (_.options.rtl === false ? 'right' : 'left');\n }\n if (_.options.verticalSwiping === true) {\n if ((swipeAngle >= 35) && (swipeAngle <= 135)) {\n return 'down';\n } else {\n return 'up';\n }\n }\n\n return 'vertical';\n\n };\n\n Slick.prototype.swipeEnd = function(event) {\n\n var _ = this,\n slideCount,\n direction;\n\n _.dragging = false;\n _.swiping = false;\n\n if (_.scrolling) {\n _.scrolling = false;\n return false;\n }\n\n _.interrupted = false;\n _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;\n\n if ( _.touchObject.curX === undefined ) {\n return false;\n }\n\n if ( _.touchObject.edgeHit === true ) {\n _.$slider.trigger('edge', [_, _.swipeDirection() ]);\n }\n\n if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {\n\n direction = _.swipeDirection();\n\n switch ( direction ) {\n\n case 'left':\n case 'down':\n\n slideCount =\n _.options.swipeToSlide ?\n _.checkNavigable( _.currentSlide + _.getSlideCount() ) :\n _.currentSlide + _.getSlideCount();\n\n _.currentDirection = 0;\n\n break;\n\n case 'right':\n case 'up':\n\n slideCount =\n _.options.swipeToSlide ?\n _.checkNavigable( _.currentSlide - _.getSlideCount() ) :\n _.currentSlide - _.getSlideCount();\n\n _.currentDirection = 1;\n\n break;\n\n default:\n\n\n }\n\n if( direction != 'vertical' ) {\n\n _.slideHandler( slideCount );\n _.touchObject = {};\n _.$slider.trigger('swipe', [_, direction ]);\n\n }\n\n } else {\n\n if ( _.touchObject.startX !== _.touchObject.curX ) {\n\n _.slideHandler( _.currentSlide );\n _.touchObject = {};\n\n }\n\n }\n\n };\n\n Slick.prototype.swipeHandler = function(event) {\n\n var _ = this;\n\n if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {\n return;\n } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {\n return;\n }\n\n _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?\n event.originalEvent.touches.length : 1;\n\n _.touchObject.minSwipe = _.listWidth / _.options\n .touchThreshold;\n\n if (_.options.verticalSwiping === true) {\n _.touchObject.minSwipe = _.listHeight / _.options\n .touchThreshold;\n }\n\n switch (event.data.action) {\n\n case 'start':\n _.swipeStart(event);\n break;\n\n case 'move':\n _.swipeMove(event);\n break;\n\n case 'end':\n _.swipeEnd(event);\n break;\n\n }\n\n };\n\n Slick.prototype.swipeMove = function(event) {\n\n var _ = this,\n edgeWasHit = false,\n curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;\n\n touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;\n\n if (!_.dragging || _.scrolling || touches && touches.length !== 1) {\n return false;\n }\n\n curLeft = _.getLeft(_.currentSlide);\n\n _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;\n _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;\n\n _.touchObject.swipeLength = Math.round(Math.sqrt(\n Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));\n\n verticalSwipeLength = Math.round(Math.sqrt(\n Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));\n\n if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {\n _.scrolling = true;\n return false;\n }\n\n if (_.options.verticalSwiping === true) {\n _.touchObject.swipeLength = verticalSwipeLength;\n }\n\n swipeDirection = _.swipeDirection();\n\n if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {\n _.swiping = true;\n event.preventDefault();\n }\n\n positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);\n if (_.options.verticalSwiping === true) {\n positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;\n }\n\n\n swipeLength = _.touchObject.swipeLength;\n\n _.touchObject.edgeHit = false;\n\n if (_.options.infinite === false) {\n if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {\n swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;\n _.touchObject.edgeHit = true;\n }\n }\n\n if (_.options.vertical === false) {\n _.swipeLeft = curLeft + swipeLength * positionOffset;\n } else {\n _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;\n }\n if (_.options.verticalSwiping === true) {\n _.swipeLeft = curLeft + swipeLength * positionOffset;\n }\n\n if (_.options.fade === true || _.options.touchMove === false) {\n return false;\n }\n\n if (_.animating === true) {\n _.swipeLeft = null;\n return false;\n }\n\n _.setCSS(_.swipeLeft);\n\n };\n\n Slick.prototype.swipeStart = function(event) {\n\n var _ = this,\n touches;\n\n _.interrupted = true;\n\n if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {\n _.touchObject = {};\n return false;\n }\n\n if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {\n touches = event.originalEvent.touches[0];\n }\n\n _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;\n _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;\n\n _.dragging = true;\n\n };\n\n Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {\n\n var _ = this;\n\n if (_.$slidesCache !== null) {\n\n _.unload();\n\n _.$slideTrack.children(this.options.slide).detach();\n\n _.$slidesCache.appendTo(_.$slideTrack);\n\n _.reinit();\n\n }\n\n };\n\n Slick.prototype.unload = function() {\n\n var _ = this;\n\n $('.slick-cloned', _.$slider).remove();\n\n if (_.$dots) {\n _.$dots.remove();\n }\n\n if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {\n _.$prevArrow.remove();\n }\n\n if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {\n _.$nextArrow.remove();\n }\n\n _.$slides\n .removeClass('slick-slide slick-active slick-visible slick-current')\n .attr('aria-hidden', 'true')\n .css('width', '');\n\n };\n\n Slick.prototype.unslick = function(fromBreakpoint) {\n\n var _ = this;\n _.$slider.trigger('unslick', [_, fromBreakpoint]);\n _.destroy();\n\n };\n\n Slick.prototype.updateArrows = function() {\n\n var _ = this,\n centerOffset;\n\n centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n if ( _.options.arrows === true &&\n _.slideCount > _.options.slidesToShow &&\n !_.options.infinite ) {\n\n _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n if (_.currentSlide === 0) {\n\n _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {\n\n _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {\n\n _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n }\n\n }\n\n };\n\n Slick.prototype.updateDots = function() {\n\n var _ = this;\n\n if (_.$dots !== null) {\n\n _.$dots\n .find('li')\n .removeClass('slick-active')\n .end();\n\n _.$dots\n .find('li')\n .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))\n .addClass('slick-active');\n\n }\n\n };\n\n Slick.prototype.visibility = function() {\n\n var _ = this;\n\n if ( _.options.autoplay ) {\n\n if ( document[_.hidden] ) {\n\n _.interrupted = true;\n\n } else {\n\n _.interrupted = false;\n\n }\n\n }\n\n };\n\n $.fn.slick = function() {\n var _ = this,\n opt = arguments[0],\n args = Array.prototype.slice.call(arguments, 1),\n l = _.length,\n i,\n ret;\n for (i = 0; i < l; i++) {\n if (typeof opt == 'object' || typeof opt == 'undefined')\n _[i].slick = new Slick(_[i], opt);\n else\n ret = _[i].slick[opt].apply(_[i].slick, args);\n if (typeof ret != 'undefined') return ret;\n }\n return _;\n };\n\n}));\n","'use strict';\n\n/**\n* Resets the Quick View by hiding the given selector and other sections\n* @param {string} selectorToHide - the selector to be hidden\n*/\nfunction reset(selectorToHide) {\n $('.attribute-values-section > div').hide();\n\n if (selectorToHide) {\n $(selectorToHide).hide();\n } else {\n $('.product-pricing-section').hide();\n $('.product-purchase-section').hide();\n }\n\n $('.attribute.toggle').attr('data-show', 'false');\n $('.attribute-col.selected').removeClass('selected');\n}\n\n/**\n* Shows the pricing area of a product\n* @param {string} selector - the selector for the pricing area\n* @returns {void}\n*/\nfunction showPricing(selector) {\n if (selector) {\n $(selector).show();\n } else {\n $('.product-pricing-section').show();\n $('.product-purchase-section').show();\n }\n}\n\n/**\n * Click handler on attribute toggle button\n * @param {*} event Event object\n */\nfunction toggleAttribute(event) {\n event.stopPropagation();\n\n const $target = $(event.currentTarget);\n const attrDataShow = 'data-show';\n const attrDataAttrID = 'data-attr';\n const attrDataSelectorToHide = 'data-selector-to-hide';\n\n // Get action\n const showAction = $target.attr(attrDataShow) === 'false';\n\n const nextValue = showAction ? 'true' : 'false';\n\n // Get Attribute\n const attributeID = $target.attr(attrDataAttrID) ? $target.attr(attrDataAttrID) : 'orc_size';\n\n // Get selector to show / hide\n const $variationAttributes = $target.closest('.variation-attributes');\n const selectorToHide = $variationAttributes.find('.attributes-area').attr(attrDataSelectorToHide);\n\n let $elmts = $variationAttributes.find(`.attribute-values-section div[${attrDataAttrID}=\"${attributeID}\"]`);\n if ($elmts.length === 0) {\n $elmts = $(`.attribute-values-section div[${attrDataAttrID}=\"${attributeID}\"]`);\n }\n\n if ($elmts.length > 0) {\n // Hide all footer blocks\n reset(selectorToHide);\n\n if (showAction) {\n // Show clicked attribute\n $elmts.show();\n // Update parent class\n $target.closest('.attribute-col').addClass('selected');\n } else {\n // Show Pricing\n showPricing(selectorToHide);\n }\n }\n\n // Update show attribute\n // first check if this is one of the choices\n // that was clicked rather than the menu bar\n if ($target.hasClass('circle-attribute')) {\n // take out data show to avoid conversion to true and disabling of toggling and resulting arrow pointing up\n $target.removeAttr('data-show');\n // $('.attribute-col').children().attr('data-show', 'false');\n } else {\n // this is for the menu bar\n $target.attr(attrDataShow, nextValue);\n }\n}\n\n/**\n * Click handler on change value button\n * @param {*} event Event object\n */\nfunction selectAttributeValue(event) {\n event.stopPropagation();\n // Init jquery element\n const isCompatibleShippingMethod = $('.product-detail').attr('data-is-compatible-shipping-method');\n if (isCompatibleShippingMethod && isCompatibleShippingMethod === 'false') {\n return;\n }\n const $target = $(event.currentTarget);\n const $rootContainer = $target.closest('.variation-attributes');\n\n if ($target.hasClass('circle-selected') === false) {\n const attrDataAttrID = 'data-attr';\n const attrDataAttrValue = 'data-attr-value';\n const attrDataAttrURL = 'value';\n const attrDataColorSuffix = 'data-color-suffix';\n\n // Get attribute Data\n const attributeID = $target.closest('.attribute-values').attr(attrDataAttrID);\n const attributeValue = $target.attr(attrDataAttrValue);\n const attributeColorSuffix = $target.attr(attrDataColorSuffix);\n const attributeDisplayValue = $target.find('.attribute-value').text();\n const attributeURL = $target.attr(attrDataAttrURL) === 'null' ? null : $target.attr(attrDataAttrURL);\n\n // Update attribute values\n const $container = $rootContainer.find(`.attribute-values[${attrDataAttrID}=\"${attributeID}\"]`);\n const $attributesElmnts = $container.find('.circle-attribute');\n $attributesElmnts.removeClass('circle-selected');\n $attributesElmnts.addClass('circle-unselected');\n $container.find(`.circle-attribute[${attrDataAttrValue}=\"${attributeValue}\"]`).removeClass('circle-unselected').addClass('circle-selected');\n\n // Update attribute select input\n const $toggleContainer = $rootContainer.find(`.attribute[${attrDataAttrID}=\"${attributeID}\"]`);\n $toggleContainer.find('.circle-attribute').removeClass('circle-unselected').addClass('circle-selected').text(attributeDisplayValue);\n\n // Update text on top of the color attribute\n $rootContainer.find(`.attribute-values-section > div[${attrDataAttrID}=\"${attributeID}\"] .value-area > span`).removeClass('placeholder').text(attributeDisplayValue);\n\n // Update Color\n if (attributeColorSuffix) {\n $toggleContainer.find('.circle-attribute').removeClass(function (index, className) {\n return (className.match(/(^|\\s)refinement-background-\\S+/g) || []).join(' ');\n }).addClass('refinement-background-' + attributeColorSuffix);\n $toggleContainer.find('.value-area > span').removeClass(function (index, className) {\n return (className.match(/(^|\\s)refinement-color-\\S+/g) || []).join(' ');\n });\n $toggleContainer.find('.value-area > span').html(attributeDisplayValue);\n }\n\n // Trigger toggleAttribute function only for mobile or quickview\n if ($rootContainer.hasClass('mobile-only') || $rootContainer.hasClass('product-quickview-attributes')) {\n toggleAttribute(event);\n }\n // Update select input\n $target.closest('.js-attribute-container').find(`.attribute[${attrDataAttrID}=\"${attributeID}\"] select`).val(attributeURL).trigger('change');\n\n // Quick view handling\n var $selectedColor = $target.find('.attribute-value').html();\n var $updateColorTab = $target.attr('data-color-suffix');\n var $quickViewModal = $target.closest('.quick-view-dialog');\n\n if ($quickViewModal.length === 0) {\n return;\n }\n\n if ($(this).hasClass('is-color')) {\n // update quickview color tab value\n $quickViewModal.find('div[data-attr=\"orc_color\"] .circle-area').empty()\n .html('<span class=\"circle-attribute circle-selected is-color\">' + $selectedColor + '</span>');\n $quickViewModal.find('div[data-attr=\"orc_color\"] .circle-area span').addClass('refinement-background-' + $updateColorTab);\n $quickViewModal.find('div[data-attr=\"orc_color\"] .value-area span').html($selectedColor);\n } else {\n // update quickview size tab value\n var selectedSizeHtml = $target.find('.attribute-value').html();\n\n $quickViewModal.find('div[data-attr=\"orc_size\"] .circle-area').empty()\n .html(`<span class=\"circle-attribute circle-selected\">${selectedSizeHtml}\n <span class=\"attr-bis-icon d-none\">\n <i class=\"fa-regular fa-envelope\" aria-hidden=\"true\"></i>\n </span>\n </span>`);\n }\n }\n}\n\nmodule.exports = {\n toggleAttribute,\n selectAttributeValue,\n updateSelectableVariationAttributes: function (product, $container) {\n let values;\n switch ($container.attr('data-attr')) {\n case 'orc_size':\n values = product.variationAttributes[1].values;\n break;\n case 'orc_color':\n values = product.variationAttributes[0].values;\n break;\n default:\n break;\n }\n\n $container.children().each(function () {\n let valueAssociated = values.find(value => $(this).attr('data-attr-value') === value.id);\n if (valueAssociated && valueAssociated.selectable && $(this).hasClass('circle-disabled')) {\n $(this).removeClass('circle-disabled');\n } if (valueAssociated && !valueAssociated.selectable && !$(this).hasClass('circle-disabled')) {\n $(this).addClass('circle-disabled');\n }\n });\n }\n};\n"],"sourceRoot":""}