{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/src/shared/component.js","webpack:///./app/javascript/src/shared/component-manager.js","webpack:///./app/javascript/src/helpers/string-helper.js","webpack:///./app/javascript/src/shared/components/organization-field.js","webpack:///./app/javascript/src/shared/components/phone-field.js","webpack:///./app/javascript/src/shared/components/typeahead-input.js","webpack:///./app/javascript/src/shared/components/school-field.js","webpack:///(webpack)/buildin/global.js","webpack:///./app/javascript/src/shared/components/array-field.js","webpack:///./app/javascript/src/shared/components/date-picker.js","webpack:///./app/javascript/src/shared/components/dropdown-select.js","webpack:///./app/javascript/src/shared/components/dynamic-dropdown.js","webpack:///./app/javascript/src/shared/components/other-occupation-field.js","webpack:///./app/javascript/src/shared/components/photo-uploader.js","webpack:///./app/javascript/src/shared/components/tag-field.js","webpack:///./app/javascript/src/shared/components/region-dropdown.js","webpack:///./node_modules/swing/dist/index.js","webpack:///./app/javascript/src/shared/components/max-size-file-field.js","webpack:///./app/javascript/src/shims/turbolinks-reload.js","webpack:///./app/javascript/src/shared/components/array-field-cocoon.js","webpack:///./app/javascript/src/shared/components/associations-field.js","webpack:///./node_modules/lodash/lodash.js","webpack:///(webpack)/buildin/module.js","webpack:///./node_modules/process/browser.js","webpack:///./app/javascript/src/shims/turbolinks-facebook-sdk.js","webpack:///./app/javascript/src/shared/components/swipeable-cards.js","webpack:///./app/javascript/src/app/components/mentor/mentor-groups-manager.js","webpack:///./node_modules/swing/dist/Card.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./node_modules/sister/src/sister.js","webpack:///./node_modules/rebound/rebound.js","webpack:///./node_modules/swing/dist/Direction.js","webpack:///./node_modules/hammerjs/hammer.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./node_modules/vendor-prefix/index.js","webpack:///./node_modules/raf/index.js","webpack:///./node_modules/performance-now/lib/performance-now.js","webpack:///./node_modules/swing/dist/utilities.js","webpack:///./node_modules/swing/dist/Stack.js","webpack:///./app/javascript/src/shared/components/birth-date-picker.js","webpack:///./app/javascript/src/shared/components/swiped-cards.js","webpack:///./app/javascript/src/shared/components/tiles-selector.js","webpack:///./app/javascript/src/lobby/components/organization-billing-coordinates-form.js","webpack:///./app/javascript/src/shared/components/facebook-login.js","webpack:///./app/javascript/src/lobby/components/toggle-other-mentee-heard-about-us-category.js","webpack:///./app/javascript/src/lobby/lobby-component-manager.js","webpack:///./app/javascript/packs/lobby.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","Component","$elements","opts","$","instances","map","_index","element","toArray","this","Array","isArray","forEach","instance","unbindEvents","ComponentManager","components","initializeGlobals","initializeResponsiveWidths","initializeTurbolinks","initializeComponents","bindEvents","Error","window","$window","$document","document","$html","pageContentWidthMd","pageContentWidthSm","Turbolinks","clearCache","_error","start","component","onbeforeunload","isFunction","alertValue","confirm","on","destroyComponents","simulateOnBeforeUnload","resetOnBeforeUnload","StringHelper","string","replace","match","toUpperCase","toLowerCase","firstLetter","tokens","keys","reduce","memo","token","OrganizationField","arguments","$element","$inputElement","find","$idInputElement","$choiceElement","$choiceRemovalElement","$suggestionItemTemplate","$typeaheadElement","val","hide","createBootstrapComponents","handleChoiceRemoval","handleAutoCompleteSelect","typeaheadInstance","off","destroyBootstrapComponents","typeahead","hint","highlight","getTypeaheadSourceOptions","displayKey","source","getTypeaheadSource","ttAdapter","templates","suggestion","item","buildSuggestionTemplate","Bloodhound","datumTokenizer","tokenizers","whitespace","queryTokenizer","limit","Infinity","remote","wildcard","url","data","filter","parsedResponse","filterRemoteTags","initialize","preloadImage","photo","clone","html","src","Image","organizations","_","selection","id","addClass","attr","removeClass","show","focus","PhoneField","updateSmsCommunicationsVisibility","handleTypeSelect","event","preventDefault","TypeaheadInput","$typeaheadInput","typeaheadOptions","getTypeaheadSources","handleTypeaheadClose","handleTypeaheadSelect","callback","SchoolField","$input","autoselect","minLength","$parentElement","$searchInput","$schoolPreview","$schoolResetButton","$schoolNameInputElement","schoolTemplate","currentValue","allowFreeText","bindAdditionalEvents","handleSchoolRemoval","handleTypeaheadChange","_event","school","cleanFieldTimeout","setTimeout","_clearValue","target","buildSchoolsSource","createTypeaheadSource","response","schools","replaceTokens","__name__","_typeof","obj","iterator","constructor","g","Function","e","ArrayField","counter","length","$formElement","closest","$templateElement","updateButtonsVisibility","handleDuplicateClick","handleRemoveClick","handleFormSubmit","newHTML","append","duplicateCallback","children","last","$duplicatedElement","classList","contains","$items","duplicateTemplate","remove","DATEPICKER_ATTRIBUTES","format","todayBtn","language","autoclose","todayHighlight","disableTouchKeyboard","DatePicker","attributes","startView","startDate","endDate","datepicker","DropdownSelect","$selectElement","buildComponentHTML","wrap","parent","DynamicDropdown","$parentTarget","$target","requestTargetOptions","handleChange","options","disableTargetDropdown","prop","loadTargetDropdown","ajax","done","handleAJAXSuccess","select","selectedOption","innerHTML","option","opt","createElement","selected","String","label","appendChild","OtherOccupationField","$name","manageOtherOccupationField","manageTeacherOrganizationRequirement","method","toggleClass","PhotoUploader","$preview","updatePreview","URL","createObjectURL","TagField","DEFAULT_MIN_LENGTH","maxTags","disallowAddTag","emptyLabel","searchMinLength","handleTagAdd","handleTagRemove","handleFieldBlur","$tagsInputElement","tagClass","itemText","sanitizeItemText","confirmKeys","freeInput","tagsinput","autoFocusInput","empty","tags","text","capitalize","substr","tagValue","resetInputValue","datum","addTag","keyCode","size","Math","max","floor","RegionDropdown","$parentForm","$province","$region","defaultStateId","updateRowVisibility","onStateChanged","regionDropdown","parents","first","toString","Stack","Direction","Card","undefined","_Card2","_interopRequireDefault","_Direction2","_Stack2","MaxSizeFileField","maxSize","parseInt","maxSizeMessage","handleFieldChange","FileReader","currentTarget","files","alert","setup","reload","keepScrollPosition","originalOffset","scrollTop","visit","location","pathname","search","ArrayFieldCocoon","$duplicateButton","appendFirstItem","refreshButtonPositions","handleAfterInsert","handleBeforeRemove","handleAfterRemove","organizationFields","field","currentItems","click","$organizationFields","moveDuplicateButtonToFirstItem","placeDuplicateButton","hideRemoveLinks","showRemoveLinks","AssociationsField","$choicesElement","$freeTextSuggetionItemTemplate","$choiceTemplate","$freeTextChoiceTemplate","bindDynamicEvents","unbindDynamicEvents","fetchDOMChoices","fetchSelectedOrganizationIDs","includes","fetchSelectedFreeTextOrganizationNames","freeText","buildFreeTextOrganizationSuggestionTemplate","buildOrganizationSuggestionTemplate","removeEmptyAssociationsValue","choiceElement","handleFreeTextOrganizationAutocompleteSelect","handleOrganizationAutocompleteSelect","addEmptyAssociationsValue","query","responseOrganizations","push","buildFreeTextAssociationFromQuery","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","RegExp","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrim","reTrimStart","reTrimEnd","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","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","join","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","freeGlobal","global","freeSelf","self","root","freeExports","nodeType","freeModule","moduleExports","freeProcess","process","nodeUtil","types","require","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","apply","func","thisArg","args","arrayAggregator","array","setter","iteratee","accumulator","index","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","values","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","current","baseTimes","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","test","mapToArray","overArg","transform","arg","replaceHolders","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","unicodeToArray","split","asciiToArray","unescapeHtmlChar","runInContext","context","uid","defaults","pick","Date","TypeError","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","exec","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","_Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","splice","spreadableSymbol","isConcatSpreadable","symIterator","symToStringTag","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","nativeCeil","ceil","nativeFloor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","min","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","isObject","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","add","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","pop","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","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","seen","baseInvoke","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","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","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","sort","baseSortBy","objCriteria","criteria","othCriteria","ordersLength","compareAscending","order","compareMultiple","basePickBy","baseSet","basePullAll","indexOf","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","end","baseSome","baseSortedIndex","retHighest","low","high","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","slice","copy","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","charAt","trailing","createCompounder","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","newHolders","createRecurry","fn","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","step","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","toInteger","pair","noop","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrLength","arrStacked","arrValue","flatten","otherFunc","type","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","resolve","ctorString","isMaskable","stubFalse","otherArgs","oldArray","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","mapped","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","before","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lt","lte","next","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","CLONE_DEEP_FLAG","basePick","pickBy","toPairs","toPairsIn","camelCase","word","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","after","castArray","chunk","compact","concat","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","zipObject","zipObjectDeep","entriesIn","extend","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","position","escape","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNaN","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trim","trimEnd","trimStart","truncate","omission","substring","newEnd","unescape","uniqueId","prefix","each","eachRight","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","webpackPolyfill","deprecate","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","len","run","marker","runClearTimeout","Item","nextTick","title","browser","env","argv","version","versions","addListener","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","cwd","chdir","umask","appID","Academos","FacebookAppID","fbSDKInitialized","triggerFBReady","trigger","fbAsyncInit","FB","init","appId","cookie","xfbml","XFBML","parse","isFBReady","facebookRoot","fjs","getElementsByTagName","getElementById","js","parentNode","insertBefore","detach","replaceWith","SWING_STACK_CONFIG","throwOutConfidence","offsetX","_offsetY","abs","offsetWidth","throwOutDistance","innerWidth","SwipeableCards","$stack","$actions","$swiped","$cards","not","$swipeButtons","$swipeLeftButton","$swipeRightButton","$successRightAlert","$errorRightAlert","$successLeftAlert","$errorLeftAlert","adjustCardStackHeight","initializeCardStack","initializeStackActionButtons","handleLeftButtonClick","handleRightButtonClick","targetElement","card","getCard","handleCardLeave","handleCardDragMove","handleCardDragEnd","cardHeight","outerHeight","height","handleButtonClick","LEFT","RIGHT","handleCardThrowoutEnd","handleCardThrowout","cardsCount","createCard","throwDirection","handleSwipeRight","handleSwipeLeft","reloadMoreCards","fadeOut","destroy","className","direction","hasClass","cardElement","$cardElement","animateButton","post","handleSwipeRightSuccess","fail","handleSwipeRightError","always","handleSwipeComplete","showAlert","handleSwipeLeftSuccess","handleSwipeLeftError","newElement","appendTo","MinorityGroupsManager","initializeElements","updateState","selector","$lgbtqQuestion","$lgbtqCheckbox","$yesRadio","$noRadio","handleMinorityGroupChange","isChecked","is","toggle","checkbox","dataset","_lodash2","_sister2","_hammerjs2","_rebound2","_vendorPrefix2","_raf2","_utilities","computeDirection","fromX","fromY","allowedDirections","isHorizontal","isLeftDirection","isUpDirection","UP","DOWN","INVALID","prepend","dragging","config","currentX","currentY","doMove","eventEmitter","isDraging","isPanning","lastThrow","lastTranslate","lastX","lastY","mc","_onSpringUpdate","springSystem","springThrowIn","springThrowOut","throwDirectionToEventName","throwWhere","appendedDuringMouseDown","makeConfig","getConfig","getSpringSystem","createSpring","coordinateX","coordinateY","setRestSpeedThreshold","setRestDisplacementThreshold","minThrowOutDistance","maxThrowOutDistance","Manager","recognizers","Pan","threshold","prependToParent","appendToParent","animation","deltaX","deltaY","isThrowOut","throwOut","throwIn","isTouchDevice","addEventListener","onSpringAtRest","onSpringUpdate","spring","getCurrentValue","coordianteX","MathUtil","mapValueInRange","coordianteY","directionFactor","rotation","maxRotation","where","THROW_IN","setCurrentValue","setAtRest","setEndValue","THROW_OUT","setVelocity","destroyCard","defaultConfig","style","siblings","elementChildren","appended","removeChild","firstChild","xOffset","yOffset","xConfidence","yConfidence","offsetHeight","__webpack_amd_options__","Sister","sister","events","handler","listener","unshift","rebound","util","SpringSystem","looper","_springRegistry","_activeSprings","_idleSpringIndices","AnimationLooper","_isIdle","_lastTimeMillis","setLooper","tension","friction","springConfig","SpringConfig","DEFAULT_ORIGAMI_SPRING_CONFIG","fromOrigamiTensionAndFriction","createSpringWithConfig","createSpringWithBouncinessAndSpeed","bounciness","speed","fromBouncinessAndSpeed","Spring","registerSpring","setSpringConfig","getIsIdle","getSpringById","getAllSprings","vals","getId","deregisterSpring","removeFirst","advance","deltaTime","systemShouldAdvance","idx","loop","currentTimeMillis","ellapsedMillis","onBeforeIntegrate","onAfterIntegrate","activateSpring","springId","_id","_ID","_springSystem","_currentState","PhysicsState","_previousState","_tempState","MAX_DELTA_TIME_SEC","SOLVER_TIMESTEP_SEC","_springConfig","_overshootClampingEnabled","_startValue","_endValue","_wasAtRest","_restSpeedThreshold","_displacementFromRestThreshold","_timeAccumulator","frames","getSpringConfig","skipSetAtRest","notifyPositionUpdated","getStartValue","getCurrentDisplacementDistance","getDisplacementDistanceForState","state","endValue","isAtRest","onChange","onSpringEndStateChange","getEndValue","velocity","getVelocity","restSpeedThreshold","getRestSpeedThreshold","displacementFromRestThreshold","getRestDisplacementThreshold","setOvershootClampingEnabled","enabled","isOvershootClampingEnabled","isOvershooting","realDeltaTime","adjustedDeltaTime","aVelocity","aAcceleration","bVelocity","bAcceleration","cVelocity","cAcceleration","dVelocity","dvdt","tempPosition","tempVelocity","_interpolate","notifyActivate","notifyAtRest","onSpringActivate","wasAtRest","alpha","getListeners","newListener","listenerToRemove","currentValueIsApproximately","_this","_run","onFrame","SimulationLooper","timestep","running","SteppingSimulationLooper","OrigamiValueConverter","tensionFromOrigamiValue","oValue","origamiValueFromTension","frictionFromOrigamiValue","origamiFromFriction","BouncyConversion","b","normalize","projectNormal","bouncyTension","bouncyFriction","quadraticOutInterpolation","b3Nobounce","startValue","linearInterpolation","b3Friction1","x","pow","b3Friction2","b3Friction3","bouncyConversion","coastingConfigWithOrigamiFriction","colorCache","hexToRGB","color","parts","ret","rgbToHex","_onFrame","fromLow","fromHigh","toLow","toHigh","interpolateColor","startColor","endColor","asRGB","degreesToRadians","deg","PI","radiansToDegrees","rad","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","setImmediate","exportName","VENDOR_PREFIXES","TEST_ELEMENT","setTimeoutContext","bindFn","invokeArrayArg","deprecationMessage","log","console","warn","output","nextKey","dest","inherit","child","base","childP","baseP","_super","boolOrFn","ifUndefined","val1","val2","addEventListeners","splitStr","removeEventListeners","removeEventListener","hasParent","node","inStr","str","inArray","findByKey","uniqueArray","results","a","prefixed","camelProp","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","navigator","userAgent","PROPS_XY","PROPS_CLIENT_XY","Input","manager","inputTarget","domHandler","ev","enable","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","angle","getAngle","distance","getDistance","offsetDelta","prevDelta","prevInput","y","computeDeltaXY","offsetDirection","getDirection","overallVelocity","overallVelocityX","overallVelocityY","scale","getRotation","maxPointers","velocityX","velocityY","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","recognize","clientX","clientY","p1","p2","sqrt","atan2","evEl","evTarget","evWin","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","compute","touchAction","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","Recognizer","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","Hammer","preset","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","attrTest","optionPointers","isRecognized","isValid","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","stop","force","stopped","curRecognizer","existing","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Swipe","Pinch","Rotate","Press","Timeout","clearFn","_clearFn","scope","setInterval","clearInterval","close","unref","ref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","registerImmediate","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","attachTo","handle","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","canUsePostMessage","MessageChannel","port1","port2","documentElement","script","onreadystatechange","attachEvent","task","prefixes","hasPrefix","capitalizedKey","dash","prefixedKey","vendors","suffix","raf","caf","_now","cp","cancelled","polyfill","cancelAnimationFrame","getNanoSeconds","hrtime","loadTime","moduleLoadTime","nodeLoadTime","upTime","performance","hr","uptime","getTime","_lodash","childNodes","msMaxTouchPoints","eventName","BirthDatePicker","$birthDateGroup","$form","$yearSelector","$monthSelector","$daySelector","validateSelectedDate","selectedIndex","isValidDateSelected","adjustFormForBirthDate","enableMinorMode","showMinorVisibleRows","hideMajorVisibleRows","showMinorRequiredRows","hideMajorRequiredRows","hideMinorVisibleRows","showMajorVisibleRows","hideMinorRequiredRows","showMajorRequiredRows","today","birthYear","birthMonth","birthDay","isBirthDateMinor","enableMajorMode","SwipedCards","$rightStack","$lockedAction","$instructionText","$doneText","isLockedActionShowing","lockedActionLimit","updateLockedAction","handleRightSwiped","TilesSelector","$tiles","$select","handleSelect","$selectedTile","selectTile","submit","OrganizationBillingCoordinatesForm","$trigger","$publicStreetAddress","$publicStreetAddressApt","$publicPostalCode","$publicCity","$publicStateId","$publicCountry","$billingStreetAddress","$billingStreetAddressApt","$billingPostalCode","$billingCity","$billingStateId","$billingCountry","fieldsToFill","fieldsToUse","$field","authPath","FacebookUserAuthCallbackPath","FacebookLogin","handleClick","one","loginToFacebook","login","authResponse","redirectToAuthPath","auth_type","return_scopes","ToggleOtherMenteeHeardAboutUsCategory","$toggleFieldElements","LobbyComponentManager","ahoy","configure","startOnReady","setupTurbolinksFacebookSDK","setupTurbolinksReload","jQuery","appVersion"],"mappings":"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ACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,KACR,OAAQ,KACR,OAAQ,KACR,OAAQ,KACR,OAAQ,KAER,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,I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","file":"js/lobby-ab33c74bc2f4d57b71eb.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 = \"https://app.academos.qc.ca/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 136);\n","export default class Component {\n static initialize($elements, opts) {\n // Sometimes we want to pass a collection of elements.\n // When we can’t have that, we’ll pass a string with a\n // CSS selector to build a collection and then use it.\n if (typeof $elements == 'string') {\n $elements = $($elements);\n }\n\n const instances = $elements\n .map((_index, element) => {\n return new this(element, opts);\n })\n .toArray();\n\n this.instances = this.instances\n ? [...this.instances, ...instances]\n : [...instances];\n\n return instances;\n }\n\n static unbindEvents() {\n const instances = Array.isArray(this.instances) ? this.instances : [];\n\n instances.forEach((instance) => {\n instance.unbindEvents();\n });\n\n this.instances = [];\n }\n\n unbindEvents() {\n // Subclasses must override this method\n }\n}\n","class ComponentManager {\n constructor(components) {\n this.components = components;\n this.initializeGlobals();\n this.initializeResponsiveWidths();\n this.initializeTurbolinks();\n this.initializeComponents();\n this.bindEvents();\n }\n\n initializeComponents() {\n throw new Error(\n 'Classes that inherit from ComponentManager must implement their own initializeComponents method.'\n );\n }\n\n initializeGlobals() {\n window.$window = $(window);\n window.$document = $(document);\n window.$html = $('html');\n }\n\n initializeResponsiveWidths() {\n window.pageContentWidthMd = 991;\n window.pageContentWidthSm = 767;\n }\n\n initializeTurbolinks() {\n try {\n window.Turbolinks.clearCache();\n } catch (_error) {\n // If it’s the first page load, Turbolinks isn’t started\n // and won’t accept that we call `clearCache`\n }\n\n window.Turbolinks.start();\n }\n\n destroyComponents() {\n this.components.forEach((component) => {\n component.unbindEvents();\n });\n }\n\n simulateOnBeforeUnload() {\n if (window.onbeforeunload && $.isFunction(window.onbeforeunload)) {\n const alertValue = window.onbeforeunload();\n\n if (alertValue && typeof alertValue !== 'undefined') {\n // eslint-disable-next-line no-alert\n return window.confirm(alertValue);\n }\n }\n }\n\n resetOnBeforeUnload() {\n window.onbeforeunload = null;\n }\n\n bindEvents() {\n // Handle individual components\n $(document).on('turbolinks:load', () => this.initializeComponents());\n $(document).on('turbolinks:before-cache', () => this.destroyComponents());\n\n // Handle window.onbeforeunload behavior\n $(document).on('turbolinks:click', () => this.simulateOnBeforeUnload());\n $(document).on('turbolinks:request-end', () => this.resetOnBeforeUnload());\n }\n}\n\nexport default ComponentManager;\n","export default class StringHelper {\n static toCamelCase(string) {\n return string.replace(/(_[a-z])/g, (match) => {\n return match.toUpperCase().replace('_', '');\n });\n }\n\n static capitalize(string) {\n return string.toLowerCase().replace(/(\\b)([a-zA-Z])/, (firstLetter) => {\n return firstLetter.toUpperCase();\n });\n }\n\n static replaceTokens(string, tokens) {\n return Object.keys(tokens).reduce((memo, token) => {\n return memo.replace(token, tokens[token]);\n }, string);\n }\n}\n","import Component from '../component';\n\nexport default class OrganizationField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n\n this.$inputElement = this.$element.find('.organizationField-input');\n this.$idInputElement = this.$element.find('.organizationField-idInput');\n this.$choiceElement = this.$element.find('.organizationField-choice');\n this.$choiceRemovalElement = this.$element.find(\n '.organizationField-choice-removal-icon'\n );\n this.$suggestionItemTemplate = this.$element.find(\n '.organizationField-suggestionTemplate'\n );\n\n this.bindEvents();\n\n this.$typeaheadElement = this.$element.find('.twitter-typeahead');\n\n if (this.$idInputElement.val()) {\n this.$typeaheadElement.hide();\n }\n }\n\n bindEvents() {\n this.createBootstrapComponents();\n\n this.handleChoiceRemoval = this.handleChoiceRemoval.bind(this);\n this.handleAutoCompleteSelect = this.handleAutoCompleteSelect.bind(this);\n\n this.$choiceRemovalElement.on(\n 'click.OrganizationField',\n this.handleChoiceRemoval\n );\n this.typeaheadInstance.on(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n }\n\n unbindEvents() {\n this.$choiceRemovalElement.off(\n 'click.OrganizationField',\n this.handleChoiceRemoval\n );\n this.typeaheadInstance.off(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n\n this.destroyBootstrapComponents();\n }\n\n createBootstrapComponents() {\n const typeaheadOptions = {hint: false, highlight: true};\n\n this.typeaheadInstance = this.$inputElement.typeahead(\n typeaheadOptions,\n this.getTypeaheadSourceOptions()\n );\n }\n\n destroyBootstrapComponents() {\n this.$inputElement.typeahead('destroy');\n }\n\n getTypeaheadSourceOptions() {\n const source = this.getTypeaheadSource();\n\n return {\n name: 'states',\n displayKey: 'name',\n source: source.ttAdapter(),\n templates: {\n suggestion: (item) => this.buildSuggestionTemplate(item),\n },\n };\n }\n\n getTypeaheadSource() {\n const source = new window.Bloodhound({\n datumTokenizer: window.Bloodhound.tokenizers.whitespace('name'),\n queryTokenizer: window.Bloodhound.tokenizers.whitespace,\n limit: Infinity,\n remote: {\n wildcard: '%QUERY',\n url: `${this.$element.data('url')}?q=%QUERY`,\n filter: (parsedResponse) => this.filterRemoteTags(parsedResponse),\n },\n });\n\n source.initialize();\n\n return source;\n }\n\n buildSuggestionTemplate(item) {\n this.preloadImage(item.photo.url);\n\n const newHTML = this.$suggestionItemTemplate.clone().html();\n const suggestionItem = newHTML\n .replace(/__name__/g, item.name)\n .replace(/data-src/g, 'src')\n .replace(/__photo_url__/g, item.photo.url);\n\n return suggestionItem;\n }\n\n preloadImage(src) {\n const image = new Image();\n\n image.src = src;\n }\n\n filterRemoteTags(parsedResponse) {\n return parsedResponse.organizations;\n }\n\n handleAutoCompleteSelect(_, selection) {\n // Set organization ID in the second input\n this.$idInputElement.val(selection.id);\n this.$inputElement.addClass('hidden');\n\n // Hide typeahead instance\n this.$typeaheadElement.hide();\n\n // Display result\n this.$choiceElement\n .find('.organizationField-choice-logo-image')\n .attr('src', selection.photo.url);\n this.$choiceElement\n .find('.organizationField-choice-name')\n .html(selection.name);\n this.$choiceElement.removeClass('hidden');\n }\n\n handleChoiceRemoval() {\n // Hide result\n this.$choiceElement.addClass('hidden');\n\n // Display typeahead instance\n this.$typeaheadElement.show();\n\n // Reset organization ID in input\n this.$inputElement.removeClass('hidden');\n this.$inputElement.val('');\n this.$idInputElement.val('');\n this.$inputElement.focus();\n }\n}\n","import Component from '../component';\n\nexport default class PhoneField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n\n this.updateSmsCommunicationsVisibility();\n this.bindEvents();\n }\n\n bindEvents() {\n this.handleTypeSelect = this.handleTypeSelect.bind(this);\n\n this.$element.on(\n 'change.PhoneField',\n '.phoneField-type',\n this.handleTypeSelect\n );\n }\n\n unbindEvents() {\n this.$element.off(\n 'change.PhoneField',\n '.phoneField-type',\n this.handleTypeSelect\n );\n }\n\n handleTypeSelect(event) {\n this.updateSmsCommunicationsVisibility();\n\n event.preventDefault();\n }\n\n updateSmsCommunicationsVisibility() {\n if (this.$element.find('.phoneField-type').val() === 'cell') {\n this.$element.find('.phoneField-smsCommunications').show();\n } else {\n this.$element.find('.phoneField-smsCommunications').hide();\n }\n }\n}\n","import Component from '../component';\n\n// @class TypeaheadInput\n// @param element {String|jQuery} input element of the component\n// @param opts {Object} options passed directly to `typeahead`\nexport default class TypeaheadInput extends Component {\n constructor(element, opts) {\n super(...arguments);\n\n this.$typeaheadInput = $(element);\n\n this.typeaheadOptions = opts;\n\n this.bindEvents();\n }\n\n bindEvents() {\n this.typeahead = this.$typeaheadInput.typeahead(\n this.typeaheadOptions,\n this.getTypeaheadSources()\n );\n\n this.typeahead.on('typeahead:close', this.handleTypeaheadClose.bind(this));\n this.typeahead.on(\n 'typeahead:select',\n this.handleTypeaheadSelect.bind(this)\n );\n }\n\n unbindEvents() {\n this.typeahead.off('typeahead:close', this.handleTypeaheadClose);\n this.typeahead.off('typeahead:select', this.handleTypeaheadSelect);\n\n this.$typeaheadInput.typeahead('destroy');\n }\n\n handleTypeaheadClose() {\n // Subclasses must implement this method\n }\n\n handleTypeaheadSelect() {\n // Subclasses must implement this method\n }\n\n getTypeaheadSources() {\n // Subclasses must implement this method\n }\n\n createTypeaheadSource(url, callback) {\n return new window.Bloodhound({\n datumTokenizer: window.Bloodhound.tokenizers.whitespace('name'),\n queryTokenizer: window.Bloodhound.tokenizers.whitespace,\n limit: Infinity,\n remote: {\n wildcard: '%QUERY',\n url: `${url}?q=%QUERY`,\n filter: callback,\n },\n });\n }\n}\n","import TypeaheadInput from '../../shared/components/typeahead-input';\nimport StringHelper from '../../helpers/string-helper';\n\nexport default class SchoolField extends TypeaheadInput {\n constructor(element) {\n const $element = $(element);\n const $input = $element.find('.schoolField-input');\n\n super($input, {\n autoselect: false,\n hint: false,\n highlight: true,\n minLength: 3,\n });\n\n this.$parentElement = $element;\n this.$searchInput = $input;\n this.$schoolPreview = $element.find('.schoolField-choice');\n this.$schoolResetButton = $element.find('.schoolField-choice-removal-icon');\n this.$schoolNameInputElement = $element.find(\n '.schoolField-schoolNameInput'\n );\n this.$idInputElement = $element.find('.schoolField-idInput');\n this.schoolTemplate = $element\n .find('.schoolField-suggestionTemplate')\n .html();\n\n this.currentValue = this.$searchInput.typeahead('val');\n this.allowFreeText = this.$typeaheadInput.data('allow-free-text');\n\n this.bindAdditionalEvents();\n }\n\n bindAdditionalEvents() {\n this.$schoolResetButton.on(\n 'click.SchoolField',\n this.handleSchoolRemoval.bind(this)\n );\n if (this.allowFreeText)\n this.$searchInput.on(\n 'input.SchoolField',\n this.handleTypeaheadChange.bind(this)\n );\n }\n\n unbindEvents() {\n this.$schoolResetButton.off('click.SchoolField', this.handleSchoolRemoval);\n if (this.allowFreeText)\n this.$searchInput.off('input.SchoolField', this.handleTypeaheadChange);\n }\n\n handleSchoolRemoval() {\n this.$schoolNameInputElement.val(null);\n this.$idInputElement.val(null);\n this.$searchInput.removeClass('hidden');\n this.$parentElement.removeClass('form-group--schoolField-hidden');\n this.$schoolPreview.addClass('hidden');\n }\n\n handleTypeaheadSelect(_event, school) {\n // Because Safari on iOS call the \"close\" event before the \"select\" event,\n // we need to debounce the cancel the cleanFieldTimeout on a \"select\" event.\n this.cleanFieldTimeout = null;\n this.currentValue = school.name;\n this.$idInputElement.val(school.id);\n }\n\n handleTypeaheadClose() {\n // Because Safari on iOS call the \"close\" event before the \"select\" event,\n // we need to debounce the cleanFieldTimeout and cancel it if we are in a \"select\" event.\n this.cleanFieldTimeout = setTimeout(() => {\n const typedValue = this.$searchInput.typeahead('val');\n\n if (typedValue)\n return this.$searchInput.typeahead('val', this.currentValue);\n\n this._clearValue();\n }, 100);\n }\n\n handleTypeaheadChange(event) {\n this.$schoolNameInputElement.val(event.target.value);\n this.currentValue = event.target.value;\n this.$idInputElement.val(null);\n }\n\n getTypeaheadSources() {\n const url = this.$typeaheadInput.data('url');\n return [this.buildSchoolsSource(url)];\n }\n\n /* eslint-disable quote-props */\n buildSchoolsSource(url) {\n return {\n name: 'schools',\n displayKey: 'name',\n limit: 5,\n source: this.createTypeaheadSource(url, (response) => {\n return response.schools.map((school) => ({\n id: school.id,\n name: school.name,\n }));\n }),\n templates: {\n suggestion: (item) => {\n return StringHelper.replaceTokens(this.schoolTemplate, {\n __name__: item.name,\n });\n },\n },\n };\n }\n /* eslint-enable quote-props */\n\n _clearValue() {\n this.currentValue = '';\n this.$idInputElement.val(null);\n this.$searchInput.typeahead('val', null);\n }\n}\n","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar g; // This works in non-strict mode\n\ng = function () {\n return this;\n}();\n\ntry {\n // This works if eval is allowed (see CSP)\n g = g || new Function(\"return this\")();\n} catch (e) {\n // This works if the window reference is available\n if ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\") g = window;\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\n\nmodule.exports = g;","import Component from '../component';\nimport PhoneField from './phone-field';\nimport SchoolField from './school-field';\n\nexport default class ArrayField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n this.counter = this.$element.find('.arrayField-item').length - 1;\n\n this.$formElement = this.$element.closest('form');\n this.$templateElement = this.$element.find('.arrayField-template');\n\n this.updateButtonsVisibility();\n this.bindEvents();\n }\n\n bindEvents() {\n this.handleDuplicateClick = this.handleDuplicateClick.bind(this);\n this.handleRemoveClick = this.handleRemoveClick.bind(this);\n this.handleFormSubmit = this.handleFormSubmit.bind(this);\n\n this.$element.on(\n 'click.ArrayField',\n '.arrayField-duplicateButton',\n this.handleDuplicateClick\n );\n this.$element.on(\n 'click.ArrayField',\n '.arrayField-removeButton',\n this.handleRemoveClick\n );\n this.$formElement.on('submit.ArrayField', this.handleFormSubmit);\n }\n\n unbindEvents() {\n this.$element.off(\n 'click.ArrayField',\n '.arrayField-duplicateButton',\n this.handleDuplicateClick\n );\n this.$element.off(\n 'click.ArrayField',\n '.arrayField-removeButton',\n this.handleRemoveClick\n );\n this.$formElement.off('submit.ArrayField', this.handleFormSubmit);\n }\n\n duplicateTemplate() {\n const newHTML = this.$templateElement.clone().html();\n this.counter++;\n this.$element.append(newHTML.replace(/__index__/g, this.counter));\n\n this.duplicateCallback(this.$element.children().last());\n }\n\n duplicateCallback($duplicatedElement) {\n if (\n $duplicatedElement[0] &&\n $duplicatedElement[0].classList.contains('phoneField')\n ) {\n PhoneField.initialize($duplicatedElement);\n }\n SchoolField.initialize($duplicatedElement.find('.schoolField'));\n }\n\n updateButtonsVisibility() {\n const $items = this.$element.children('.arrayField-item');\n\n $items.find('.arrayField-duplicateButton').hide();\n $items.last().find('.arrayField-duplicateButton').show();\n\n if ($items.length === 1) {\n $items.find('.arrayField-removeButton').hide();\n } else {\n $items.find('.arrayField-removeButton').show();\n }\n }\n\n handleDuplicateClick(event) {\n this.duplicateTemplate();\n this.updateButtonsVisibility();\n\n event.preventDefault();\n }\n\n handleRemoveClick(event) {\n $(event.target).closest('.arrayField-item').remove();\n this.updateButtonsVisibility();\n\n event.preventDefault();\n }\n\n handleFormSubmit() {\n this.$templateElement.remove();\n }\n}\n","import Component from '../component';\n\nconst DATEPICKER_ATTRIBUTES = {\n format: 'yyyy-mm-dd',\n todayBtn: true,\n language: 'fr',\n autoclose: true,\n todayHighlight: true,\n disableTouchKeyboard: true,\n};\n\nexport default class DatePicker extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n this.$element.addClass('needsclick');\n this.attributes = {\n startView: this.$element.data('start-view'),\n startDate: this.$element.data('start-date'),\n endDate: this.$element.data('end-date'),\n todayHighlight: this.$element.data('today-highlight'),\n };\n\n this.bindEvents();\n }\n\n bindEvents() {\n const attributes = {...DATEPICKER_ATTRIBUTES, ...this.attributes};\n this.$element.datepicker(attributes);\n }\n\n unbindEvents() {\n this.$element.datepicker('destroy');\n }\n}\n","import Component from '../component';\n\nexport default class DropdownSelect extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$selectElement = $(element);\n this.buildComponentHTML();\n }\n\n buildComponentHTML() {\n this.$selectElement\n .removeClass('dropdownSelect')\n .addClass('dropdownSelect-select');\n\n this.$selectElement.wrap('
');\n this.$element = this.$selectElement.parent();\n this.$element.append(\n '
'\n );\n }\n}\n","import Component from '../component';\n\nexport default class DynamicDropdown extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n this.$parentTarget = $(this.$element.data('dynamic-target'));\n this.$target = this.$parentTarget.find('select');\n this.url = this.$element.data('dynamic-url');\n\n this.bindEvents();\n this.requestTargetOptions(this.$element.val());\n }\n\n bindEvents() {\n this.handleChange = this.handleChange.bind(this);\n\n this.$element.on('change.DynamicDropdown', this.handleChange);\n }\n\n unbindEvents() {\n this.$element.off('change.DynamicDropdown', this.handleChange);\n }\n\n handleChange(event) {\n this.requestTargetOptions(event.target.value);\n }\n\n handleAJAXSuccess(data) {\n if (!data.options.length) return this.disableTargetDropdown();\n\n this.$parentTarget.removeClass('hidden');\n this.$target.prop('disabled', false);\n this.loadTargetDropdown(data.options);\n }\n\n requestTargetOptions(value) {\n if (!value) return this.disableTargetDropdown();\n\n const data = {\n [this.$element.data('dynamic-query-param')]: value,\n };\n\n $.ajax({url: this.url, data}).done((data) => this.handleAJAXSuccess(data));\n }\n\n disableTargetDropdown() {\n this.$target.val('');\n this.$parentTarget.addClass('hidden');\n this.$target.prop('disabled', true);\n this.loadTargetDropdown([]);\n }\n\n loadTargetDropdown(options) {\n const select = this.$target[0];\n const selectedOption = this.$target.find(':selected').val();\n select.innerHTML = '';\n\n options.forEach((option) => {\n const opt = document.createElement('option');\n opt.value = option.value;\n opt.selected = String(option.value) === selectedOption;\n opt.innerHTML = option.label;\n select.appendChild(opt);\n });\n }\n}\n","import Component from '../component';\n\nconst OTHER_OCCUPATION_NAME = 'Autre';\n\nexport default class OtherOccupationField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n this.$name = this.$element.find(':selected').attr('name');\n\n this.bindEvents();\n\n this.manageOtherOccupationField();\n this.manageTeacherOrganizationRequirement();\n }\n\n bindEvents() {\n this.handleChange = this.handleChange.bind(this);\n\n this.$element.on('change.OtherOccupationField', this.handleChange);\n }\n\n unbindEvents() {\n this.$element.off('change.OtherOccupationField', this.handleChange);\n }\n\n manageOtherOccupationField() {\n const method = this.$name === OTHER_OCCUPATION_NAME ? 'show' : 'hide';\n\n $('.other-occupation-field')[method]();\n }\n\n manageTeacherOrganizationRequirement() {\n $('.form-teacherOrganization-label').toggleClass(\n 'form-label--required',\n this.$name !== OTHER_OCCUPATION_NAME\n );\n }\n\n handleChange() {\n this.$name = this.$element.find(':selected').attr('name');\n\n this.manageOtherOccupationField();\n this.manageTeacherOrganizationRequirement();\n }\n}\n","import Component from '../component';\n\nexport default class PhotoUploader extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n\n this.$input = this.$element.find('.photoUploader-input');\n this.$preview = this.$element.find('.photoUploader-image');\n\n this.bindEvents();\n }\n\n bindEvents() {\n this.updatePreview = this.updatePreview.bind(this);\n this.$input.on('change', this.updatePreview);\n }\n\n unbindEvents() {\n this.$input.off('change', this.updatePreview);\n }\n\n updatePreview() {\n this.$preview.attr(\n 'src',\n URL.createObjectURL(this.$input.prop('files')[0])\n );\n }\n}\n","import Component from '../component';\nimport StringHelper from '../../helpers/string-helper';\n\nexport const ENTER_KEYCODE = 13;\n\nexport default class TagField extends Component {\n constructor(element) {\n super(...arguments);\n\n const DEFAULT_MIN_LENGTH = 3;\n\n this.$element = $(element);\n this.$formElement = this.$element.closest('form');\n this.url = this.$element.data('url');\n\n this.maxTags = this.$element.data('max-tags');\n this.disallowAddTag = this.$element.data('disallow-add-tag');\n this.emptyLabel = this.$element.data('empty-label') || null;\n this.searchMinLength =\n this.$element.data('search-min-length') || DEFAULT_MIN_LENGTH;\n\n this.createBootstrapComponents();\n this.bindEvents();\n }\n\n bindEvents() {\n this.handleAutoCompleteSelect = this.handleAutoCompleteSelect.bind(this);\n this.handleTagAdd = this.handleTagAdd.bind(this);\n this.handleTagRemove = this.handleTagRemove.bind(this);\n this.handleFieldBlur = this.handleFieldBlur.bind(this);\n\n this.typeaheadInstance.on(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n this.$element.on('itemAdded', this.handleTagAdd);\n this.$element.on('itemRemoved', this.handleTagRemove);\n\n // Unbind Typeahead’s own blur event because we need its value before we\n // clear the field.\n this.typeaheadInstance.off('blur.tt');\n this.typeaheadInstance.on('blur.TagField', this.handleFieldBlur);\n }\n\n unbindEvents() {\n this.typeaheadInstance.off(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n this.$element.off('itemAdded', this.handleTagAdd);\n this.$element.off('itemRemoved', this.handleTagRemove);\n this.typeaheadInstance.off('blur.TagField', this.handleFieldBlur);\n\n this.$tagsInputElement.off('keydown.TagField', this.handleChange);\n\n this.destroyBootstrapComponents();\n }\n\n createBootstrapComponents() {\n const COMMA_KEYCODE = 188;\n const TAB_KEYCODE = 9;\n\n let options = {\n tagClass: () => 'tagField-tag',\n itemText: (item) => this.sanitizeItemText(item),\n confirmKeys: [ENTER_KEYCODE, COMMA_KEYCODE, TAB_KEYCODE],\n freeInput: !this.disallowAddTag,\n };\n\n if (this.maxTags) {\n options = {...options, maxTags: this.maxTags};\n }\n\n // First, initialize the tagsinput component\n this.$element.tagsinput(options);\n\n this.$tagsInputElement = this.$element\n .tagsinput('input')\n .closest('.bootstrap-tagsinput');\n\n this.handleChange = this.handleChange.bind(this);\n\n this.$tagsInputElement.on('keydown.TagField', this.handleChange);\n\n // Next, initialize the typeahead component on the newly created tagsinput field\n const typeaheadOptions = {\n hint: false,\n highlight: true,\n minLength: this.searchMinLength,\n };\n this.typeaheadInstance = this.$element\n .tagsinput('input')\n .typeahead(typeaheadOptions, this.getTypeaheadSourceOptions());\n\n if (this.$element.attr('autofocus')) {\n setTimeout(() => this.autoFocusInput(), 100);\n }\n }\n\n destroyBootstrapComponents() {\n this.$element.tagsinput('input').typeahead('destroy');\n this.$element.tagsinput('destroy');\n }\n\n // Typeahead + Bloodhound\n\n getTypeaheadSourceOptions() {\n const source = this.getTypeaheadSource();\n\n return {\n name: 'states',\n displayKey: 'name',\n source: source.ttAdapter(),\n templates: {\n suggestion: (item) => `${item.name}`,\n empty: () => {\n if (this.emptyLabel === null) return;\n\n return `
${this.emptyLabel}
`;\n },\n },\n };\n }\n\n getTypeaheadSource() {\n const source = new window.Bloodhound({\n datumTokenizer: window.Bloodhound.tokenizers.whitespace('name'),\n queryTokenizer: window.Bloodhound.tokenizers.whitespace,\n remote: {\n wildcard: '%QUERY',\n url: `${this.$element.data('url')}?q=%QUERY`,\n filter: (parsedResponse) => this.filterRemoteTags(parsedResponse),\n },\n });\n\n source.initialize();\n\n return source;\n }\n\n filterRemoteTags(parsedResponse) {\n if (parsedResponse.tags) {\n return parsedResponse.tags;\n }\n\n return parsedResponse;\n }\n\n sanitizeItemText(item) {\n const MAX_LENGTH = 50;\n const TRUNCATED_LENGTH = 40;\n\n const text = item ? StringHelper.capitalize(item) : item;\n\n if (text.length > MAX_LENGTH) {\n return `${text.substr(0, TRUNCATED_LENGTH)}…`;\n } else {\n return text;\n }\n }\n\n autoFocusInput() {\n this.$element.tagsinput('input').focus();\n }\n\n addTag(tagValue) {\n this.$element.tagsinput('add', tagValue);\n this.resetInputValue();\n }\n\n resetInputValue() {\n this.$element.tagsinput('input').typeahead('val', '');\n }\n\n handleAutoCompleteSelect(_, datum) {\n this.addTag(datum.name);\n }\n\n handleTagAdd() {\n // Hide the input if maxTags is reached\n if (\n this.maxTags &&\n this.maxTags <= this.$tagsInputElement.find('.tag').length\n ) {\n this.$tagsInputElement.find('.tt-input').hide();\n }\n\n this.resetInputValue();\n }\n\n handleTagRemove() {\n // Show the input if maxTags is reached\n if (\n this.maxTags &&\n this.maxTags > this.$tagsInputElement.find('.tag').length\n ) {\n this.$tagsInputElement.find('.tt-input').show();\n }\n }\n\n handleFieldBlur() {\n if (this.disallowAddTag) {\n this.typeaheadInstance.typeahead('val', '');\n return;\n }\n\n this.addTag(this.typeaheadInstance.val());\n this.resetInputValue();\n }\n\n handleChange(event) {\n if (this.disallowAddTag && event.keyCode === ENTER_KEYCODE) {\n event.preventDefault();\n return;\n }\n\n const MULTIPLIER = 0.2;\n const MAX_SIZE_ADDITION = 5;\n\n const $input = this.$element.tagsinput('input');\n // NOTE : `+ Math.max(Math.floor($input.val().length * 0.2), 5)` is used to correct a glitch\n // on iOS where even with only 2 letters typed, we often don’t see them because the `size` of the field is to low\n const size =\n $input.val().length +\n Math.max(Math.floor($input.val().length * MULTIPLIER), MAX_SIZE_ADDITION);\n\n $input.attr('size', size);\n }\n}\n","/* eslint-disable no-console */\nimport Component from '../component';\n\nexport default class RegionDropdown extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$parentForm = $(element);\n\n this.$province = $(this.$parentForm.find('.provinceFieldInput')[0]);\n\n this.$region = $(this.$parentForm.find('.regionFieldInput')[0]);\n\n this.defaultStateId = this.$region.data('default-state-id');\n\n this.updateRowVisibility();\n this.bindEvents();\n }\n\n bindEvents() {\n this.onStateChanged = this.onStateChanged.bind(this);\n\n this.$province.on('input', this.onStateChanged);\n }\n\n unbindEvents() {\n this.$province.off('change');\n }\n\n onStateChanged() {\n this.updateRowVisibility();\n }\n\n updateRowVisibility() {\n if (this.$province[0] && this.$region[0]) {\n const regionDropdown = this.$region.parents('.regionField').first();\n if (this.$province[0].value === this.defaultStateId.toString()) {\n regionDropdown.show();\n } else {\n regionDropdown.hide();\n this.$region[0].value = '';\n }\n }\n }\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Stack = exports.Direction = exports.Card = undefined;\n\nvar _Card = require('./Card');\n\nvar _Card2 = _interopRequireDefault(_Card);\n\nvar _Direction = require('./Direction');\n\nvar _Direction2 = _interopRequireDefault(_Direction);\n\nvar _Stack = require('./Stack');\n\nvar _Stack2 = _interopRequireDefault(_Stack);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nexports.Card = _Card2[\"default\"];\nexports.Direction = _Direction2[\"default\"];\nexports.Stack = _Stack2[\"default\"];","import Component from '../component';\n\nexport default class MaxSizeFileField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n this.maxSize = parseInt(this.$element.data('max-size'), 10);\n this.maxSizeMessage = this.$element.data('max-size-message');\n\n this.bindEvents();\n }\n\n bindEvents() {\n this.handleFieldChange = this.handleFieldChange.bind(this);\n\n this.$element.on('change.MaxSizeFileField', this.handleFieldChange);\n }\n\n unbindEvents() {\n this.$element.off('change.MaxSizeFileField', this.handleFieldChange);\n }\n\n handleFieldChange(event) {\n if (window.FileReader) {\n const file = event.currentTarget.files[0];\n\n if (file.size > this.maxSize) {\n // eslint-disable-next-line no-alert\n window.alert(this.maxSizeMessage);\n this.$element.val('');\n }\n }\n }\n}\n","export const setup = () => {\n window.Turbolinks.reload = (opts) => {\n opts = {keepScrollPosition: false, ...opts};\n\n if (opts.keepScrollPosition) {\n // Keep current scroll position\n window.Turbolinks.originalOffset = $('.wrapper').scrollTop();\n\n // Bind event that will be triggered after the page is reloaded\n $(document).on('turbolinks:load.TurbolinksReload', () => {\n $('.wrapper').scrollTop(window.Turbolinks.originalOffset);\n\n $(document).off('turbolinks:load.TurbolinksReload');\n });\n }\n\n // Visit the same URL\n window.Turbolinks.visit(window.location.pathname + window.location.search);\n };\n};\n","import Component from '../component';\nimport OrganizationField from './organization-field';\n\nexport default class ArrayFieldCocoon extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n\n this.$duplicateButton = this.$element.find('.arrayField-duplicateButton');\n\n this.appendFirstItem();\n this.refreshButtonPositions();\n this.bindEvents();\n }\n\n bindEvents() {\n this.handleAfterInsert = this.handleAfterInsert.bind(this);\n this.handleBeforeRemove = this.handleBeforeRemove.bind(this);\n this.handleAfterRemove = this.handleAfterRemove.bind(this);\n\n this.$element.on(\n 'cocoon:after-insert.ArrayFieldCocoon',\n this.handleAfterInsert\n );\n this.$element.on(\n 'cocoon:before-remove.ArrayFieldCocoon',\n this.handleBeforeRemove\n );\n this.$element.on(\n 'cocoon:after-remove.ArrayFieldCocoon',\n this.handleAfterRemove\n );\n }\n\n unbindEvents() {\n this.$element.off(\n 'cocoon:after-insert.ArrayFieldCocoon',\n this.handleAfterInsert\n );\n this.$element.off(\n 'cocoon:before-remove.ArrayFieldCocoon',\n this.handleBeforeRemove\n );\n this.$element.off(\n 'cocoon:after-remove.ArrayFieldCocoon',\n this.handleAfterRemove\n );\n\n if (this.organizationFields) {\n this.organizationFields.forEach((field) => field.unbindEvents());\n }\n }\n\n appendFirstItem() {\n if (!this.currentItems().length) {\n this.$duplicateButton.click();\n }\n }\n\n handleAfterInsert() {\n this.refreshButtonPositions();\n\n const $organizationFields = this.$element.find('.organizationField');\n\n if ($organizationFields.length) {\n this.organizationFields = OrganizationField.initialize(\n $organizationFields\n );\n }\n }\n\n handleBeforeRemove() {\n this.refreshButtonPositions();\n }\n\n handleAfterRemove() {\n this.refreshButtonPositions();\n }\n\n refreshButtonPositions() {\n this.moveDuplicateButtonToFirstItem();\n this.placeDuplicateButton();\n\n if (this.currentItems().length === 1) {\n this.hideRemoveLinks();\n } else {\n this.showRemoveLinks();\n }\n }\n\n moveDuplicateButtonToFirstItem() {\n const $buttons = this.currentItems().first().find('.arrayField-buttons');\n\n $buttons.append(this.$duplicateButton);\n this.$duplicateButton.hide();\n }\n\n placeDuplicateButton() {\n const $buttons = this.currentItems().last().find('.arrayField-buttons');\n\n $buttons.append(this.$duplicateButton);\n this.$duplicateButton.show();\n }\n\n showRemoveLinks() {\n this.currentItems().find('.arrayField-removeButton').show();\n }\n\n hideRemoveLinks() {\n this.currentItems().find('.arrayField-removeButton').hide();\n }\n\n currentItems() {\n return this.$element.find('.arrayField-item:visible');\n }\n}\n","import Component from '../component';\n\nexport default class AssociationsField extends Component {\n constructor(element) {\n super(...arguments);\n\n this.$element = $(element);\n\n this.$inputElement = this.$element.find('.associationsField-input');\n this.$choicesElement = this.$element.find('.associationsField-choices');\n this.$suggestionItemTemplate = this.$element.find(\n '.associationsField-suggestionTemplate'\n );\n this.$freeTextSuggetionItemTemplate = this.$element.find(\n '.associationsField-freeTextSuggestionTemplate'\n );\n this.$choiceTemplate = this.$element.find(\n '.associationsField-choiceTemplate'\n );\n this.$freeTextChoiceTemplate = this.$element.find(\n '.associationsField-freeTextChoiceTemplate'\n );\n\n this.bindEvents();\n\n this.$typeaheadElement = this.$element.find('.twitter-typeahead');\n }\n\n fetchDOMChoices() {\n return this.$element.find('.associationsField-choices');\n }\n\n bindEvents() {\n this.bindDynamicEvents();\n this.createBootstrapComponents();\n\n this.handleAutoCompleteSelect = this.handleAutoCompleteSelect.bind(this);\n\n this.typeaheadInstance.on(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n }\n\n unbindEvents() {\n this.typeaheadInstance.off(\n 'typeahead:selected',\n this.handleAutoCompleteSelect\n );\n\n this.unbindDynamicEvents();\n this.destroyBootstrapComponents();\n }\n\n bindDynamicEvents() {\n this.unbindDynamicEvents();\n\n this.handleChoiceRemoval = this.handleChoiceRemoval.bind(this);\n\n this.fetchDOMChoices()\n .find('.associationsField-choice-removal')\n .on('click', this.handleChoiceRemoval);\n }\n\n unbindDynamicEvents() {\n this.fetchDOMChoices()\n .find('.associationsField-choice-removal')\n .off('click', this.handleChoiceRemoval);\n }\n\n createBootstrapComponents() {\n const typeaheadOptions = {hint: false, highlight: true};\n\n this.typeaheadInstance = this.$inputElement.typeahead(\n typeaheadOptions,\n this.getTypeaheadSourceOptions()\n );\n }\n\n destroyBootstrapComponents() {\n this.$inputElement.typeahead('destroy');\n }\n\n buildOrganizationSuggestionTemplate(item) {\n const selectedOrganizationIDs = this.fetchSelectedOrganizationIDs();\n\n if (!selectedOrganizationIDs.includes(item.id.toString())) {\n this.preloadImage(item.photo.url);\n\n const newHTML = this.$suggestionItemTemplate.clone().html();\n const suggestionItem = newHTML\n .replace(/__name__/g, item.name)\n .replace(/data-src/g, 'src')\n .replace(/__photo_url__/g, item.photo.url);\n\n return suggestionItem;\n }\n }\n\n buildFreeTextOrganizationSuggestionTemplate(item) {\n const selectedFreeTextOrganizationNames = this.fetchSelectedFreeTextOrganizationNames();\n\n if (!selectedFreeTextOrganizationNames.includes(item.name)) {\n const newHTML = this.$freeTextSuggetionItemTemplate.clone().html();\n const suggestionItem = newHTML.replace(/__name__/g, item.name);\n\n return suggestionItem;\n }\n }\n\n buildSuggestionTemplate(item) {\n if (item.freeText) {\n return this.buildFreeTextOrganizationSuggestionTemplate(item);\n } else {\n return this.buildOrganizationSuggestionTemplate(item);\n }\n }\n\n fetchSelectedOrganizationIDs() {\n return this.$choicesElement\n .find('.associationsField-choice-organizationId')\n .map(function () {\n return $(this).val();\n })\n .toArray();\n }\n\n fetchSelectedFreeTextOrganizationNames() {\n return this.$choicesElement\n .find('.associationsField-choice-freeTextOrganizationName')\n .map(function () {\n return $(this).val();\n })\n .toArray();\n }\n\n handleOrganizationAutocompleteSelect(selection) {\n const newHTML = this.$choiceTemplate.clone().html();\n const choiceElement = newHTML\n .replace(/__name__/g, selection.name)\n .replace(/input-name/g, 'name')\n .replace(/__organization_id__/g, selection.id)\n .replace(/data-src/g, 'src')\n .replace(/__photo_url__/g, selection.photo.url);\n\n return choiceElement;\n }\n\n handleFreeTextOrganizationAutocompleteSelect(selection) {\n const newHTML = this.$freeTextChoiceTemplate.clone().html();\n const choiceElement = newHTML\n .replace(/__name__/g, selection.name)\n .replace(/input-name/g, 'name')\n .replace(/__association_name__/g, selection.name);\n\n return choiceElement;\n }\n\n handleAutoCompleteSelect(_, selection) {\n if (selection.photo) this.preloadImage(selection.photo.url);\n this.removeEmptyAssociationsValue();\n\n const choiceElement = selection.freeText\n ? this.handleFreeTextOrganizationAutocompleteSelect(selection)\n : this.handleOrganizationAutocompleteSelect(selection);\n\n this.$choicesElement.append(choiceElement);\n this.$choicesElement.removeClass('hidden');\n this.$inputElement.typeahead('val', '');\n\n this.bindDynamicEvents();\n }\n\n removeEmptyAssociationsValue() {\n this.$choicesElement.find('.associationsField-choice.hidden').remove();\n }\n\n addEmptyAssociationsValue(newHTML) {\n let choiceElement = newHTML\n .replace(/__name__/g, '')\n .replace(/input-name/g, 'name')\n .replace(/__association_name__/g, '')\n .replace(/__organization_id__/g, '');\n\n choiceElement = $(choiceElement).addClass('hidden');\n this.$choicesElement.append(choiceElement);\n }\n\n handleChoiceRemoval(event) {\n $(event.currentTarget).closest('.associationsField-choice').remove();\n\n if (\n this.$choicesElement.find('.associationsField-choice--association')\n .length <= 1\n ) {\n const newHTML = this.$choiceTemplate.clone().html();\n this.addEmptyAssociationsValue(newHTML);\n }\n\n if (\n this.$choicesElement.find('.associationsField-choice--freeText').length <=\n 1\n ) {\n const newHTML = this.$freeTextChoiceTemplate.clone().html();\n this.addEmptyAssociationsValue(newHTML);\n }\n }\n\n preloadImage(src) {\n const image = new Image();\n\n image.src = src;\n }\n\n buildFreeTextAssociationFromQuery(query) {\n return {\n name: query,\n freeText: true,\n };\n }\n\n filterRemoteTags(parsedResponse, query) {\n const responseOrganizations = parsedResponse.organizations;\n responseOrganizations.push(this.buildFreeTextAssociationFromQuery(query));\n\n return responseOrganizations;\n }\n\n getTypeaheadSource() {\n const source = new window.Bloodhound({\n datumTokenizer: window.Bloodhound.tokenizers.whitespace('name'),\n queryTokenizer: window.Bloodhound.tokenizers.whitespace,\n limit: Infinity,\n remote: {\n wildcard: '%QUERY',\n url: `${this.$element.data('url')}?q=%QUERY`,\n filter: (parsedResponse) =>\n this.filterRemoteTags(parsedResponse, this.$inputElement.val()),\n },\n });\n\n source.initialize();\n\n return source;\n }\n\n getTypeaheadSourceOptions() {\n const source = this.getTypeaheadSource();\n\n return {\n name: 'states',\n displayKey: 'name',\n source: source.ttAdapter(),\n templates: {\n suggestion: (item) => this.buildSuggestionTemplate(item),\n },\n };\n }\n}\n","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * @license\n * Lodash \n * Copyright OpenJS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;\n(function () {\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n /** Used as the semantic version number. */\n\n var VERSION = '4.17.20';\n /** Used as the size to enable large array optimizations. */\n\n var LARGE_ARRAY_SIZE = 200;\n /** Error message constants. */\n\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function';\n /** Used to stand-in for `undefined` hash values. */\n\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n /** Used as the maximum memoize cache size. */\n\n var MAX_MEMOIZE_SIZE = 500;\n /** Used as the internal argument placeholder. */\n\n var PLACEHOLDER = '__lodash_placeholder__';\n /** Used to compose bitmasks for cloning. */\n\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n /** Used to compose bitmasks for value comparisons. */\n\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n /** Used to compose bitmasks for function metadata. */\n\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 /** Used as default options for `_.truncate`. */\n\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n /** Used to indicate the type of lazy iteratees. */\n\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n /** Used as references for various `Number` constants. */\n\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n /** Used as references for the maximum length and index of an array. */\n\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n /** Used to associate wrap methods with their bit flags. */\n\n var wrapFlags = [['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG]];\n /** `Object#toString` result references. */\n\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 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 /** Used to match empty string literals in compiled template source. */\n\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n /** Used to match HTML entities and HTML characters. */\n\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n /** Used to match template delimiters. */\n\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n /** Used to match property names within property paths. */\n\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n /** Used to match leading and trailing whitespace. */\n\n var reTrim = /^\\s+|\\s+$/g,\n reTrimStart = /^\\s+/,\n reTrimEnd = /\\s+$/;\n /** Used to match wrap detail comments. */\n\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n /** Used to match words composed of alphanumeric characters. */\n\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n /** Used to match backslashes in property paths. */\n\n var reEscapeChar = /\\\\(\\\\)?/g;\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n /** Used to match `RegExp` flags from their coerced string values. */\n\n var reFlags = /\\w*$/;\n /** Used to detect bad signed hexadecimal string values. */\n\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n /** Used to detect binary string values. */\n\n var reIsBinary = /^0b[01]+$/i;\n /** Used to detect host constructors (Safari). */\n\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n /** Used to detect octal string values. */\n\n var reIsOctal = /^0o[0-7]+$/i;\n /** Used to detect unsigned integer values. */\n\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n /** Used to ensure capturing order of template delimiters. */\n\n var reNoMatch = /($^)/;\n /** Used to match unescaped characters in compiled string literals. */\n\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n /** Used to compose unicode character classes. */\n\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 /** Used to compose unicode capture groups. */\n\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 /** Used to compose unicode regexes. */\n\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 /** Used to match apostrophes. */\n\n var reApos = RegExp(rsApos, 'g');\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\n var reComboMark = RegExp(rsCombo, 'g');\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n /** Used to match complex or compound words. */\n\n var reUnicodeWord = RegExp([rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji].join('|'), 'g');\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\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n /** Used to detect strings that need a more robust regexp to match words. */\n\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 /** Used to assign default `context` object properties. */\n\n var contextProps = ['Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'];\n /** Used to make template sourceURLs easier to identify. */\n\n var templateCounter = -1;\n /** Used to identify `toStringTag` values of typed arrays. */\n\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;\n /** Used to map Latin Unicode letters to basic Latin letters. */\n\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A',\n '\\xc1': 'A',\n '\\xc2': 'A',\n '\\xc3': 'A',\n '\\xc4': 'A',\n '\\xc5': 'A',\n '\\xe0': 'a',\n '\\xe1': 'a',\n '\\xe2': 'a',\n '\\xe3': 'a',\n '\\xe4': 'a',\n '\\xe5': 'a',\n '\\xc7': 'C',\n '\\xe7': 'c',\n '\\xd0': 'D',\n '\\xf0': 'd',\n '\\xc8': 'E',\n '\\xc9': 'E',\n '\\xca': 'E',\n '\\xcb': 'E',\n '\\xe8': 'e',\n '\\xe9': 'e',\n '\\xea': 'e',\n '\\xeb': 'e',\n '\\xcc': 'I',\n '\\xcd': 'I',\n '\\xce': 'I',\n '\\xcf': 'I',\n '\\xec': 'i',\n '\\xed': 'i',\n '\\xee': 'i',\n '\\xef': 'i',\n '\\xd1': 'N',\n '\\xf1': 'n',\n '\\xd2': 'O',\n '\\xd3': 'O',\n '\\xd4': 'O',\n '\\xd5': 'O',\n '\\xd6': 'O',\n '\\xd8': 'O',\n '\\xf2': 'o',\n '\\xf3': 'o',\n '\\xf4': 'o',\n '\\xf5': 'o',\n '\\xf6': 'o',\n '\\xf8': 'o',\n '\\xd9': 'U',\n '\\xda': 'U',\n '\\xdb': 'U',\n '\\xdc': 'U',\n '\\xf9': 'u',\n '\\xfa': 'u',\n '\\xfb': 'u',\n '\\xfc': 'u',\n '\\xdd': 'Y',\n '\\xfd': 'y',\n '\\xff': 'y',\n '\\xc6': 'Ae',\n '\\xe6': 'ae',\n '\\xde': 'Th',\n '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n \"\\u0100\": 'A',\n \"\\u0102\": 'A',\n \"\\u0104\": 'A',\n \"\\u0101\": 'a',\n \"\\u0103\": 'a',\n \"\\u0105\": 'a',\n \"\\u0106\": 'C',\n \"\\u0108\": 'C',\n \"\\u010A\": 'C',\n \"\\u010C\": 'C',\n \"\\u0107\": 'c',\n \"\\u0109\": 'c',\n \"\\u010B\": 'c',\n \"\\u010D\": 'c',\n \"\\u010E\": 'D',\n \"\\u0110\": 'D',\n \"\\u010F\": 'd',\n \"\\u0111\": 'd',\n \"\\u0112\": 'E',\n \"\\u0114\": 'E',\n \"\\u0116\": 'E',\n \"\\u0118\": 'E',\n \"\\u011A\": 'E',\n \"\\u0113\": 'e',\n \"\\u0115\": 'e',\n \"\\u0117\": 'e',\n \"\\u0119\": 'e',\n \"\\u011B\": 'e',\n \"\\u011C\": 'G',\n \"\\u011E\": 'G',\n \"\\u0120\": 'G',\n \"\\u0122\": 'G',\n \"\\u011D\": 'g',\n \"\\u011F\": 'g',\n \"\\u0121\": 'g',\n \"\\u0123\": 'g',\n \"\\u0124\": 'H',\n \"\\u0126\": 'H',\n \"\\u0125\": 'h',\n \"\\u0127\": 'h',\n \"\\u0128\": 'I',\n \"\\u012A\": 'I',\n \"\\u012C\": 'I',\n \"\\u012E\": 'I',\n \"\\u0130\": 'I',\n \"\\u0129\": 'i',\n \"\\u012B\": 'i',\n \"\\u012D\": 'i',\n \"\\u012F\": 'i',\n \"\\u0131\": 'i',\n \"\\u0134\": 'J',\n \"\\u0135\": 'j',\n \"\\u0136\": 'K',\n \"\\u0137\": 'k',\n \"\\u0138\": 'k',\n \"\\u0139\": 'L',\n \"\\u013B\": 'L',\n \"\\u013D\": 'L',\n \"\\u013F\": 'L',\n \"\\u0141\": 'L',\n \"\\u013A\": 'l',\n \"\\u013C\": 'l',\n \"\\u013E\": 'l',\n \"\\u0140\": 'l',\n \"\\u0142\": 'l',\n \"\\u0143\": 'N',\n \"\\u0145\": 'N',\n \"\\u0147\": 'N',\n \"\\u014A\": 'N',\n \"\\u0144\": 'n',\n \"\\u0146\": 'n',\n \"\\u0148\": 'n',\n \"\\u014B\": 'n',\n \"\\u014C\": 'O',\n \"\\u014E\": 'O',\n \"\\u0150\": 'O',\n \"\\u014D\": 'o',\n \"\\u014F\": 'o',\n \"\\u0151\": 'o',\n \"\\u0154\": 'R',\n \"\\u0156\": 'R',\n \"\\u0158\": 'R',\n \"\\u0155\": 'r',\n \"\\u0157\": 'r',\n \"\\u0159\": 'r',\n \"\\u015A\": 'S',\n \"\\u015C\": 'S',\n \"\\u015E\": 'S',\n \"\\u0160\": 'S',\n \"\\u015B\": 's',\n \"\\u015D\": 's',\n \"\\u015F\": 's',\n \"\\u0161\": 's',\n \"\\u0162\": 'T',\n \"\\u0164\": 'T',\n \"\\u0166\": 'T',\n \"\\u0163\": 't',\n \"\\u0165\": 't',\n \"\\u0167\": 't',\n \"\\u0168\": 'U',\n \"\\u016A\": 'U',\n \"\\u016C\": 'U',\n \"\\u016E\": 'U',\n \"\\u0170\": 'U',\n \"\\u0172\": 'U',\n \"\\u0169\": 'u',\n \"\\u016B\": 'u',\n \"\\u016D\": 'u',\n \"\\u016F\": 'u',\n \"\\u0171\": 'u',\n \"\\u0173\": 'u',\n \"\\u0174\": 'W',\n \"\\u0175\": 'w',\n \"\\u0176\": 'Y',\n \"\\u0177\": 'y',\n \"\\u0178\": 'Y',\n \"\\u0179\": 'Z',\n \"\\u017B\": 'Z',\n \"\\u017D\": 'Z',\n \"\\u017A\": 'z',\n \"\\u017C\": 'z',\n \"\\u017E\": 'z',\n \"\\u0132\": 'IJ',\n \"\\u0133\": 'ij',\n \"\\u0152\": 'Oe',\n \"\\u0153\": 'oe',\n \"\\u0149\": \"'n\",\n \"\\u017F\": 's'\n };\n /** Used to map characters to HTML entities. */\n\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n /** Used to map HTML entities to characters. */\n\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n /** Used to escape characters for inclusion in compiled string literals. */\n\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n \"\\u2028\": 'u2028',\n \"\\u2029\": 'u2029'\n };\n /** Built-in method references without a dependency on `root`. */\n\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n /** Detect free variable `global` from Node.js. */\n\n var freeGlobal = (typeof global === \"undefined\" ? \"undefined\" : _typeof(global)) == 'object' && global && global.Object === Object && global;\n /** Detect free variable `self`. */\n\n var freeSelf = (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) == 'object' && self && self.Object === Object && self;\n /** Used as a reference to the global object. */\n\n var root = freeGlobal || freeSelf || Function('return this')();\n /** Detect free variable `exports`. */\n\n var freeExports = (typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) == 'object' && exports && !exports.nodeType && exports;\n /** Detect free variable `module`. */\n\n var freeModule = freeExports && (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) == 'object' && module && !module.nodeType && module;\n /** Detect the popular CommonJS extension `module.exports`. */\n\n var moduleExports = freeModule && freeModule.exports === freeExports;\n /** Detect free variable `process` from Node.js. */\n\n var freeProcess = moduleExports && freeGlobal.process;\n /** Used to access faster Node.js helpers. */\n\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 } // Legacy `process.binding('util')` for Node.js < 10.\n\n\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }();\n /* Node.js helper references. */\n\n\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 * 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\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0:\n return func.call(thisArg);\n\n case 1:\n return func.call(thisArg, args[0]);\n\n case 2:\n return func.call(thisArg, args[0], args[1]);\n\n case 3:\n return func.call(thisArg, args[0], args[1], args[2]);\n }\n\n return func.apply(thisArg, args);\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\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\n return accumulator;\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\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\n return array;\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\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\n return array;\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\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\n return true;\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\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\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n\n return result;\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\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 * 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\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\n return false;\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\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\n return result;\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\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\n return array;\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\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\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n\n return accumulator;\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\n\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[--length];\n }\n\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n\n return accumulator;\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\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\n return false;\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\n\n var asciiSize = baseProperty('length');\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\n function asciiToArray(string) {\n return string.split('');\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\n\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\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\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 * 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\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\n return -1;\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\n\n function baseIndexOf(array, value, fromIndex) {\n return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);\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\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\n return -1;\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\n\n function baseIsNaN(value) {\n return value !== value;\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\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 * 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\n\n function baseProperty(key) {\n return function (object) {\n return object == null ? undefined : object[key];\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\n\n function basePropertyOf(object) {\n return function (key) {\n return object == null ? undefined : object[key];\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\n\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function (value, index, collection) {\n accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\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\n\n function baseSortBy(array, comparer) {\n var length = array.length;\n array.sort(comparer);\n\n while (length--) {\n array[length] = array[length].value;\n }\n\n return array;\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\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\n if (current !== undefined) {\n result = result === undefined ? current : result + current;\n }\n }\n\n return result;\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\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\n return result;\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\n\n function baseToPairs(object, props) {\n return arrayMap(props, function (key) {\n return [key, object[key]];\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\n\n function baseUnary(func) {\n return function (value) {\n return func(value);\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\n\n function baseValues(object, props) {\n return arrayMap(props, function (key) {\n return object[key];\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\n\n function cacheHas(cache, key) {\n return cache.has(key);\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\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\n return index;\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\n\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n\n return index;\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\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\n return result;\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\n\n var deburrLetter = basePropertyOf(deburredLetters);\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\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\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\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\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\n\n function getValue(object, key) {\n return object == null ? undefined : object[key];\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\n\n function hasUnicode(string) {\n return reHasUnicode.test(string);\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\n\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\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\n\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n\n return result;\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\n\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n map.forEach(function (value, key) {\n result[++index] = [key, value];\n });\n return result;\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\n\n function overArg(func, transform) {\n return function (arg) {\n return func(transform(arg));\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\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\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n\n return result;\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\n\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n set.forEach(function (value) {\n result[++index] = value;\n });\n return result;\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\n\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n set.forEach(function (value) {\n result[++index] = [value, value];\n });\n return result;\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\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\n return -1;\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\n\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n\n return index;\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\n\n function stringSize(string) {\n return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);\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\n\n function stringToArray(string) {\n return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);\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\n\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\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\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n\n while (reUnicode.test(string)) {\n ++result;\n }\n\n return result;\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\n\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\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\n\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\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\n\n var runInContext = function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n /** Built-in constructor references. */\n\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 /** Used for built-in method references. */\n\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n /** Used to detect overreaching core-js shims. */\n\n var coreJsData = context['__core-js_shared__'];\n /** Used to resolve the decompiled source of functions. */\n\n var funcToString = funcProto.toString;\n /** Used to check objects for own properties. */\n\n var hasOwnProperty = objectProto.hasOwnProperty;\n /** Used to generate unique IDs. */\n\n var idCounter = 0;\n /** Used to detect methods masquerading as native. */\n\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 * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\n\n var nativeObjectToString = objectProto.toString;\n /** Used to infer the `Object` constructor. */\n\n var objectCtorString = funcToString.call(Object);\n /** Used to restore the original `_` reference in `_.noConflict`. */\n\n var oldDash = root._;\n /** Used to detect if a method is native. */\n\n var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n /** Built-in value references. */\n\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 /** Mocked built-ins. */\n\n\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 /* Built-in method references for those with the same name as other `lodash` methods. */\n\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 /* Built-in method references that are verified to be native. */\n\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 /** Used to store function metadata. */\n\n var metaMap = WeakMap && new WeakMap();\n /** Used to lookup unminified function names. */\n\n var realNames = {};\n /** Used to detect maps, sets, and weakmaps. */\n\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n /** Used to convert symbols to primitives and strings. */\n\n var symbolProto = _Symbol ? _Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\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\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n\n return new LodashWrapper(value);\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\n\n var baseCreate = function () {\n function object() {}\n\n return function (proto) {\n if (!isObject(proto)) {\n return {};\n }\n\n if (objectCreate) {\n return objectCreate(proto);\n }\n\n object.prototype = proto;\n var result = new object();\n object.prototype = undefined;\n return result;\n };\n }();\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n\n\n function baseLodash() {// No operation performed.\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\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 * 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\n\n lodash.templateSettings = {\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 * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n }; // Ensure wrappers are instances of `baseLodash`.\n\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\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\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 * 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\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 * 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\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\n return result;\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\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\n var result = [];\n\n outer: while (length-- && resIndex < takeCount) {\n index += dir;\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\n result[resIndex++] = value;\n }\n\n return result;\n } // Ensure `LazyWrapper` is an instance of `baseLodash`.\n\n\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\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\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n\n\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\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\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 * 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\n\n function hashGet(key) {\n var data = this.__data__;\n\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\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\n\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\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\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 } // Add methods to `Hash`.\n\n\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 * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n\n\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\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\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\n var lastIndex = data.length - 1;\n\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n\n --this.size;\n return true;\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\n\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n return index < 0 ? undefined : data[index][1];\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\n\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\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\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\n return this;\n } // Add methods to `ListCache`.\n\n\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 * 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\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n\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 * 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\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 * 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\n\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\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\n\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\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\n\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n } // Add methods to `MapCache`.\n\n\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 * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n this.__data__ = new MapCache();\n\n while (++index < length) {\n this.add(values[index]);\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\n\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n\n return this;\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\n\n function setCacheHas(value) {\n return this.__data__.has(value);\n } // Add methods to `SetCache`.\n\n\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\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\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n\n\n function stackClear() {\n this.__data__ = new ListCache();\n this.size = 0;\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\n\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n this.size = data.size;\n return result;\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\n\n function stackGet(key) {\n return this.__data__.get(key);\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\n\n function stackHas(key) {\n return this.__data__.has(key);\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\n\n function stackSet(key, value) {\n var data = this.__data__;\n\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n\n if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n\n data = this.__data__ = new MapCache(pairs);\n }\n\n data.set(key, value);\n this.size = data.size;\n return this;\n } // Add methods to `Stack`.\n\n\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 * 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\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)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers.\n isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays.\n isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties.\n isIndex(key, length)))) {\n result.push(key);\n }\n }\n\n return result;\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\n\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\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\n\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\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\n\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\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\n\n function assignMergeValue(object, key, value) {\n if (value !== undefined && !eq(object[key], value) || value === undefined && !(key in object)) {\n baseAssignValue(object, key, value);\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\n\n function assignValue(object, key, value) {\n var objValue = object[key];\n\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined && !(key in object)) {\n baseAssignValue(object, key, value);\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\n\n function assocIndexOf(array, key) {\n var length = array.length;\n\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n\n return -1;\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\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 * 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\n\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\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\n\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\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\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 * 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\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\n return result;\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\n\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n\n return number;\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\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\n if (result !== undefined) {\n return result;\n }\n\n if (!isObject(value)) {\n return value;\n }\n\n var isArr = isArray(value);\n\n if (isArr) {\n result = initCloneArray(value);\n\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\n if (tag == objectTag || tag == argsTag || isFunc && !object) {\n result = isFlat || isFunc ? {} : initCloneObject(value);\n\n if (!isDeep) {\n return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n\n result = initCloneByTag(value, tag, isDeep);\n }\n } // Check for circular references and return its corresponding clone.\n\n\n stack || (stack = new Stack());\n var stacked = stack.get(value);\n\n if (stacked) {\n return stacked;\n }\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 ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;\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 } // Recursively populate clone (susceptible to call stack limits).\n\n\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\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\n\n function baseConforms(source) {\n var props = keys(source);\n return function (object) {\n return baseConformsTo(object, source, props);\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\n\n function baseConformsTo(object, source, props) {\n var length = props.length;\n\n if (object == null) {\n return !length;\n }\n\n object = Object(object);\n\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\n return true;\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\n\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n return setTimeout(function () {\n func.apply(undefined, args);\n }, wait);\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\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\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n } else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n\n outer: while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n value = comparator || value !== 0 ? value : 0;\n\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n\n result.push(value);\n } else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n\n return result;\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\n\n var baseEach = createBaseEach(baseForOwn);\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\n var baseEachRight = createBaseEach(baseForOwnRight, true);\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\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 * 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\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 ? current === current && !isSymbol(current) : comparator(current, computed))) {\n var computed = current,\n result = value;\n }\n }\n\n return result;\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\n\n function baseFill(array, value, start, end) {\n var length = array.length;\n start = toInteger(start);\n\n if (start < 0) {\n start = -start > length ? 0 : length + start;\n }\n\n end = end === undefined || end > length ? length : toInteger(end);\n\n if (end < 0) {\n end += length;\n }\n\n end = start > end ? 0 : toLength(end);\n\n while (start < end) {\n array[start++] = value;\n }\n\n return array;\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\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 * 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\n\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n\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\n return result;\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\n\n var baseFor = createBaseFor();\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\n var baseForRight = createBaseFor(true);\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\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\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\n\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\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\n\n function baseFunctions(object, props) {\n return arrayFilter(props, function (key) {\n return isFunction(object[key]);\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\n\n function baseGet(object, path) {\n path = castPath(path, object);\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n\n return index && index == length ? object : undefined;\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\n\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\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\n\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n\n return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\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\n\n function baseGt(value, other) {\n return value > other;\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\n\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\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\n\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\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\n\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\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\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\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined;\n }\n\n array = arrays[0];\n var index = -1,\n seen = caches[0];\n\n outer: while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n value = comparator || value !== 0 ? value : 0;\n\n if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {\n othIndex = othLength;\n\n while (--othIndex) {\n var cache = caches[othIndex];\n\n if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) {\n continue outer;\n }\n }\n\n if (seen) {\n seen.push(computed);\n }\n\n result.push(value);\n }\n }\n\n return result;\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\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 * 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\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 * 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\n\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\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\n\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\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\n\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\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\n\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n\n if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {\n return value !== value && other !== other;\n }\n\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\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\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 objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\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\n objIsArr = true;\n objIsObj = false;\n }\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack());\n return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\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 stack || (stack = new Stack());\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n\n if (!isSameTag) {\n return false;\n }\n\n stack || (stack = new Stack());\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\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\n\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\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\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\n object = Object(object);\n\n while (index--) {\n var data = matchData[index];\n\n if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {\n return false;\n }\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\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) {\n return false;\n }\n }\n }\n\n return true;\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\n\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\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\n\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\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\n\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\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\n\n function baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\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\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\n if (value == null) {\n return identity;\n }\n\n if (_typeof(value) == 'object') {\n return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);\n }\n\n return property(value);\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\n\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n\n var result = [];\n\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n\n return result;\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\n\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\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\n return result;\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\n\n function baseLt(value, other) {\n return value < other;\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\n\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n baseEach(collection, function (value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\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\n\n function baseMatches(source) {\n var matchData = getMatchData(source);\n\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n\n return function (object) {\n return object === source || baseIsMatch(object, source, matchData);\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\n\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n\n return function (object) {\n var objValue = get(object, path);\n return objValue === undefined && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\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\n\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n\n baseFor(source, function (srcValue, key) {\n stack || (stack = new Stack());\n\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n } else {\n var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + '', object, source, stack) : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\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\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\n var newValue = customizer ? customizer(objValue, srcValue, key + '', object, source, stack) : undefined;\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 newValue = srcValue;\n\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n } else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n } else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n } else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n } else {\n newValue = [];\n }\n } else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n } else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n } else {\n isCommon = false;\n }\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\n assignMergeValue(object, key, newValue);\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\n\n function baseNth(array, n) {\n var length = array.length;\n\n if (!length) {\n return;\n }\n\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\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\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\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n var result = baseMap(collection, function (value, key, collection) {\n var criteria = arrayMap(iteratees, function (iteratee) {\n return iteratee(value);\n });\n return {\n 'criteria': criteria,\n 'index': ++index,\n 'value': value\n };\n });\n return baseSortBy(result, function (object, other) {\n return compareMultiple(object, other, orders);\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\n\n function basePick(object, paths) {\n return basePickBy(object, paths, function (value, path) {\n return hasIn(object, path);\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\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\n return result;\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\n\n function basePropertyDeep(path) {\n return function (object) {\n return baseGet(object, path);\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\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\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\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\n splice.call(array, fromIndex, 1);\n }\n }\n\n return array;\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\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\n if (length == lastIndex || index !== previous) {\n var previous = index;\n\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n\n return array;\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\n\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\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\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\n return result;\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\n\n function baseRepeat(string, n) {\n var result = '';\n\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\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\n\n do {\n if (n % 2) {\n result += string;\n }\n\n n = nativeFloor(n / 2);\n\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\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\n\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\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\n\n function baseSample(collection) {\n return arraySample(values(collection));\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\n\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\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\n\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n\n path = castPath(path, object);\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\n if (newValue === undefined) {\n newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};\n }\n }\n\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n\n return object;\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\n\n var baseSetData = !metaMap ? identity : function (func, data) {\n metaMap.set(func, data);\n return func;\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\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 * 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\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\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\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\n end = end > length ? length : end;\n\n if (end < 0) {\n end += length;\n }\n\n length = start > end ? 0 : end - start >>> 0;\n start >>>= 0;\n var result = Array(length);\n\n while (++index < length) {\n result[index] = array[index + start];\n }\n\n return result;\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\n\n function baseSome(collection, predicate) {\n var result;\n baseEach(collection, function (value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\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\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) && (retHighest ? computed <= value : computed < value)) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return high;\n }\n\n return baseSortedIndexBy(array, value, identity, retHighest);\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\n\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n\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\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return nativeMin(high, MAX_ARRAY_INDEX);\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\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\n return result;\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\n\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n\n if (isSymbol(value)) {\n return NAN;\n }\n\n return +value;\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\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\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n\n var result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result;\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\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 } else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n\n if (set) {\n return setToArray(set);\n }\n\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache();\n } else {\n seen = iteratee ? [] : result;\n }\n\n outer: while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n value = comparator || value !== 0 ? value : 0;\n\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n\n if (iteratee) {\n seen.push(computed);\n }\n\n result.push(value);\n } else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n\n result.push(value);\n }\n }\n\n return result;\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\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 * 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\n\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\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\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) && predicate(array[index], index, array)) {}\n\n return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index);\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\n\n function baseWrapperValue(value, actions) {\n var result = value;\n\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n\n return arrayReduce(actions, function (result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\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\n\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\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\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\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\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\n return result;\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\n\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\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\n\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\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\n\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n\n return isKey(value, object) ? [value] : stringToPath(toString(value));\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\n\n var castRest = baseRest;\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\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 * 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\n\n var clearTimeout = ctxClearTimeout || function (id) {\n return root.clearTimeout(id);\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\n\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n buffer.copy(result);\n return result;\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\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 * 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\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 * 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\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 * 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\n\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\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\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 * 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\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 var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {\n return 1;\n }\n\n if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {\n return -1;\n }\n }\n\n return 0;\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\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\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\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\n\n return object.index - other.index;\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\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\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n\n return result;\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\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\n var offset = argsIndex;\n\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n\n return result;\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\n\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n array || (array = Array(length));\n\n while (++index < length) {\n array[index] = source[index];\n }\n\n return array;\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\n\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n\n return object;\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\n\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\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\n\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\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\n\n function createAggregator(setter, initializer) {\n return function (collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\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\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 customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n\n object = Object(object);\n\n while (++index < length) {\n var source = sources[index];\n\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n\n return object;\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\n\n function createBaseEach(eachFunc, fromRight) {\n return function (collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\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\n return collection;\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\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\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n\n return object;\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\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\n return wrapper;\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\n\n function createCaseFirst(methodName) {\n return function (string) {\n string = toString(string);\n var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined;\n var chr = strSymbols ? strSymbols[0] : string.charAt(0);\n var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1);\n return chr[methodName]() + trailing;\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\n\n function createCompounder(callback) {\n return function (string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\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\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\n switch (args.length) {\n case 0:\n return new Ctor();\n\n case 1:\n return new Ctor(args[0]);\n\n case 2:\n return new Ctor(args[0], args[1]);\n\n case 3:\n return new Ctor(args[0], args[1], args[2]);\n\n case 4:\n return new Ctor(args[0], args[1], args[2], args[3]);\n\n case 5:\n return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n\n case 6:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n\n case 7:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n\n return isObject(result) ? result : thisBinding;\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\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\n var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);\n length -= holders.length;\n\n if (length < arity) {\n return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined, args, holders, undefined, undefined, arity - length);\n }\n\n var fn = this && this !== root && this instanceof wrapper ? Ctor : func;\n return apply(fn, this, args);\n }\n\n return wrapper;\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\n\n function createFind(findIndexFunc) {\n return function (collection, predicate, fromIndex) {\n var iterable = Object(collection);\n\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n\n predicate = function predicate(key) {\n return iteratee(iterable[key], key, iterable);\n };\n }\n\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\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\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\n while (index--) {\n var func = funcs[index];\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n\n index = wrapper ? index : length;\n\n while (++index < length) {\n func = funcs[index];\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);\n }\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\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\n return result;\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\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\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n\n length -= holdersCount;\n\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length);\n }\n\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n length = args.length;\n\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n\n if (isAry && ary < length) {\n args.length = ary;\n }\n\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n\n return fn.apply(thisBinding, args);\n }\n\n return wrapper;\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\n\n function createInverter(setter, toIteratee) {\n return function (object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\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\n\n function createMathOperation(operator, defaultValue) {\n return function (value, other) {\n var result;\n\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n\n if (value !== undefined) {\n result = value;\n }\n\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\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\n result = operator(value, other);\n }\n\n return result;\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\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 * 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\n\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n var charsLength = chars.length;\n\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length);\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\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\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n\n return apply(fn, isBind ? thisArg : this, args);\n }\n\n return wrapper;\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\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 } // Ensure the sign of `-0` is preserved.\n\n\n start = toFinite(start);\n\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n\n step = step === undefined ? start < end ? 1 : -1 : toFinite(step);\n return baseRange(start, end, step, fromRight);\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\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\n return operator(value, other);\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\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 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\n var newData = [func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity];\n var result = wrapFunc.apply(undefined, newData);\n\n if (isLaziable(func)) {\n setData(result, newData);\n }\n\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\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\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\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 pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n\n return func(number);\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\n\n var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY) ? noop : function (values) {\n return new Set(values);\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\n function createToPairs(keysFunc) {\n return function (object) {\n var tag = getTag(object);\n\n if (tag == mapTag) {\n return mapToArray(object);\n }\n\n if (tag == setTag) {\n return setToPairs(object);\n }\n\n return baseToPairs(object, keysFunc(object));\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\n\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n var length = partials ? partials.length : 0;\n\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\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 partials = holders = undefined;\n }\n\n var data = isBindKey ? undefined : getData(func);\n var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n if (data) {\n mergeData(newData, data);\n }\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 ? isBindKey ? 0 : func.length : 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\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\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\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\n\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) {\n return srcValue;\n }\n\n return objValue;\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\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\n return objValue;\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\n\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\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\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 } // Check that cyclic values are equal.\n\n\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n\n var index = -1,\n result = true,\n seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\n stack.set(array, other);\n stack.set(other, array); // Ignore non-index properties.\n\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n }\n\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n\n result = false;\n break;\n } // Recursively compare arrays (susceptible to call stack limits).\n\n\n if (seen) {\n if (!arraySome(other, function (othValue, othIndex) {\n if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n result = false;\n break;\n }\n }\n\n stack['delete'](array);\n stack['delete'](other);\n return result;\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\n\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n return false;\n }\n\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\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 } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(object);\n\n if (stacked) {\n return stacked == other;\n }\n\n bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits).\n\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 }\n\n return false;\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\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\n var index = objLength;\n\n while (index--) {\n var key = objProps[index];\n\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n } // Check that cyclic values are equal.\n\n\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n var skipCtor = isPartial;\n\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 ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n } // Recursively compare objects (susceptible to call stack limits).\n\n\n if (!(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n result = false;\n break;\n }\n\n skipCtor || (skipCtor = key == 'constructor');\n }\n\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal.\n\n if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n\n stack['delete'](object);\n stack['delete'](other);\n return result;\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\n\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\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\n\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\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\n\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\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\n\n var getData = !metaMap ? noop : function (func) {\n return metaMap.get(func);\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\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\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n\n return result;\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\n\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\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\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 * 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\n\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;\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\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 result[length] = [key, value, isStrictComparable(value)];\n }\n\n return result;\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\n\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n\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\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n\n return result;\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\n\n var getSymbols = !nativeGetSymbols ? stubArray : function (object) {\n if (object == null) {\n return [];\n }\n\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function (symbol) {\n return propertyIsEnumerable.call(object, symbol);\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\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function (object) {\n var result = [];\n\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n\n return result;\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\n var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n\n if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {\n getTag = function getTag(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:\n return dataViewTag;\n\n case mapCtorString:\n return mapTag;\n\n case promiseCtorString:\n return promiseTag;\n\n case setCtorString:\n return setTag;\n\n case weakMapCtorString:\n return weakMapTag;\n }\n }\n\n return result;\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\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':\n start += size;\n break;\n\n case 'dropRight':\n end -= size;\n break;\n\n case 'take':\n end = nativeMin(end, start + size);\n break;\n\n case 'takeRight':\n start = nativeMax(start, end - size);\n break;\n }\n }\n\n return {\n 'start': start,\n '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\n\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\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\n\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n\n object = object[key];\n }\n\n if (result || ++index != length) {\n return result;\n }\n\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));\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\n\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length); // Add properties assigned by `RegExp#exec`.\n\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n\n return result;\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\n\n function initCloneObject(object) {\n return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};\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\n\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n\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:\n case float64Tag:\n case int8Tag:\n case int16Tag:\n case int32Tag:\n case uint8Tag:\n case uint8ClampedTag:\n case uint16Tag:\n 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 * 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\n\n function insertWrapDetails(source, details) {\n var length = details.length;\n\n if (!length) {\n return source;\n }\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 * 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\n\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);\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\n\n function isIndex(value, length) {\n var type = _typeof(value);\n\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\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\n\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n\n var type = _typeof(index);\n\n if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {\n return eq(object[index], value);\n }\n\n return false;\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\n\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n\n var type = _typeof(value);\n\n if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {\n return true;\n }\n\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);\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\n\n function isKeyable(value) {\n var type = _typeof(value);\n\n return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;\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\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\n if (func === other) {\n return true;\n }\n\n var data = getData(other);\n return !!data && func === data[0];\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\n\n function isMasked(func) {\n return !!maskSrcKey && maskSrcKey in func;\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\n\n var isMaskable = coreJsData ? isFunction : stubFalse;\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\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;\n return value === proto;\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\n\n function isStrictComparable(value) {\n return value === value && !isObject(value);\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\n\n function matchesStrictComparable(key, srcValue) {\n return function (object) {\n if (object == null) {\n return false;\n }\n\n return object[key] === srcValue && (srcValue !== undefined || key in Object(object));\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\n\n function memoizeCapped(func) {\n var result = memoize(func, function (key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n\n return key;\n });\n var cache = result.cache;\n return result;\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\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 var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG; // Exit early if metadata can't be merged.\n\n if (!(isCommon || isCombo)) {\n return data;\n } // Use source `thisArg` if available.\n\n\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2]; // Set when currying a bound function.\n\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n } // Compose partial arguments.\n\n\n var value = source[3];\n\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 } // Compose partial right arguments.\n\n\n value = source[5];\n\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 } // Use source `argPos` if available.\n\n\n value = source[7];\n\n if (value) {\n data[7] = value;\n } // Use source `ary` if it's smaller.\n\n\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n } // Use source `arity` if one is not provided.\n\n\n if (data[9] == null) {\n data[9] = source[9];\n } // Use source `func` and merge bitmasks.\n\n\n data[0] = source[0];\n data[1] = newBitmask;\n return data;\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\n\n function nativeKeysIn(object) {\n var result = [];\n\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n\n return result;\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\n\n function objectToString(value) {\n return nativeObjectToString.call(value);\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\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\n index = -1;\n var otherArgs = Array(start + 1);\n\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\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\n\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\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\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\n return array;\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\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 * 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\n\n var setData = shortOut(baseSetData);\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\n var setTimeout = ctxSetTimeout || function (func, wait) {\n return root.setTimeout(func, wait);\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\n\n var setToString = shortOut(baseSetToString);\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\n function setWrapToString(wrapper, reference, bitmask) {\n var source = reference + '';\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\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\n\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n return function () {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n lastCalled = stamp;\n\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n\n return func.apply(undefined, arguments);\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\n\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n size = size === undefined ? length : size;\n\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n array[rand] = array[index];\n array[index] = value;\n }\n\n array.length = size;\n return array;\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\n\n var stringToPath = memoizeCapped(function (string) {\n var result = [];\n\n if (string.charCodeAt(0) === 46\n /* . */\n ) {\n result.push('');\n }\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 * 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\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n\n var result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result;\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\n\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n\n try {\n return func + '';\n } catch (e) {}\n }\n\n return '';\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\n\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function (pair) {\n var value = '_.' + pair[0];\n\n if (bitmask & pair[1] && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\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\n\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\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 * 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\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\n var length = array == null ? 0 : array.length;\n\n if (!length || size < 1) {\n return [];\n }\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\n return result;\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\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\n if (value) {\n result[resIndex++] = value;\n }\n }\n\n return result;\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\n\n function concat() {\n var length = arguments.length;\n\n if (!length) {\n return [];\n }\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\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\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\n\n var difference = baseRest(function (array, values) {\n return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : [];\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\n var differenceBy = baseRest(function (array, values) {\n var iteratee = last(values);\n\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n\n return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) : [];\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\n var differenceWith = baseRest(function (array, values) {\n var comparator = last(values);\n\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n\n return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) : [];\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\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\n\n n = guard || n === undefined ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\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\n\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\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 * 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\n\n function dropRightWhile(array, predicate) {\n return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : [];\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\n\n function dropWhile(array, predicate) {\n return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : [];\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\n\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\n\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n\n return baseFill(array, value, start, end);\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\n\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return -1;\n }\n\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n\n return baseFindIndex(array, getIteratee(predicate, 3), index);\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\n\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return -1;\n }\n\n var index = length - 1;\n\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\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\n\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\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\n\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\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\n\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\n\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\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\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\n return result;\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\n\n function head(array) {\n return array && array.length ? array[0] : undefined;\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\n\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return -1;\n }\n\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n\n return baseIndexOf(array, value, index);\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\n\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\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\n\n var intersection = baseRest(function (arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];\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\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\n return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee, 2)) : [];\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\n var intersectionWith = baseRest(function (arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n\n if (comparator) {\n mapped.pop();\n }\n\n return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined, comparator) : [];\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\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\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\n\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\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\n\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return -1;\n }\n\n var index = length;\n\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n\n return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true);\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\n\n function nth(array, n) {\n return array && array.length ? baseNth(array, toInteger(n)) : undefined;\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\n\n var pull = baseRest(pullAll);\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\n function pullAll(array, values) {\n return array && array.length && values && values.length ? basePullAll(array, values) : array;\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\n\n function pullAllBy(array, values, iteratee) {\n return array && array.length && values && values.length ? basePullAll(array, values, getIteratee(iteratee, 2)) : array;\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\n\n function pullAllWith(array, values, comparator) {\n return array && array.length && values && values.length ? basePullAll(array, values, undefined, comparator) : array;\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\n\n var pullAt = flatRest(function (array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n basePullAt(array, arrayMap(indexes, function (index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n return result;\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\n function remove(array, predicate) {\n var result = [];\n\n if (!(array && array.length)) {\n return result;\n }\n\n var index = -1,\n indexes = [],\n length = array.length;\n predicate = getIteratee(predicate, 3);\n\n while (++index < length) {\n var value = array[index];\n\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n\n basePullAt(array, indexes);\n return result;\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\n\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\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\n\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\n\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n } else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n\n return baseSlice(array, start, end);\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\n\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\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\n\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\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\n\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n\n if (length) {\n var index = baseSortedIndex(array, value);\n\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n\n return -1;\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\n\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\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\n\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\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\n\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n\n if (eq(array[index], value)) {\n return index;\n }\n }\n\n return -1;\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\n\n function sortedUniq(array) {\n return array && array.length ? baseSortedUniq(array) : [];\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\n\n function sortedUniqBy(array, iteratee) {\n return array && array.length ? baseSortedUniq(array, getIteratee(iteratee, 2)) : [];\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\n\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\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\n\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n\n n = guard || n === undefined ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : 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\n\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n\n if (!length) {\n return [];\n }\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 * 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\n\n function takeRightWhile(array, predicate) {\n return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : [];\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\n\n function takeWhile(array, predicate) {\n return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : [];\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\n\n var union = baseRest(function (arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\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\n var unionBy = baseRest(function (arrays) {\n var iteratee = last(arrays);\n\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\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\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 * 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\n function uniq(array) {\n return array && array.length ? baseUniq(array) : [];\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\n\n function uniqBy(array, iteratee) {\n return array && array.length ? baseUniq(array, getIteratee(iteratee, 2)) : [];\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\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 * 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\n\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\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 * 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\n\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n\n var result = unzip(array);\n\n if (iteratee == null) {\n return result;\n }\n\n return arrayMap(result, function (group) {\n return apply(iteratee, undefined, group);\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\n\n var without = baseRest(function (array, values) {\n return isArrayLikeObject(array) ? baseDifference(array, values) : [];\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\n var xor = baseRest(function (arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\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\n var xorBy = baseRest(function (arrays) {\n var iteratee = last(arrays);\n\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\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\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 * 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\n var zip = baseRest(unzip);\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\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\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\n\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\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\n\n var zipWith = baseRest(function (arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\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\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\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\n\n function tap(value, interceptor) {\n interceptor(value);\n return value;\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\n\n function thru(value, interceptor) {\n return interceptor(value);\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\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 interceptor(object) {\n return baseAt(object, paths);\n };\n\n if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n\n value = value.slice(start, +start + (length ? 1 : 0));\n\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n\n return new LodashWrapper(value, this.__chain__).thru(function (array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n\n return array;\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\n function wrapperChain() {\n return chain(this);\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\n\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\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\n\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n return {\n 'done': done,\n '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\n\n function wrapperToIterator() {\n return this;\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\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\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n\n var previous = clone;\n parent = parent.__wrapped__;\n }\n\n previous.__wrapped__ = value;\n return result;\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\n\n function wrapperReverse() {\n var value = this.__wrapped__;\n\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n\n wrapped = wrapped.reverse();\n\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n\n return new LodashWrapper(wrapped, this.__chain__);\n }\n\n return this.thru(reverse);\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\n\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\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\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 * 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\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n\n return func(collection, getIteratee(predicate, 3));\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\n\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\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\n\n var find = createFind(findIndex);\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\n var findLast = createFind(findLastIndex);\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\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\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\n\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\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\n\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\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\n\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\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\n\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\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\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 * 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\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;\n var length = collection.length;\n\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n\n return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;\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\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 baseEach(collection, function (value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\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\n var keyBy = createAggregator(function (result, value, key) {\n baseAssignValue(result, key, value);\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\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\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\n\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n\n orders = guard ? undefined : orders;\n\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n\n return baseOrderBy(collection, iteratees, orders);\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\n\n var partition = createAggregator(function (result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function () {\n 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\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\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\n\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\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\n\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\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\n\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\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\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\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, 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\n\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\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\n\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n\n var tag = getTag(collection);\n\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n\n return baseKeys(collection).length;\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\n\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n\n return func(collection, getIteratee(predicate, 3));\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\n\n var sortBy = baseRest(function (collection, iteratees) {\n if (collection == null) {\n return [];\n }\n\n var length = iteratees.length;\n\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\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\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\n var now = ctxNow || function () {\n return root.Date.now();\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\n\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n n = toInteger(n);\n return function () {\n if (--n < 1) {\n return func.apply(this, arguments);\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\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 * 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\n\n function before(n, func) {\n var result;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n n = toInteger(n);\n return function () {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n\n if (n <= 1) {\n func = undefined;\n }\n\n return result;\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\n\n var bind = baseRest(function (func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n\n return createWrap(func, bitmask, thisArg, partials, holders);\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\n var bindKey = baseRest(function (object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n\n return createWrap(key, bitmask, object, partials, holders);\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\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 * 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\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 * 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\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\n wait = toNumber(wait) || 0;\n\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 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; // Start the timer for the trailing edge.\n\n timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.\n\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 return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime; // 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\n return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;\n }\n\n function timerExpired() {\n var time = now();\n\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n } // Restart the timer.\n\n\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\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 lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\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\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\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\n\n var defer = baseRest(function (func, args) {\n return baseDelay(func, 1, args);\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\n var delay = baseRest(function (func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\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\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\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\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\n var memoized = function memoized() {\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\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n\n memoized.cache = new (memoize.Cache || MapCache)();\n return memoized;\n } // Expose `MapCache`.\n\n\n memoize.Cache = MapCache;\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\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n return function () {\n var args = arguments;\n\n switch (args.length) {\n case 0:\n return !predicate.call(this);\n\n case 1:\n return !predicate.call(this, args[0]);\n\n case 2:\n return !predicate.call(this, args[0], args[1]);\n\n case 3:\n return !predicate.call(this, args[0], args[1], args[2]);\n }\n\n return !predicate.apply(this, args);\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\n\n function once(func) {\n return before(2, func);\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\n\n var overArgs = castRest(function (func, transforms) {\n transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\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\n return apply(func, this, args);\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\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 * 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\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 * 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\n var rearg = flatRest(function (func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\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\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\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\n\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\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\n return apply(func, this, otherArgs);\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\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\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\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\n\n function unary(func) {\n return ary(func, 1);\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 '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */\n\n\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\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\n\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n\n var value = arguments[0];\n return isArray(value) ? value : [value];\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\n\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\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\n\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\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\n\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\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\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 * 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\n\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\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\n\n function eq(value, other) {\n return value === other || value !== value && other !== other;\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\n\n var gt = createRelationalOperation(baseGt);\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\n var gte = createRelationalOperation(function (value, other) {\n return value >= other;\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\n var isArguments = baseIsArguments(function () {\n return arguments;\n }()) ? baseIsArguments : function (value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\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\n var isArray = Array.isArray;\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\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\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\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\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\n\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\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\n\n function isBoolean(value) {\n return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;\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\n\n var isBuffer = nativeIsBuffer || stubFalse;\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\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\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('');\n * // => false\n */\n\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\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\n\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n\n if (isArrayLike(value) && (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n\n var tag = getTag(value);\n\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\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\n\n function isEqual(value, other) {\n return baseIsEqual(value, other);\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\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 * 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\n\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag || typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value);\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\n\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\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\n\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\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\n\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\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\n\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\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\n\n function isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\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\n\n function isObject(value) {\n var type = _typeof(value);\n\n return value != null && (type == 'object' || type == 'function');\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\n\n function isObjectLike(value) {\n return value != null && _typeof(value) == 'object';\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\n\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\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\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\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\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 * 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\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 * 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\n\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n\n return baseIsNative(value);\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\n\n function isNull(value) {\n return value === null;\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\n\n function isNil(value) {\n return value == null;\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\n\n function isNumber(value) {\n return typeof value == 'number' || isObjectLike(value) && baseGetTag(value) == numberTag;\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\n\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n\n var proto = getPrototype(value);\n\n if (proto === null) {\n return true;\n }\n\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;\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\n\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\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\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\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\n\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\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\n function isString(value) {\n return typeof value == 'string' || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;\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\n\n function isSymbol(value) {\n return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;\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\n\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\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\n function isUndefined(value) {\n return value === undefined;\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\n\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\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\n\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\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\n\n var lt = createRelationalOperation(baseLt);\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\n var lte = createRelationalOperation(function (value, other) {\n return value <= other;\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\n function toArray(value) {\n if (!value) {\n return [];\n }\n\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;\n return func(value);\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\n\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n\n value = toNumber(value);\n\n if (value === INFINITY || value === -INFINITY) {\n var sign = value < 0 ? -1 : 1;\n return sign * MAX_INTEGER;\n }\n\n return value === value ? value : 0;\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\n\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n return result === result ? remainder ? result - remainder : result : 0;\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\n\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\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\n\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n\n if (isSymbol(value)) {\n return NAN;\n }\n\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? other + '' : other;\n }\n\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;\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\n\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\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\n\n function toSafeInteger(value) {\n return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;\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\n\n function toString(value) {\n return value == null ? '' : baseToString(value);\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\n\n var assign = createAssigner(function (object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\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\n var assignIn = createAssigner(function (object, source) {\n copyObject(source, keysIn(source), object);\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\n var assignInWith = createAssigner(function (object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\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\n var assignWith = createAssigner(function (object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\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\n var at = flatRest(baseAt);\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\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\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\n\n var defaults = baseRest(function (object, sources) {\n object = Object(object);\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 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\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\n var defaultsDeep = baseRest(function (args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\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\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\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\n\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\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\n\n function forIn(object, iteratee) {\n return object == null ? object : baseFor(object, getIteratee(iteratee, 3), keysIn);\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\n\n function forInRight(object, iteratee) {\n return object == null ? object : baseForRight(object, getIteratee(iteratee, 3), keysIn);\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\n\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\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\n\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\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\n\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\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\n\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\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\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 * 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\n\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\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\n\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\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\n\n var invert = createInverter(function (result, value, key) {\n if (value != null && typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\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\n var invertBy = createInverter(function (result, value, key) {\n if (value != null && 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 * 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\n var invoke = baseRest(baseInvoke);\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\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\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\n\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\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\n\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n baseForOwn(object, function (value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\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\n\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n baseForOwn(object, function (value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\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\n\n var merge = createAssigner(function (object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\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\n var mergeWith = createAssigner(function (object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\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\n var omit = flatRest(function (object, paths) {\n var result = {};\n\n if (object == null) {\n return result;\n }\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\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n\n var length = paths.length;\n\n while (length--) {\n baseUnset(result, paths[length]);\n }\n\n return result;\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\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\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\n\n var pick = flatRest(function (object, paths) {\n return object == null ? {} : basePick(object, paths);\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\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\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 * 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\n\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n var index = -1,\n length = path.length; // Ensure the loop is entered when path is empty.\n\n if (!length) {\n length = 1;\n object = undefined;\n }\n\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n\n object = isFunction(value) ? value.call(object) : value;\n }\n\n return object;\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\n\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\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\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 * 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\n\n var toPairs = createToPairs(keys);\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\n var toPairsIn = createToPairs(keysIn);\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\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n iteratee = getIteratee(iteratee, 4);\n\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n\n if (isArrLike) {\n accumulator = isArr ? new Ctor() : [];\n } else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n } else {\n accumulator = {};\n }\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 * 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\n\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\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\n\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\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\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 * 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\n\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\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\n\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\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\n\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n\n return baseClamp(toNumber(number), lower, upper);\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\n\n function inRange(number, start, end) {\n start = toFinite(start);\n\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n\n number = toNumber(number);\n return baseInRange(number, start, end);\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\n\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n } else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n } else {\n lower = toFinite(lower);\n\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\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\n return baseRandom(lower, upper);\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\n\n var camelCase = createCompounder(function (result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\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\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\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\n\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\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\n\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n var length = string.length;\n position = position === undefined ? length : baseClamp(toInteger(position), 0, length);\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\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\n\n function escape(string) {\n string = toString(string);\n return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;\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\n\n function escapeRegExp(string) {\n string = toString(string);\n return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, '\\\\$&') : string;\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\n\n var kebabCase = createCompounder(function (result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\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\n var lowerCase = createCompounder(function (result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\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\n var lowerFirst = createCaseFirst('toLowerCase');\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\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n var strLength = length ? stringSize(string) : 0;\n\n if (!length || strLength >= length) {\n return string;\n }\n\n var mid = (length - strLength) / 2;\n return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);\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\n\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n var strLength = length ? stringSize(string) : 0;\n return length && strLength < length ? string + createPadding(length - strLength, chars) : string;\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\n\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n var strLength = length ? stringSize(string) : 0;\n return length && strLength < length ? createPadding(length - strLength, chars) + string : string;\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\n\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\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\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\n return baseRepeat(toString(string), 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\n\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n return args.length < 3 ? string : string.replace(args[1], args[2]);\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\n\n var snakeCase = createCompounder(function (result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\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\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n\n if (!limit) {\n return [];\n }\n\n string = toString(string);\n\n if (string && (typeof separator == 'string' || separator != null && !isRegExp(separator))) {\n separator = baseToString(separator);\n\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n\n return string.split(separator, limit);\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\n\n var startCase = createCompounder(function (result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\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\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\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('<%- value %>');\n * compiled({ 'value': '\n// \n//\n// Here's how it works.\n//\n// ```\n// // Get a reference to the logo element.\n// var el = document.getElementById('logo');\n//\n// // create a SpringSystem and a Spring with a bouncy config.\n// var springSystem = new rebound.SpringSystem();\n// var spring = springSystem.createSpring(50, 3);\n//\n// // Add a listener to the spring. Every time the physics\n// // solver updates the Spring's value onSpringUpdate will\n// // be called.\n// spring.addListener({\n// onSpringUpdate: function(spring) {\n// var val = spring.getCurrentValue();\n// val = rebound.MathUtil\n// .mapValueInRange(val, 0, 1, 1, 0.5);\n// scale(el, val);\n// }\n// });\n//\n// // Listen for mouse down/up/out and toggle the\n// //springs endValue from 0 to 1.\n// el.addEventListener('mousedown', function() {\n// spring.setEndValue(1);\n// });\n//\n// el.addEventListener('mouseout', function() {\n// spring.setEndValue(0);\n// });\n//\n// el.addEventListener('mouseup', function() {\n// spring.setEndValue(0);\n// });\n//\n// // Helper for scaling an element with css transforms.\n// function scale(el, val) {\n// el.style.mozTransform =\n// el.style.msTransform =\n// el.style.webkitTransform =\n// el.style.transform = 'scale3d(' +\n// val + ', ' + val + ', 1)';\n// }\n// ```\n(function () {\n var rebound = {};\n var util = rebound.util = {};\n var concat = Array.prototype.concat;\n var slice = Array.prototype.slice; // Bind a function to a context object.\n\n util.bind = function bind(func, context) {\n var args = slice.call(arguments, 2);\n return function () {\n func.apply(context, concat.call(args, slice.call(arguments)));\n };\n }; // Add all the properties in the source to the target.\n\n\n util.extend = function extend(target, source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n }; // SpringSystem\n // ------------\n // **SpringSystem** is a set of Springs that all run on the same physics\n // timing loop. To get started with a Rebound animation you first\n // create a new SpringSystem and then add springs to it.\n\n\n var SpringSystem = rebound.SpringSystem = function SpringSystem(looper) {\n this._springRegistry = {};\n this._activeSprings = [];\n this.listeners = [];\n this._idleSpringIndices = [];\n this.looper = looper || new AnimationLooper();\n this.looper.springSystem = this;\n };\n\n util.extend(SpringSystem.prototype, {\n _springRegistry: null,\n _isIdle: true,\n _lastTimeMillis: -1,\n _activeSprings: null,\n listeners: null,\n _idleSpringIndices: null,\n // A SpringSystem is iterated by a looper. The looper is responsible\n // for executing each frame as the SpringSystem is resolved to idle.\n // There are three types of Loopers described below AnimationLooper,\n // SimulationLooper, and SteppingSimulationLooper. AnimationLooper is\n // the default as it is the most useful for common UI animations.\n setLooper: function setLooper(looper) {\n this.looper = looper;\n looper.springSystem = this;\n },\n // Add a new spring to this SpringSystem. This Spring will now be solved for\n // during the physics iteration loop. By default the spring will use the\n // default Origami spring config with 40 tension and 7 friction, but you can\n // also provide your own values here.\n createSpring: function createSpring(tension, friction) {\n var springConfig;\n\n if (tension === undefined || friction === undefined) {\n springConfig = SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG;\n } else {\n springConfig = SpringConfig.fromOrigamiTensionAndFriction(tension, friction);\n }\n\n return this.createSpringWithConfig(springConfig);\n },\n // Add a spring with a specified bounciness and speed. To replicate Origami\n // compositions based on PopAnimation patches, use this factory method to\n // create matching springs.\n createSpringWithBouncinessAndSpeed: function createSpringWithBouncinessAndSpeed(bounciness, speed) {\n var springConfig;\n\n if (bounciness === undefined || speed === undefined) {\n springConfig = SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG;\n } else {\n springConfig = SpringConfig.fromBouncinessAndSpeed(bounciness, speed);\n }\n\n return this.createSpringWithConfig(springConfig);\n },\n // Add a spring with the provided SpringConfig.\n createSpringWithConfig: function createSpringWithConfig(springConfig) {\n var spring = new Spring(this);\n this.registerSpring(spring);\n spring.setSpringConfig(springConfig);\n return spring;\n },\n // You can check if a SpringSystem is idle or active by calling\n // getIsIdle. If all of the Springs in the SpringSystem are at rest,\n // i.e. the physics forces have reached equilibrium, then this\n // method will return true.\n getIsIdle: function getIsIdle() {\n return this._isIdle;\n },\n // Retrieve a specific Spring from the SpringSystem by id. This\n // can be useful for inspecting the state of a spring before\n // or after an integration loop in the SpringSystem executes.\n getSpringById: function getSpringById(id) {\n return this._springRegistry[id];\n },\n // Get a listing of all the springs registered with this\n // SpringSystem.\n getAllSprings: function getAllSprings() {\n var vals = [];\n\n for (var id in this._springRegistry) {\n if (this._springRegistry.hasOwnProperty(id)) {\n vals.push(this._springRegistry[id]);\n }\n }\n\n return vals;\n },\n // registerSpring is called automatically as soon as you create\n // a Spring with SpringSystem#createSpring. This method sets the\n // spring up in the registry so that it can be solved in the\n // solver loop.\n registerSpring: function registerSpring(spring) {\n this._springRegistry[spring.getId()] = spring;\n },\n // Deregister a spring with this SpringSystem. The SpringSystem will\n // no longer consider this Spring during its integration loop once\n // this is called. This is normally done automatically for you when\n // you call Spring#destroy.\n deregisterSpring: function deregisterSpring(spring) {\n removeFirst(this._activeSprings, spring);\n delete this._springRegistry[spring.getId()];\n },\n advance: function advance(time, deltaTime) {\n while (this._idleSpringIndices.length > 0) {\n this._idleSpringIndices.pop();\n }\n\n for (var i = 0, len = this._activeSprings.length; i < len; i++) {\n var spring = this._activeSprings[i];\n\n if (spring.systemShouldAdvance()) {\n spring.advance(time / 1000.0, deltaTime / 1000.0);\n } else {\n this._idleSpringIndices.push(this._activeSprings.indexOf(spring));\n }\n }\n\n while (this._idleSpringIndices.length > 0) {\n var idx = this._idleSpringIndices.pop();\n\n idx >= 0 && this._activeSprings.splice(idx, 1);\n }\n },\n // This is our main solver loop called to move the simulation\n // forward through time. Before each pass in the solver loop\n // onBeforeIntegrate is called on an any listeners that have\n // registered themeselves with the SpringSystem. This gives you\n // an opportunity to apply any constraints or adjustments to\n // the springs that should be enforced before each iteration\n // loop. Next the advance method is called to move each Spring in\n // the systemShouldAdvance forward to the current time. After the\n // integration step runs in advance, onAfterIntegrate is called\n // on any listeners that have registered themselves with the\n // SpringSystem. This gives you an opportunity to run any post\n // integration constraints or adjustments on the Springs in the\n // SpringSystem.\n loop: function loop(currentTimeMillis) {\n var listener;\n\n if (this._lastTimeMillis === -1) {\n this._lastTimeMillis = currentTimeMillis - 1;\n }\n\n var ellapsedMillis = currentTimeMillis - this._lastTimeMillis;\n this._lastTimeMillis = currentTimeMillis;\n var i = 0,\n len = this.listeners.length;\n\n for (i = 0; i < len; i++) {\n listener = this.listeners[i];\n listener.onBeforeIntegrate && listener.onBeforeIntegrate(this);\n }\n\n this.advance(currentTimeMillis, ellapsedMillis);\n\n if (this._activeSprings.length === 0) {\n this._isIdle = true;\n this._lastTimeMillis = -1;\n }\n\n for (i = 0; i < len; i++) {\n listener = this.listeners[i];\n listener.onAfterIntegrate && listener.onAfterIntegrate(this);\n }\n\n if (!this._isIdle) {\n this.looper.run();\n }\n },\n // activateSpring is used to notify the SpringSystem that a Spring\n // has become displaced. The system responds by starting its solver\n // loop up if it is currently idle.\n activateSpring: function activateSpring(springId) {\n var spring = this._springRegistry[springId];\n\n if (this._activeSprings.indexOf(spring) == -1) {\n this._activeSprings.push(spring);\n }\n\n if (this.getIsIdle()) {\n this._isIdle = false;\n this.looper.run();\n }\n },\n // Add a listener to the SpringSystem so that you can receive\n // before/after integration notifications allowing Springs to be\n // constrained or adjusted.\n addListener: function addListener(listener) {\n this.listeners.push(listener);\n },\n // Remove a previously added listener on the SpringSystem.\n removeListener: function removeListener(listener) {\n removeFirst(this.listeners, listener);\n },\n // Remove all previously added listeners on the SpringSystem.\n removeAllListeners: function removeAllListeners() {\n this.listeners = [];\n }\n }); // Spring\n // ------\n // **Spring** provides a model of a classical spring acting to\n // resolve a body to equilibrium. Springs have configurable\n // tension which is a force multipler on the displacement of the\n // spring from its rest point or `endValue` as defined by [Hooke's\n // law](http://en.wikipedia.org/wiki/Hooke's_law). Springs also have\n // configurable friction, which ensures that they do not oscillate\n // infinitely. When a Spring is displaced by updating it's resting\n // or `currentValue`, the SpringSystems that contain that Spring\n // will automatically start looping to solve for equilibrium. As each\n // timestep passes, `SpringListener` objects attached to the Spring\n // will be notified of the updates providing a way to drive an\n // animation off of the spring's resolution curve.\n\n var Spring = rebound.Spring = function Spring(springSystem) {\n this._id = 's' + Spring._ID++;\n this._springSystem = springSystem;\n this.listeners = [];\n this._currentState = new PhysicsState();\n this._previousState = new PhysicsState();\n this._tempState = new PhysicsState();\n };\n\n util.extend(Spring, {\n _ID: 0,\n MAX_DELTA_TIME_SEC: 0.064,\n SOLVER_TIMESTEP_SEC: 0.001\n });\n util.extend(Spring.prototype, {\n _id: 0,\n _springConfig: null,\n _overshootClampingEnabled: false,\n _currentState: null,\n _previousState: null,\n _tempState: null,\n _startValue: 0,\n _endValue: 0,\n _wasAtRest: true,\n _restSpeedThreshold: 0.001,\n _displacementFromRestThreshold: 0.001,\n listeners: null,\n _timeAccumulator: 0,\n _springSystem: null,\n // Remove a Spring from simulation and clear its listeners.\n destroy: function destroy() {\n this.listeners = [];\n this.frames = [];\n\n this._springSystem.deregisterSpring(this);\n },\n // Get the id of the spring, which can be used to retrieve it from\n // the SpringSystems it participates in later.\n getId: function getId() {\n return this._id;\n },\n // Set the configuration values for this Spring. A SpringConfig\n // contains the tension and friction values used to solve for the\n // equilibrium of the Spring in the physics loop.\n setSpringConfig: function setSpringConfig(springConfig) {\n this._springConfig = springConfig;\n return this;\n },\n // Retrieve the SpringConfig used by this Spring.\n getSpringConfig: function getSpringConfig() {\n return this._springConfig;\n },\n // Set the current position of this Spring. Listeners will be updated\n // with this value immediately. If the rest or `endValue` is not\n // updated to match this value, then the spring will be dispalced and\n // the SpringSystem will start to loop to restore the spring to the\n // `endValue`.\n //\n // A common pattern is to move a Spring around without animation by\n // calling.\n //\n // ```\n // spring.setCurrentValue(n).setAtRest();\n // ```\n //\n // This moves the Spring to a new position `n`, sets the endValue\n // to `n`, and removes any velocity from the `Spring`. By doing\n // this you can allow the `SpringListener` to manage the position\n // of UI elements attached to the spring even when moving without\n // animation. For example, when dragging an element you can\n // update the position of an attached view through a spring\n // by calling `spring.setCurrentValue(x)`. When\n // the gesture ends you can update the Springs\n // velocity and endValue\n // `spring.setVelocity(gestureEndVelocity).setEndValue(flingTarget)`\n // to cause it to naturally animate the UI element to the resting\n // position taking into account existing velocity. The codepaths for\n // synchronous movement and spring driven animation can\n // be unified using this technique.\n setCurrentValue: function setCurrentValue(currentValue, skipSetAtRest) {\n this._startValue = currentValue;\n this._currentState.position = currentValue;\n\n if (!skipSetAtRest) {\n this.setAtRest();\n }\n\n this.notifyPositionUpdated(false, false);\n return this;\n },\n // Get the position that the most recent animation started at. This\n // can be useful for determining the number off oscillations that\n // have occurred.\n getStartValue: function getStartValue() {\n return this._startValue;\n },\n // Retrieve the current value of the Spring.\n getCurrentValue: function getCurrentValue() {\n return this._currentState.position;\n },\n // Get the absolute distance of the Spring from it's resting endValue\n // position.\n getCurrentDisplacementDistance: function getCurrentDisplacementDistance() {\n return this.getDisplacementDistanceForState(this._currentState);\n },\n getDisplacementDistanceForState: function getDisplacementDistanceForState(state) {\n return Math.abs(this._endValue - state.position);\n },\n // Set the endValue or resting position of the spring. If this\n // value is different than the current value, the SpringSystem will\n // be notified and will begin running its solver loop to resolve\n // the Spring to equilibrium. Any listeners that are registered\n // for onSpringEndStateChange will also be notified of this update\n // immediately.\n setEndValue: function setEndValue(endValue) {\n if (this._endValue == endValue && this.isAtRest()) {\n return this;\n }\n\n this._startValue = this.getCurrentValue();\n this._endValue = endValue;\n\n this._springSystem.activateSpring(this.getId());\n\n for (var i = 0, len = this.listeners.length; i < len; i++) {\n var listener = this.listeners[i];\n var onChange = listener.onSpringEndStateChange;\n onChange && onChange(this);\n }\n\n return this;\n },\n // Retrieve the endValue or resting position of this spring.\n getEndValue: function getEndValue() {\n return this._endValue;\n },\n // Set the current velocity of the Spring. As previously mentioned,\n // this can be useful when you are performing a direct manipulation\n // gesture. When a UI element is released you may call setVelocity\n // on its animation Spring so that the Spring continues with the\n // same velocity as the gesture ended with. The friction, tension,\n // and displacement of the Spring will then govern its motion to\n // return to rest on a natural feeling curve.\n setVelocity: function setVelocity(velocity) {\n if (velocity === this._currentState.velocity) {\n return this;\n }\n\n this._currentState.velocity = velocity;\n\n this._springSystem.activateSpring(this.getId());\n\n return this;\n },\n // Get the current velocity of the Spring.\n getVelocity: function getVelocity() {\n return this._currentState.velocity;\n },\n // Set a threshold value for the movement speed of the Spring below\n // which it will be considered to be not moving or resting.\n setRestSpeedThreshold: function setRestSpeedThreshold(restSpeedThreshold) {\n this._restSpeedThreshold = restSpeedThreshold;\n return this;\n },\n // Retrieve the rest speed threshold for this Spring.\n getRestSpeedThreshold: function getRestSpeedThreshold() {\n return this._restSpeedThreshold;\n },\n // Set a threshold value for displacement below which the Spring\n // will be considered to be not displaced i.e. at its resting\n // `endValue`.\n setRestDisplacementThreshold: function setRestDisplacementThreshold(displacementFromRestThreshold) {\n this._displacementFromRestThreshold = displacementFromRestThreshold;\n },\n // Retrieve the rest displacement threshold for this spring.\n getRestDisplacementThreshold: function getRestDisplacementThreshold() {\n return this._displacementFromRestThreshold;\n },\n // Enable overshoot clamping. This means that the Spring will stop\n // immediately when it reaches its resting position regardless of\n // any existing momentum it may have. This can be useful for certain\n // types of animations that should not oscillate such as a scale\n // down to 0 or alpha fade.\n setOvershootClampingEnabled: function setOvershootClampingEnabled(enabled) {\n this._overshootClampingEnabled = enabled;\n return this;\n },\n // Check if overshoot clamping is enabled for this spring.\n isOvershootClampingEnabled: function isOvershootClampingEnabled() {\n return this._overshootClampingEnabled;\n },\n // Check if the Spring has gone past its end point by comparing\n // the direction it was moving in when it started to the current\n // position and end value.\n isOvershooting: function isOvershooting() {\n var start = this._startValue;\n var end = this._endValue;\n return this._springConfig.tension > 0 && (start < end && this.getCurrentValue() > end || start > end && this.getCurrentValue() < end);\n },\n // Spring.advance is the main solver method for the Spring. It takes\n // the current time and delta since the last time step and performs\n // an RK4 integration to get the new position and velocity state\n // for the Spring based on the tension, friction, velocity, and\n // displacement of the Spring.\n advance: function advance(time, realDeltaTime) {\n var isAtRest = this.isAtRest();\n\n if (isAtRest && this._wasAtRest) {\n return;\n }\n\n var adjustedDeltaTime = realDeltaTime;\n\n if (realDeltaTime > Spring.MAX_DELTA_TIME_SEC) {\n adjustedDeltaTime = Spring.MAX_DELTA_TIME_SEC;\n }\n\n this._timeAccumulator += adjustedDeltaTime;\n var tension = this._springConfig.tension,\n friction = this._springConfig.friction,\n position = this._currentState.position,\n velocity = this._currentState.velocity,\n tempPosition = this._tempState.position,\n tempVelocity = this._tempState.velocity,\n aVelocity,\n aAcceleration,\n bVelocity,\n bAcceleration,\n cVelocity,\n cAcceleration,\n dVelocity,\n dAcceleration,\n dxdt,\n dvdt;\n\n while (this._timeAccumulator >= Spring.SOLVER_TIMESTEP_SEC) {\n this._timeAccumulator -= Spring.SOLVER_TIMESTEP_SEC;\n\n if (this._timeAccumulator < Spring.SOLVER_TIMESTEP_SEC) {\n this._previousState.position = position;\n this._previousState.velocity = velocity;\n }\n\n aVelocity = velocity;\n aAcceleration = tension * (this._endValue - tempPosition) - friction * velocity;\n tempPosition = position + aVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n tempVelocity = velocity + aAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n bVelocity = tempVelocity;\n bAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;\n tempPosition = position + bVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n tempVelocity = velocity + bAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n cVelocity = tempVelocity;\n cAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;\n tempPosition = position + cVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n tempVelocity = velocity + cAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;\n dVelocity = tempVelocity;\n dAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;\n dxdt = 1.0 / 6.0 * (aVelocity + 2.0 * (bVelocity + cVelocity) + dVelocity);\n dvdt = 1.0 / 6.0 * (aAcceleration + 2.0 * (bAcceleration + cAcceleration) + dAcceleration);\n position += dxdt * Spring.SOLVER_TIMESTEP_SEC;\n velocity += dvdt * Spring.SOLVER_TIMESTEP_SEC;\n }\n\n this._tempState.position = tempPosition;\n this._tempState.velocity = tempVelocity;\n this._currentState.position = position;\n this._currentState.velocity = velocity;\n\n if (this._timeAccumulator > 0) {\n this._interpolate(this._timeAccumulator / Spring.SOLVER_TIMESTEP_SEC);\n }\n\n if (this.isAtRest() || this._overshootClampingEnabled && this.isOvershooting()) {\n if (this._springConfig.tension > 0) {\n this._startValue = this._endValue;\n this._currentState.position = this._endValue;\n } else {\n this._endValue = this._currentState.position;\n this._startValue = this._endValue;\n }\n\n this.setVelocity(0);\n isAtRest = true;\n }\n\n var notifyActivate = false;\n\n if (this._wasAtRest) {\n this._wasAtRest = false;\n notifyActivate = true;\n }\n\n var notifyAtRest = false;\n\n if (isAtRest) {\n this._wasAtRest = true;\n notifyAtRest = true;\n }\n\n this.notifyPositionUpdated(notifyActivate, notifyAtRest);\n },\n notifyPositionUpdated: function notifyPositionUpdated(notifyActivate, notifyAtRest) {\n for (var i = 0, len = this.listeners.length; i < len; i++) {\n var listener = this.listeners[i];\n\n if (notifyActivate && listener.onSpringActivate) {\n listener.onSpringActivate(this);\n }\n\n if (listener.onSpringUpdate) {\n listener.onSpringUpdate(this);\n }\n\n if (notifyAtRest && listener.onSpringAtRest) {\n listener.onSpringAtRest(this);\n }\n }\n },\n // Check if the SpringSystem should advance. Springs are advanced\n // a final frame after they reach equilibrium to ensure that the\n // currentValue is exactly the requested endValue regardless of the\n // displacement threshold.\n systemShouldAdvance: function systemShouldAdvance() {\n return !this.isAtRest() || !this.wasAtRest();\n },\n wasAtRest: function wasAtRest() {\n return this._wasAtRest;\n },\n // Check if the Spring is atRest meaning that it's currentValue and\n // endValue are the same and that it has no velocity. The previously\n // described thresholds for speed and displacement define the bounds\n // of this equivalence check. If the Spring has 0 tension, then it will\n // be considered at rest whenever its absolute velocity drops below the\n // restSpeedThreshold.\n isAtRest: function isAtRest() {\n return Math.abs(this._currentState.velocity) < this._restSpeedThreshold && (this.getDisplacementDistanceForState(this._currentState) <= this._displacementFromRestThreshold || this._springConfig.tension === 0);\n },\n // Force the spring to be at rest at its current position. As\n // described in the documentation for setCurrentValue, this method\n // makes it easy to do synchronous non-animated updates to ui\n // elements that are attached to springs via SpringListeners.\n setAtRest: function setAtRest() {\n this._endValue = this._currentState.position;\n this._tempState.position = this._currentState.position;\n this._currentState.velocity = 0;\n return this;\n },\n _interpolate: function _interpolate(alpha) {\n this._currentState.position = this._currentState.position * alpha + this._previousState.position * (1 - alpha);\n this._currentState.velocity = this._currentState.velocity * alpha + this._previousState.velocity * (1 - alpha);\n },\n getListeners: function getListeners() {\n return this.listeners;\n },\n addListener: function addListener(newListener) {\n this.listeners.push(newListener);\n return this;\n },\n removeListener: function removeListener(listenerToRemove) {\n removeFirst(this.listeners, listenerToRemove);\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n this.listeners = [];\n return this;\n },\n currentValueIsApproximately: function currentValueIsApproximately(value) {\n return Math.abs(this.getCurrentValue() - value) <= this.getRestDisplacementThreshold();\n }\n }); // PhysicsState\n // ------------\n // **PhysicsState** consists of a position and velocity. A Spring uses\n // this internally to keep track of its current and prior position and\n // velocity values.\n\n var PhysicsState = function PhysicsState() {};\n\n util.extend(PhysicsState.prototype, {\n position: 0,\n velocity: 0\n }); // SpringConfig\n // ------------\n // **SpringConfig** maintains a set of tension and friction constants\n // for a Spring. You can use fromOrigamiTensionAndFriction to convert\n // values from the [Origami](http://facebook.github.io/origami/)\n // design tool directly to Rebound spring constants.\n\n var SpringConfig = rebound.SpringConfig = function SpringConfig(tension, friction) {\n this.tension = tension;\n this.friction = friction;\n }; // Loopers\n // -------\n // **AnimationLooper** plays each frame of the SpringSystem on animation\n // timing loop. This is the default type of looper for a new spring system\n // as it is the most common when developing UI.\n\n\n var AnimationLooper = rebound.AnimationLooper = function AnimationLooper() {\n this.springSystem = null;\n\n var _this = this;\n\n var _run = function _run() {\n _this.springSystem.loop(Date.now());\n };\n\n this.run = function () {\n util.onFrame(_run);\n };\n }; // **SimulationLooper** resolves the SpringSystem to a resting state in a\n // tight and blocking loop. This is useful for synchronously generating\n // pre-recorded animations that can then be played on a timing loop later.\n // Sometimes this lead to better performance to pre-record a single spring\n // curve and use it to drive many animations; however, it can make dynamic\n // response to user input a bit trickier to implement.\n\n\n rebound.SimulationLooper = function SimulationLooper(timestep) {\n this.springSystem = null;\n var time = 0;\n var running = false;\n timestep = timestep || 16.667;\n\n this.run = function () {\n if (running) {\n return;\n }\n\n running = true;\n\n while (!this.springSystem.getIsIdle()) {\n this.springSystem.loop(time += timestep);\n }\n\n running = false;\n };\n }; // **SteppingSimulationLooper** resolves the SpringSystem one step at a\n // time controlled by an outside loop. This is useful for testing and\n // verifying the behavior of a SpringSystem or if you want to control your own\n // timing loop for some reason e.g. slowing down or speeding up the\n // simulation.\n\n\n rebound.SteppingSimulationLooper = function (timestep) {\n this.springSystem = null;\n var time = 0; // this.run is NOOP'd here to allow control from the outside using\n // this.step.\n\n this.run = function () {}; // Perform one step toward resolving the SpringSystem.\n\n\n this.step = function (timestep) {\n this.springSystem.loop(time += timestep);\n };\n }; // Math for converting from\n // [Origami](http://facebook.github.io/origami/) to\n // [Rebound](http://facebook.github.io/rebound).\n // You mostly don't need to worry about this, just use\n // SpringConfig.fromOrigamiTensionAndFriction(v, v);\n\n\n var OrigamiValueConverter = rebound.OrigamiValueConverter = {\n tensionFromOrigamiValue: function tensionFromOrigamiValue(oValue) {\n return (oValue - 30.0) * 3.62 + 194.0;\n },\n origamiValueFromTension: function origamiValueFromTension(tension) {\n return (tension - 194.0) / 3.62 + 30.0;\n },\n frictionFromOrigamiValue: function frictionFromOrigamiValue(oValue) {\n return (oValue - 8.0) * 3.0 + 25.0;\n },\n origamiFromFriction: function origamiFromFriction(friction) {\n return (friction - 25.0) / 3.0 + 8.0;\n }\n }; // BouncyConversion provides math for converting from Origami PopAnimation\n // config values to regular Origami tension and friction values. If you are\n // trying to replicate prototypes made with PopAnimation patches in Origami,\n // then you should create your springs with\n // SpringSystem.createSpringWithBouncinessAndSpeed, which uses this Math\n // internally to create a spring to match the provided PopAnimation\n // configuration from Origami.\n\n var BouncyConversion = rebound.BouncyConversion = function (bounciness, speed) {\n this.bounciness = bounciness;\n this.speed = speed;\n var b = this.normalize(bounciness / 1.7, 0, 20.0);\n b = this.projectNormal(b, 0.0, 0.8);\n var s = this.normalize(speed / 1.7, 0, 20.0);\n this.bouncyTension = this.projectNormal(s, 0.5, 200);\n this.bouncyFriction = this.quadraticOutInterpolation(b, this.b3Nobounce(this.bouncyTension), 0.01);\n };\n\n util.extend(BouncyConversion.prototype, {\n normalize: function normalize(value, startValue, endValue) {\n return (value - startValue) / (endValue - startValue);\n },\n projectNormal: function projectNormal(n, start, end) {\n return start + n * (end - start);\n },\n linearInterpolation: function linearInterpolation(t, start, end) {\n return t * end + (1.0 - t) * start;\n },\n quadraticOutInterpolation: function quadraticOutInterpolation(t, start, end) {\n return this.linearInterpolation(2 * t - t * t, start, end);\n },\n b3Friction1: function b3Friction1(x) {\n return 0.0007 * Math.pow(x, 3) - 0.031 * Math.pow(x, 2) + 0.64 * x + 1.28;\n },\n b3Friction2: function b3Friction2(x) {\n return 0.000044 * Math.pow(x, 3) - 0.006 * Math.pow(x, 2) + 0.36 * x + 2.;\n },\n b3Friction3: function b3Friction3(x) {\n return 0.00000045 * Math.pow(x, 3) - 0.000332 * Math.pow(x, 2) + 0.1078 * x + 5.84;\n },\n b3Nobounce: function b3Nobounce(tension) {\n var friction = 0;\n\n if (tension <= 18) {\n friction = this.b3Friction1(tension);\n } else if (tension > 18 && tension <= 44) {\n friction = this.b3Friction2(tension);\n } else {\n friction = this.b3Friction3(tension);\n }\n\n return friction;\n }\n });\n util.extend(SpringConfig, {\n // Convert an origami Spring tension and friction to Rebound spring\n // constants. If you are prototyping a design with Origami, this\n // makes it easy to make your springs behave exactly the same in\n // Rebound.\n fromOrigamiTensionAndFriction: function fromOrigamiTensionAndFriction(tension, friction) {\n return new SpringConfig(OrigamiValueConverter.tensionFromOrigamiValue(tension), OrigamiValueConverter.frictionFromOrigamiValue(friction));\n },\n // Convert an origami PopAnimation Spring bounciness and speed to Rebound\n // spring constants. If you are using PopAnimation patches in Origami, this\n // utility will provide springs that match your prototype.\n fromBouncinessAndSpeed: function fromBouncinessAndSpeed(bounciness, speed) {\n var bouncyConversion = new rebound.BouncyConversion(bounciness, speed);\n return this.fromOrigamiTensionAndFriction(bouncyConversion.bouncyTension, bouncyConversion.bouncyFriction);\n },\n // Create a SpringConfig with no tension or a coasting spring with some\n // amount of Friction so that it does not coast infininitely.\n coastingConfigWithOrigamiFriction: function coastingConfigWithOrigamiFriction(friction) {\n return new SpringConfig(0, OrigamiValueConverter.frictionFromOrigamiValue(friction));\n }\n });\n SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG = SpringConfig.fromOrigamiTensionAndFriction(40, 7);\n util.extend(SpringConfig.prototype, {\n friction: 0,\n tension: 0\n }); // Here are a couple of function to convert colors between hex codes and RGB\n // component values. These are handy when performing color\n // tweening animations.\n\n var colorCache = {};\n\n util.hexToRGB = function (color) {\n if (colorCache[color]) {\n return colorCache[color];\n }\n\n color = color.replace('#', '');\n\n if (color.length === 3) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n\n var parts = color.match(/.{2}/g);\n var ret = {\n r: parseInt(parts[0], 16),\n g: parseInt(parts[1], 16),\n b: parseInt(parts[2], 16)\n };\n colorCache[color] = ret;\n return ret;\n };\n\n util.rgbToHex = function (r, g, b) {\n r = r.toString(16);\n g = g.toString(16);\n b = b.toString(16);\n r = r.length < 2 ? '0' + r : r;\n g = g.length < 2 ? '0' + g : g;\n b = b.length < 2 ? '0' + b : b;\n return '#' + r + g + b;\n };\n\n var MathUtil = rebound.MathUtil = {\n // This helper function does a linear interpolation of a value from\n // one range to another. This can be very useful for converting the\n // motion of a Spring to a range of UI property values. For example a\n // spring moving from position 0 to 1 could be interpolated to move a\n // view from pixel 300 to 350 and scale it from 0.5 to 1. The current\n // position of the `Spring` just needs to be run through this method\n // taking its input range in the _from_ parameters with the property\n // animation range in the _to_ parameters.\n mapValueInRange: function mapValueInRange(value, fromLow, fromHigh, toLow, toHigh) {\n var fromRangeSize = fromHigh - fromLow;\n var toRangeSize = toHigh - toLow;\n var valueScale = (value - fromLow) / fromRangeSize;\n return toLow + valueScale * toRangeSize;\n },\n // Interpolate two hex colors in a 0 - 1 range or optionally provide a\n // custom range with fromLow,fromHight. The output will be in hex by default\n // unless asRGB is true in which case it will be returned as an rgb string.\n interpolateColor: function interpolateColor(val, startColor, endColor, fromLow, fromHigh, asRGB) {\n fromLow = fromLow === undefined ? 0 : fromLow;\n fromHigh = fromHigh === undefined ? 1 : fromHigh;\n startColor = util.hexToRGB(startColor);\n endColor = util.hexToRGB(endColor);\n var r = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.r, endColor.r));\n var g = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.g, endColor.g));\n var b = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.b, endColor.b));\n\n if (asRGB) {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else {\n return util.rgbToHex(r, g, b);\n }\n },\n degreesToRadians: function degreesToRadians(deg) {\n return deg * Math.PI / 180;\n },\n radiansToDegrees: function radiansToDegrees(rad) {\n return rad * 180 / Math.PI;\n }\n };\n util.extend(util, MathUtil); // Utilities\n // ---------\n // Here are a few useful JavaScript utilities.\n // Lop off the first occurence of the reference in the Array.\n\n function removeFirst(array, item) {\n var idx = array.indexOf(item);\n idx != -1 && array.splice(idx, 1);\n }\n\n var _onFrame;\n\n if (typeof window !== 'undefined') {\n _onFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function (callback) {\n window.setTimeout(callback, 1000 / 60);\n };\n }\n\n if (!_onFrame && typeof process !== 'undefined' && process.title === 'node') {\n _onFrame = setImmediate;\n } // Cross browser/node timer functions.\n\n\n util.onFrame = function onFrame(func) {\n return _onFrame(func);\n }; // Export the public api using exports for common js or the window for\n // normal browser inclusion.\n\n\n if (typeof exports != 'undefined') {\n util.extend(exports, rebound);\n } else if (typeof window != 'undefined') {\n window.rebound = rebound;\n }\n})(); // Legal Stuff\n// -----------\n\n/**\n * Copyright (c) 2013, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar Direction = {\n DOWN: Symbol('DOWN'),\n INVALID: Symbol('INVALID'),\n LEFT: Symbol('LEFT'),\n RIGHT: Symbol('RIGHT'),\n UP: Symbol('UP')\n};\nexports[\"default\"] = Direction;\nmodule.exports = exports['default'];","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function (window, document, exportName, undefined) {\n 'use strict';\n\n var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n var TEST_ELEMENT = document.createElement('div');\n var TYPE_FUNCTION = 'function';\n var round = Math.round;\n var abs = Math.abs;\n var now = Date.now;\n /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\n\n function setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n }\n /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\n\n\n function invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n\n return false;\n }\n /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\n\n\n function each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n }\n /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\n\n\n function deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function () {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '').replace(/^\\s+at\\s+/gm, '').replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n var log = window.console && (window.console.warn || window.console.log);\n\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n\n return method.apply(this, arguments);\n };\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\n\n\n var assign;\n\n if (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n\n return output;\n };\n } else {\n assign = Object.assign;\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\n\n\n var extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n\n while (i < keys.length) {\n if (!merge || merge && dest[keys[i]] === undefined) {\n dest[keys[i]] = src[keys[i]];\n }\n\n i++;\n }\n\n return dest;\n }, 'extend', 'Use `assign`.');\n /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\n\n var merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n }, 'merge', 'Use `assign`.');\n /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\n\n function inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n }\n /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\n\n\n function bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n }\n /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\n\n\n function boolOrFn(val, args) {\n if (_typeof(val) == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n\n return val;\n }\n /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\n\n\n function ifUndefined(val1, val2) {\n return val1 === undefined ? val2 : val1;\n }\n /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function addEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.addEventListener(type, handler, false);\n });\n }\n /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function removeEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.removeEventListener(type, handler, false);\n });\n }\n /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\n\n\n function hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n\n node = node.parentNode;\n }\n\n return false;\n }\n /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\n\n\n function inStr(str, find) {\n return str.indexOf(find) > -1;\n }\n /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\n\n\n function splitStr(str) {\n return str.trim().split(/\\s+/g);\n }\n /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\n\n\n function inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n\n while (i < src.length) {\n if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {\n return i;\n }\n\n i++;\n }\n\n return -1;\n }\n }\n /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\n\n\n function toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n }\n /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\n\n\n function uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n }\n /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\n\n\n function prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n var i = 0;\n\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = prefix ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n\n i++;\n }\n\n return undefined;\n }\n /**\n * get a unique id\n * @returns {number} uniqueId\n */\n\n\n var _uniqueId = 1;\n\n function uniqueId() {\n return _uniqueId++;\n }\n /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\n\n\n function getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return doc.defaultView || doc.parentWindow || window;\n }\n\n var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n var SUPPORT_TOUCH = ('ontouchstart' in window);\n var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n var INPUT_TYPE_TOUCH = 'touch';\n var INPUT_TYPE_PEN = 'pen';\n var INPUT_TYPE_MOUSE = 'mouse';\n var INPUT_TYPE_KINECT = 'kinect';\n var COMPUTE_INTERVAL = 25;\n var INPUT_START = 1;\n var INPUT_MOVE = 2;\n var INPUT_END = 4;\n var INPUT_CANCEL = 8;\n var DIRECTION_NONE = 1;\n var DIRECTION_LEFT = 2;\n var DIRECTION_RIGHT = 4;\n var DIRECTION_UP = 8;\n var DIRECTION_DOWN = 16;\n var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n var PROPS_XY = ['x', 'y'];\n var PROPS_CLIENT_XY = ['clientX', 'clientY'];\n /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\n\n function Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n\n this.domHandler = function (ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n }\n\n Input.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function handler() {},\n\n /**\n * bind the events\n */\n init: function init() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function destroy() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n };\n /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\n\n function createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n\n return new Type(manager, inputHandler);\n }\n /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\n\n\n function inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n } // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n\n\n input.eventType = eventType; // compute scale, rotation etc\n\n computeInputData(manager, input); // emit secret event\n\n manager.emit('hammer.input', input);\n manager.recognize(input);\n manager.session.prevInput = input;\n }\n /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\n\n\n function computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length; // store the first input to calculate the distance and direction\n\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n } // to compute scale and rotation we need to store the multiple touches\n\n\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n computeIntervalInputData(session, input); // find the correct target\n\n var target = manager.element;\n\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n\n input.target = target;\n }\n\n function computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n }\n /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\n\n\n function computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity,\n velocityX,\n velocityY,\n direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n }\n /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\n\n\n function simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n }\n /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\n\n\n function getCenter(pointers) {\n var pointersLength = pointers.length; // no need to loop when only one touch\n\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0,\n y = 0,\n i = 0;\n\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n }\n /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\n\n\n function getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n }\n /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\n\n\n function getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n }\n /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\n\n\n function getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.sqrt(x * x + y * y);\n }\n /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\n\n\n function getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n }\n /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\n\n\n function getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n }\n /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\n\n\n function getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n }\n\n var MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n };\n var MOUSE_ELEMENT_EVENTS = 'mousedown';\n var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n /**\n * Mouse events input\n * @constructor\n * @extends Input\n */\n\n function MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n }\n\n inherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down\n\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n } // mouse must be down\n\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n });\n var POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n }; // in IE10 the pointer types is defined as an enum\n\n var IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\n };\n var POINTER_ELEMENT_EVENTS = 'pointerdown';\n var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive\n\n if (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n }\n /**\n * Pointer events input\n * @constructor\n * @extends Input\n */\n\n\n function PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n Input.apply(this, arguments);\n this.store = this.manager.session.pointerEvents = [];\n }\n\n inherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store\n\n var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down\n\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n } // it not found, so the pointer hasn't been down (so it's probably a hover)\n\n\n if (storeIndex < 0) {\n return;\n } // update the event in the store\n\n\n store[storeIndex] = ev;\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n });\n var SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Touch events input\n * @constructor\n * @extends Input\n */\n\n function SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n Input.apply(this, arguments);\n }\n\n inherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?\n\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state\n\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n }\n\n var TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\n\n function TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n Input.apply(this, arguments);\n }\n\n inherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds; // when there is only one touch, the process can be simplified\n\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target; // get target touches from touches\n\n targetTouches = allTouches.filter(function (touch) {\n return hasParent(touch.target, target);\n }); // collect touches\n\n if (type === INPUT_START) {\n i = 0;\n\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n } // filter changed touches to only contain touches that exist in the collected target ids\n\n\n i = 0;\n\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n } // cleanup removed touches\n\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];\n }\n /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\n\n var DEDUP_TIMEOUT = 2500;\n var DEDUP_DISTANCE = 25;\n\n function TouchMouseInput() {\n Input.apply(this, arguments);\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n this.primaryTouch = null;\n this.lastTouches = [];\n }\n\n inherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,\n isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n } // when we're in a touch event, record touches to de-dupe synthetic mouse event\n\n\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n });\n\n function recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n }\n\n function setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {\n x: touch.clientX,\n y: touch.clientY\n };\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n\n var removeLastTouch = function removeLastTouch() {\n var i = lts.indexOf(lastTouch);\n\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n }\n\n function isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX,\n y = eventData.srcEvent.clientY;\n\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x),\n dy = Math.abs(y - t.y);\n\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n\n return false;\n }\n\n var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value\n\n var TOUCH_ACTION_COMPUTE = 'compute';\n var TOUCH_ACTION_AUTO = 'auto';\n var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\n var TOUCH_ACTION_NONE = 'none';\n var TOUCH_ACTION_PAN_X = 'pan-x';\n var TOUCH_ACTION_PAN_Y = 'pan-y';\n var TOUCH_ACTION_MAP = getTouchActionProps();\n /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\n\n function TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n }\n\n TouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function set(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function update() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function compute() {\n var actions = [];\n each(this.manager.recognizers, function (recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function preventDefaults(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection; // if the touch action did prevented once this session\n\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function preventSrc(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n };\n /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\n\n function cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n } // pan-x OR pan-y\n\n\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n } // manipulation\n\n\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n }\n\n function getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n }\n /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\n\n\n var STATE_POSSIBLE = 1;\n var STATE_BEGAN = 2;\n var STATE_CHANGED = 4;\n var STATE_ENDED = 8;\n var STATE_RECOGNIZED = STATE_ENDED;\n var STATE_CANCELLED = 16;\n var STATE_FAILED = 32;\n /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\n\n function Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n this.id = uniqueId();\n this.manager = null; // default is enable true\n\n this.options.enable = ifUndefined(this.options.enable, true);\n this.state = STATE_POSSIBLE;\n this.simultaneous = {};\n this.requireFail = [];\n }\n\n Recognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function set(options) {\n assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state\n\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function recognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function requireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function dropRequireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function hasRequireFailures() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function canRecognizeWith(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function emit(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n } // 'panstart' and 'panmove'\n\n\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) {\n // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n } // panend and pancancel\n\n\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function tryEmit(input) {\n if (this.canEmit()) {\n return this.emit(input);\n } // it's failing anyway\n\n\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function canEmit() {\n var i = 0;\n\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n\n i++;\n }\n\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?\n\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n } // reset when we've reached the end\n\n\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone); // the recognizer has recognized a gesture\n // so trigger an event\n\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function process(inputData) {},\n // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function getTouchAction() {},\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function reset() {}\n };\n /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\n\n function stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n\n return '';\n }\n /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\n\n\n function directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n\n return '';\n }\n /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\n\n\n function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n\n if (manager) {\n return manager.get(otherRecognizer);\n }\n\n return otherRecognizer;\n }\n /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\n\n\n function AttrRecognizer() {\n Recognizer.apply(this, arguments);\n }\n\n inherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function attrTest(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function process(input) {\n var state = this.state;\n var eventType = input.eventType;\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED\n\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n\n return state | STATE_CHANGED;\n }\n\n return STATE_FAILED;\n }\n });\n /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n this.pX = null;\n this.pY = null;\n }\n\n inherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n getTouchAction: function getTouchAction() {\n var direction = this.options.direction;\n var actions = [];\n\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n\n return actions;\n },\n directionTest: function directionTest(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY; // lock to axis?\n\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n attrTest: function attrTest(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n },\n emit: function emit(input) {\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n emit: function emit(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\n\n function PressRecognizer() {\n Recognizer.apply(this, arguments);\n this._timer = null;\n this._input = null;\n }\n\n inherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251,\n // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_AUTO];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n this._input = input; // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && input.eventType & INPUT_END) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n });\n /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n getTouchAction: function getTouchAction() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n attrTest: function attrTest(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n emit: function emit(input) {\n var direction = directionStr(input.offsetDirection);\n\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n });\n /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\n\n function TapRecognizer() {\n Recognizer.apply(this, arguments); // previous time and center,\n // used for tap counting\n\n this.pTime = false;\n this.pCenter = false;\n this._timer = null;\n this._input = null;\n this.count = 0;\n }\n\n inherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300,\n // max time between the multi-tap taps\n time: 250,\n // max time of the pointer to be down (like finger on the screen)\n threshold: 9,\n // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n this.reset();\n\n if (input.eventType & INPUT_START && this.count === 0) {\n return this.failTimeout();\n } // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input; // if tap count matches we have recognized it,\n // else it has began recognizing...\n\n var tapCount = this.count % options.taps;\n\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n\n return STATE_FAILED;\n },\n failTimeout: function failTimeout() {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n }\n /**\n * @const {string}\n */\n\n\n Hammer.VERSION = '2.0.7';\n /**\n * default settings\n * @namespace\n */\n\n Hammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {\n enable: false\n }], [PinchRecognizer, {\n enable: false\n }, ['rotate']], [SwipeRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }], [PanRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }, ['swipe']], [TapRecognizer], [TapRecognizer, {\n event: 'doubletap',\n taps: 2\n }, ['tap']], [PressRecognizer]],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n };\n var STOP = 1;\n var FORCED_STOP = 2;\n /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n this.options.inputTarget = this.options.inputTarget || element;\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n toggleCssProps(this, true);\n each(this.options.recognizers, function (item) {\n var recognizer = this.add(new item[0](item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n }\n\n Manager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function set(options) {\n assign(this.options, options); // Options that need a little more setup\n\n if (options.touchAction) {\n this.touchAction.update();\n }\n\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function stop(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n var session = this.session;\n\n if (session.stopped) {\n return;\n } // run the touch-action polyfill\n\n\n this.touchAction.preventDefaults(inputData);\n var recognizer;\n var recognizers = this.recognizers; // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n\n var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized\n // or when we're in a new session\n\n if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n\n while (i < recognizers.length) {\n recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) {\n // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n\n\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function get(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function add(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n } // remove existing\n\n\n var existing = this.get(recognizer.options.event);\n\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function remove(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer); // let's make sure this recognizer exists\n\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function on(events, handler) {\n if (events === undefined) {\n return;\n }\n\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function off(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function emit(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n } // no handlers, so skip it all\n\n\n var handlers = this.handlers[event] && this.handlers[event].slice();\n\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n\n data.preventDefault = function () {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function destroy() {\n this.element && toggleCssProps(this, false);\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n };\n /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\n\n function toggleCssProps(manager, add) {\n var element = manager.element;\n\n if (!element.style) {\n return;\n }\n\n var prop;\n each(manager.options.cssProps, function (value, name) {\n prop = prefixed(element.style, name);\n\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n\n if (!add) {\n manager.oldCssProps = {};\n }\n }\n /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\n\n\n function triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n }\n\n assign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n }); // this prevents errors when Hammer is loaded in the presence of an AMD\n // style loader but by script tag, not by the loader.\n\n var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line\n\n freeGlobal.Hammer = Hammer;\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return Hammer;\n });\n } else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n } else {\n window[exportName] = Hammer;\n }\n})(window, document, 'Hammer');","var scope = typeof global !== \"undefined\" && global || typeof self !== \"undefined\" && self || window;\nvar apply = Function.prototype.apply; // DOM APIs, for completeness\n\nexports.setTimeout = function () {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\n\nexports.setInterval = function () {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\n\nexports.clearTimeout = exports.clearInterval = function (timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\n\nTimeout.prototype.unref = Timeout.prototype.ref = function () {};\n\nTimeout.prototype.close = function () {\n this._clearFn.call(scope, this._id);\n}; // Does not start the time, just sets up the members needed.\n\n\nexports.enroll = function (item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function (item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function (item) {\n clearTimeout(item._idleTimeoutId);\n var msecs = item._idleTimeout;\n\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout) item._onTimeout();\n }, msecs);\n }\n}; // setimmediate attaches itself to the global object\n\n\nrequire(\"setimmediate\"); // On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\n\n\nexports.setImmediate = typeof self !== \"undefined\" && self.setImmediate || typeof global !== \"undefined\" && global.setImmediate || this && this.setImmediate;\nexports.clearImmediate = typeof self !== \"undefined\" && self.clearImmediate || typeof global !== \"undefined\" && global.clearImmediate || this && this.clearImmediate;","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n } // Copy function arguments\n\n\n var args = new Array(arguments.length - 1);\n\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n } // Store and register the task\n\n\n var task = {\n callback: callback,\n args: args\n };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n\n switch (args.length) {\n case 0:\n callback();\n break;\n\n case 1:\n callback(args[0]);\n break;\n\n case 2:\n callback(args[0], args[1]);\n break;\n\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n\n if (task) {\n currentlyRunningATask = true;\n\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function registerImmediate(handle) {\n process.nextTick(function () {\n runIfPresent(handle);\n });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n\n global.onmessage = function () {\n postMessageIsAsynchronous = false;\n };\n\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n\n var onGlobalMessage = function onGlobalMessage(event) {\n if (event.source === global && typeof event.data === \"string\" && event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function registerImmediate(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n\n channel.port1.onmessage = function (event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function registerImmediate(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n\n registerImmediate = function registerImmediate(handle) {\n // Create a