{"version":3,"sources":["Shared/Static/js/lib/lodash.js"],"names":["undefined","LARGE_ARRAY_SIZE","CORE_ERROR_TEXT","FUNC_ERROR_TEXT","INVALID_TEMPL_VAR_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","PLACEHOLDER","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","WRAP_BIND_FLAG","WRAP_BIND_KEY_FLAG","WRAP_CURRY_BOUND_FLAG","WRAP_CURRY_FLAG","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","WRAP_FLIP_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","INFINITY","MAX_SAFE_INTEGER","MAX_INTEGER","NAN","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","asyncTag","boolTag","dateTag","domExcTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","weakSetTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","RegExp","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","reOptMod","rsSeq","join","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","\\","'","\n","\r","
","
","freeParseFloat","parseFloat","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","moduleExports","freeProcess","process","nodeUtil","types","require","binding","e","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","apply","func","thisArg","args","length","call","arrayAggregator","array","setter","iteratee","accumulator","index","value","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","Array","arrayPush","values","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","key","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","basePropertyOf","baseReduce","current","baseTimes","n","baseTrim","string","slice","trimmedEndIndex","replace","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","Ā","Ă","Ą","ā","ă","ą","Ć","Ĉ","Ċ","Č","ć","ĉ","ċ","č","Ď","Đ","ď","đ","Ē","Ĕ","Ė","Ę","Ě","ē","ĕ","ė","ę","ě","Ĝ","Ğ","Ġ","Ģ","ĝ","ğ","ġ","ģ","Ĥ","Ħ","ĥ","ħ","Ĩ","Ī","Ĭ","Į","İ","ĩ","ī","ĭ","į","ı","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","Ļ","Ľ","Ŀ","Ł","ĺ","ļ","ľ","ŀ","ł","Ń","Ņ","Ň","Ŋ","ń","ņ","ň","ŋ","Ō","Ŏ","Ő","ō","ŏ","ő","Ŕ","Ŗ","Ř","ŕ","ŗ","ř","Ś","Ŝ","Ş","Š","ś","ŝ","ş","š","Ţ","Ť","Ŧ","ţ","ť","ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","ũ","ū","ŭ","ů","ű","ų","Ŵ","ŵ","Ŷ","ŷ","Ÿ","Ź","Ż","Ž","ź","ż","ž","IJ","ij","Œ","œ","ʼn","ſ","escapeHtmlChar","&","<",">","\"","escapeStringChar","chr","hasUnicode","test","mapToArray","map","size","forEach","overArg","transform","arg","replaceHolders","placeholder","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","match","unicodeToArray","split","asciiToArray","charAt","unescapeHtmlChar","&","<",">",""","'","_","runInContext","context","defaults","pick","Date","Error","Math","String","TypeError","arrayProto","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","idCounter","maskSrcKey","uid","exec","keys","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","create","propertyIsEnumerable","splice","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","setTimeout","nativeCeil","ceil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","max","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","isArray","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","isObject","baseLodash","chainAll","this","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","add","Stack","data","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","push","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","configurable","enumerable","writable","baseAt","paths","skip","get","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","constructor","input","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","cloneSymbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","escape","evaluate","interpolate","variable","imports","pop","hash","getMapData","pairs","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","baseGet","path","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","parent","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","name","message","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","baseIsNative","isMasked","baseIteratee","identity","baseMatchesProperty","baseMatches","property","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","criteria","objCriteria","othCriteria","ordersLength","compareAscending","order","compareMultiple","basePickBy","baseSet","basePullAll","indexOf","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","start","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","end","baseSome","baseSortedIndex","retHighest","low","high","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","id","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","trailing","createCompounder","callback","words","deburr","createCtor","arguments","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","countHolders","newHolders","createRecurry","fn","arrLength","oldArray","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","arrStacked","arrValue","flatten","otherFunc","type","isKeyable","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","resolve","ctorString","isMaskable","stubFalse","otherArgs","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","clone","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","find","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bind","bindKey","debounce","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lt","lte","toArray","next","done","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","basePick","pickBy","prop","toPairs","toPairsIn","camelCase","word","toLowerCase","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","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","filter","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","remove","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extend","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","target","position","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","reduce","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","importsKeys","importsValues","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","times","toLower","toSafeInteger","toUpper","trim","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","uniqueId","prefix","each","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","define","amd"],"mappings":"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","file":"lodash.js","sourcesContent":["/**\r\n * @license\r\n * Lodash \r\n * Copyright OpenJS Foundation and other contributors \r\n * Released under MIT license \r\n * Based on Underscore.js 1.8.3 \r\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n */\r\n;(function() {\r\n\r\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\r\n var undefined;\r\n\r\n /** Used as the semantic version number. */\r\n var VERSION = '4.17.21';\r\n\r\n /** Used as the size to enable large array optimizations. */\r\n var LARGE_ARRAY_SIZE = 200;\r\n\r\n /** Error message constants. */\r\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\r\n FUNC_ERROR_TEXT = 'Expected a function',\r\n INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\r\n\r\n /** Used to stand-in for `undefined` hash values. */\r\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\r\n\r\n /** Used as the maximum memoize cache size. */\r\n var MAX_MEMOIZE_SIZE = 500;\r\n\r\n /** Used as the internal argument placeholder. */\r\n var PLACEHOLDER = '__lodash_placeholder__';\r\n\r\n /** Used to compose bitmasks for cloning. */\r\n var CLONE_DEEP_FLAG = 1,\r\n CLONE_FLAT_FLAG = 2,\r\n CLONE_SYMBOLS_FLAG = 4;\r\n\r\n /** Used to compose bitmasks for value comparisons. */\r\n var COMPARE_PARTIAL_FLAG = 1,\r\n COMPARE_UNORDERED_FLAG = 2;\r\n\r\n /** Used to compose bitmasks for function metadata. */\r\n var WRAP_BIND_FLAG = 1,\r\n WRAP_BIND_KEY_FLAG = 2,\r\n WRAP_CURRY_BOUND_FLAG = 4,\r\n WRAP_CURRY_FLAG = 8,\r\n WRAP_CURRY_RIGHT_FLAG = 16,\r\n WRAP_PARTIAL_FLAG = 32,\r\n WRAP_PARTIAL_RIGHT_FLAG = 64,\r\n WRAP_ARY_FLAG = 128,\r\n WRAP_REARG_FLAG = 256,\r\n WRAP_FLIP_FLAG = 512;\r\n\r\n /** Used as default options for `_.truncate`. */\r\n var DEFAULT_TRUNC_LENGTH = 30,\r\n DEFAULT_TRUNC_OMISSION = '...';\r\n\r\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\r\n var HOT_COUNT = 800,\r\n HOT_SPAN = 16;\r\n\r\n /** Used to indicate the type of lazy iteratees. */\r\n var LAZY_FILTER_FLAG = 1,\r\n LAZY_MAP_FLAG = 2,\r\n LAZY_WHILE_FLAG = 3;\r\n\r\n /** Used as references for various `Number` constants. */\r\n var INFINITY = 1 / 0,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n MAX_INTEGER = 1.7976931348623157e+308,\r\n NAN = 0 / 0;\r\n\r\n /** Used as references for the maximum length and index of an array. */\r\n var MAX_ARRAY_LENGTH = 4294967295,\r\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\r\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\r\n\r\n /** Used to associate wrap methods with their bit flags. */\r\n var wrapFlags = [\r\n ['ary', WRAP_ARY_FLAG],\r\n ['bind', WRAP_BIND_FLAG],\r\n ['bindKey', WRAP_BIND_KEY_FLAG],\r\n ['curry', WRAP_CURRY_FLAG],\r\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\r\n ['flip', WRAP_FLIP_FLAG],\r\n ['partial', WRAP_PARTIAL_FLAG],\r\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\r\n ['rearg', WRAP_REARG_FLAG]\r\n ];\r\n\r\n /** `Object#toString` result references. */\r\n var argsTag = '[object Arguments]',\r\n arrayTag = '[object Array]',\r\n asyncTag = '[object AsyncFunction]',\r\n boolTag = '[object Boolean]',\r\n dateTag = '[object Date]',\r\n domExcTag = '[object DOMException]',\r\n errorTag = '[object Error]',\r\n funcTag = '[object Function]',\r\n genTag = '[object GeneratorFunction]',\r\n mapTag = '[object Map]',\r\n numberTag = '[object Number]',\r\n nullTag = '[object Null]',\r\n objectTag = '[object Object]',\r\n promiseTag = '[object Promise]',\r\n proxyTag = '[object Proxy]',\r\n regexpTag = '[object RegExp]',\r\n setTag = '[object Set]',\r\n stringTag = '[object String]',\r\n symbolTag = '[object Symbol]',\r\n undefinedTag = '[object Undefined]',\r\n weakMapTag = '[object WeakMap]',\r\n weakSetTag = '[object WeakSet]';\r\n\r\n var arrayBufferTag = '[object ArrayBuffer]',\r\n dataViewTag = '[object DataView]',\r\n float32Tag = '[object Float32Array]',\r\n float64Tag = '[object Float64Array]',\r\n int8Tag = '[object Int8Array]',\r\n int16Tag = '[object Int16Array]',\r\n int32Tag = '[object Int32Array]',\r\n uint8Tag = '[object Uint8Array]',\r\n uint8ClampedTag = '[object Uint8ClampedArray]',\r\n uint16Tag = '[object Uint16Array]',\r\n uint32Tag = '[object Uint32Array]';\r\n\r\n /** Used to match empty string literals in compiled template source. */\r\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n /** Used to match HTML entities and HTML characters. */\r\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\r\n reUnescapedHtml = /[&<>\"']/g,\r\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\r\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\r\n\r\n /** Used to match template delimiters. */\r\n var reEscape = /<%-([\\s\\S]+?)%>/g,\r\n reEvaluate = /<%([\\s\\S]+?)%>/g,\r\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n /** Used to match property names within property paths. */\r\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\r\n reIsPlainProp = /^\\w*$/,\r\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\r\n\r\n /**\r\n * Used to match `RegExp`\r\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\r\n */\r\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\r\n reHasRegExpChar = RegExp(reRegExpChar.source);\r\n\r\n /** Used to match leading whitespace. */\r\n var reTrimStart = /^\\s+/;\r\n\r\n /** Used to match a single whitespace character. */\r\n var reWhitespace = /\\s/;\r\n\r\n /** Used to match wrap detail comments. */\r\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\r\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\r\n reSplitDetails = /,? & /;\r\n\r\n /** Used to match words composed of alphanumeric characters. */\r\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\r\n\r\n /**\r\n * Used to validate the `validate` option in `_.template` variable.\r\n *\r\n * Forbids characters which could potentially change the meaning of the function argument definition:\r\n * - \"(),\" (modification of function parameters)\r\n * - \"=\" (default value)\r\n * - \"[]{}\" (destructuring of function parameters)\r\n * - \"/\" (beginning of a comment)\r\n * - whitespace\r\n */\r\n var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\r\n\r\n /** Used to match backslashes in property paths. */\r\n var reEscapeChar = /\\\\(\\\\)?/g;\r\n\r\n /**\r\n * Used to match\r\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\r\n */\r\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n /** Used to match `RegExp` flags from their coerced string values. */\r\n var reFlags = /\\w*$/;\r\n\r\n /** Used to detect bad signed hexadecimal string values. */\r\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\r\n\r\n /** Used to detect binary string values. */\r\n var reIsBinary = /^0b[01]+$/i;\r\n\r\n /** Used to detect host constructors (Safari). */\r\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\r\n\r\n /** Used to detect octal string values. */\r\n var reIsOctal = /^0o[0-7]+$/i;\r\n\r\n /** Used to detect unsigned integer values. */\r\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\r\n\r\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\r\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\r\n\r\n /** Used to ensure capturing order of template delimiters. */\r\n var reNoMatch = /($^)/;\r\n\r\n /** Used to match unescaped characters in compiled string literals. */\r\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\r\n\r\n /** Used to compose unicode character classes. */\r\n var rsAstralRange = '\\\\ud800-\\\\udfff',\r\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\r\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\r\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\r\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\r\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\r\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\r\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\r\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\r\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\r\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',\r\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\r\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\r\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\r\n\r\n /** Used to compose unicode capture groups. */\r\n var rsApos = \"['\\u2019]\",\r\n rsAstral = '[' + rsAstralRange + ']',\r\n rsBreak = '[' + rsBreakRange + ']',\r\n rsCombo = '[' + rsComboRange + ']',\r\n rsDigits = '\\\\d+',\r\n rsDingbat = '[' + rsDingbatRange + ']',\r\n rsLower = '[' + rsLowerRange + ']',\r\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\r\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\r\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\r\n rsNonAstral = '[^' + rsAstralRange + ']',\r\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\r\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\r\n rsUpper = '[' + rsUpperRange + ']',\r\n rsZWJ = '\\\\u200d';\r\n\r\n /** Used to compose unicode regexes. */\r\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\r\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\r\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\r\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\r\n reOptMod = rsModifier + '?',\r\n rsOptVar = '[' + rsVarRange + ']?',\r\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\r\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\r\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\r\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\r\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\r\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\r\n\r\n /** Used to match apostrophes. */\r\n var reApos = RegExp(rsApos, 'g');\r\n\r\n /**\r\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\r\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\r\n */\r\n var reComboMark = RegExp(rsCombo, 'g');\r\n\r\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\r\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\r\n\r\n /** Used to match complex or compound words. */\r\n var reUnicodeWord = RegExp([\r\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\r\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\r\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\r\n rsUpper + '+' + rsOptContrUpper,\r\n rsOrdUpper,\r\n rsOrdLower,\r\n rsDigits,\r\n rsEmoji\r\n ].join('|'), 'g');\r\n\r\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/). */\r\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\r\n\r\n /** Used to detect strings that need a more robust regexp to match words. */\r\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 ]/;\r\n\r\n /** Used to assign default `context` object properties. */\r\n var contextProps = [\r\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\r\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\r\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\r\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\r\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\r\n ];\r\n\r\n /** Used to make template sourceURLs easier to identify. */\r\n var templateCounter = -1;\r\n\r\n /** Used to identify `toStringTag` values of typed arrays. */\r\n var typedArrayTags = {};\r\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\r\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\r\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\r\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\r\n typedArrayTags[uint32Tag] = true;\r\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\r\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\r\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\r\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\r\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\r\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\r\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\r\n typedArrayTags[weakMapTag] = false;\r\n\r\n /** Used to identify `toStringTag` values supported by `_.clone`. */\r\n var cloneableTags = {};\r\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\r\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\r\n cloneableTags[boolTag] = cloneableTags[dateTag] =\r\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\r\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\r\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\r\n cloneableTags[numberTag] = cloneableTags[objectTag] =\r\n cloneableTags[regexpTag] = cloneableTags[setTag] =\r\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\r\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\r\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\r\n cloneableTags[errorTag] = cloneableTags[funcTag] =\r\n cloneableTags[weakMapTag] = false;\r\n\r\n /** Used to map Latin Unicode letters to basic Latin letters. */\r\n var deburredLetters = {\r\n // Latin-1 Supplement block.\r\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\r\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\r\n '\\xc7': 'C', '\\xe7': 'c',\r\n '\\xd0': 'D', '\\xf0': 'd',\r\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\r\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\r\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\r\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\r\n '\\xd1': 'N', '\\xf1': 'n',\r\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\r\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\r\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\r\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\r\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\r\n '\\xc6': 'Ae', '\\xe6': 'ae',\r\n '\\xde': 'Th', '\\xfe': 'th',\r\n '\\xdf': 'ss',\r\n // Latin Extended-A block.\r\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\r\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\r\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\r\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\r\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\r\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\r\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\r\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\r\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\r\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\r\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\r\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\r\n '\\u0134': 'J', '\\u0135': 'j',\r\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\r\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\r\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\r\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\r\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\r\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\r\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\r\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\r\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\r\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\r\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\r\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\r\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\r\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\r\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\r\n '\\u0174': 'W', '\\u0175': 'w',\r\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\r\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\r\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\r\n '\\u0132': 'IJ', '\\u0133': 'ij',\r\n '\\u0152': 'Oe', '\\u0153': 'oe',\r\n '\\u0149': \"'n\", '\\u017f': 's'\r\n };\r\n\r\n /** Used to map characters to HTML entities. */\r\n var htmlEscapes = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": '''\r\n };\r\n\r\n /** Used to map HTML entities to characters. */\r\n var htmlUnescapes = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '"': '\"',\r\n ''': \"'\"\r\n };\r\n\r\n /** Used to escape characters for inclusion in compiled string literals. */\r\n var stringEscapes = {\r\n '\\\\': '\\\\',\r\n \"'\": \"'\",\r\n '\\n': 'n',\r\n '\\r': 'r',\r\n '\\u2028': 'u2028',\r\n '\\u2029': 'u2029'\r\n };\r\n\r\n /** Built-in method references without a dependency on `root`. */\r\n var freeParseFloat = parseFloat,\r\n freeParseInt = parseInt;\r\n\r\n /** Detect free variable `global` from Node.js. */\r\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\r\n\r\n /** Detect free variable `self`. */\r\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\r\n\r\n /** Used as a reference to the global object. */\r\n var root = freeGlobal || freeSelf || Function('return this')();\r\n\r\n /** Detect free variable `exports`. */\r\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\r\n\r\n /** Detect free variable `module`. */\r\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\r\n\r\n /** Detect the popular CommonJS extension `module.exports`. */\r\n var moduleExports = freeModule && freeModule.exports === freeExports;\r\n\r\n /** Detect free variable `process` from Node.js. */\r\n var freeProcess = moduleExports && freeGlobal.process;\r\n\r\n /** Used to access faster Node.js helpers. */\r\n var nodeUtil = (function() {\r\n try {\r\n // Use `util.types` for Node.js 10+.\r\n var types = freeModule && freeModule.require && freeModule.require('util').types;\r\n\r\n if (types) {\r\n return types;\r\n }\r\n\r\n // Legacy `process.binding('util')` for Node.js < 10.\r\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\r\n } catch (e) {}\r\n }());\r\n\r\n /* Node.js helper references. */\r\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\r\n nodeIsDate = nodeUtil && nodeUtil.isDate,\r\n nodeIsMap = nodeUtil && nodeUtil.isMap,\r\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\r\n nodeIsSet = nodeUtil && nodeUtil.isSet,\r\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * A faster alternative to `Function#apply`, this function invokes `func`\r\n * with the `this` binding of `thisArg` and the arguments of `args`.\r\n *\r\n * @private\r\n * @param {Function} func The function to invoke.\r\n * @param {*} thisArg The `this` binding of `func`.\r\n * @param {Array} args The arguments to invoke `func` with.\r\n * @returns {*} Returns the result of `func`.\r\n */\r\n function apply(func, thisArg, args) {\r\n switch (args.length) {\r\n case 0: return func.call(thisArg);\r\n case 1: return func.call(thisArg, args[0]);\r\n case 2: return func.call(thisArg, args[0], args[1]);\r\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\r\n }\r\n return func.apply(thisArg, args);\r\n }\r\n\r\n /**\r\n * A specialized version of `baseAggregator` for arrays.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} setter The function to set `accumulator` values.\r\n * @param {Function} iteratee The iteratee to transform keys.\r\n * @param {Object} accumulator The initial aggregated object.\r\n * @returns {Function} Returns `accumulator`.\r\n */\r\n function arrayAggregator(array, setter, iteratee, accumulator) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n setter(accumulator, value, iteratee(value), array);\r\n }\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.forEach` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function arrayEach(array, iteratee) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n if (iteratee(array[index], index, array) === false) {\r\n break;\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.forEachRight` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function arrayEachRight(array, iteratee) {\r\n var length = array == null ? 0 : array.length;\r\n\r\n while (length--) {\r\n if (iteratee(array[length], length, array) === false) {\r\n break;\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.every` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\r\n * else `false`.\r\n */\r\n function arrayEvery(array, predicate) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n if (!predicate(array[index], index, array)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.filter` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {Array} Returns the new filtered array.\r\n */\r\n function arrayFilter(array, predicate) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length,\r\n resIndex = 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (predicate(value, index, array)) {\r\n result[resIndex++] = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.includes` for arrays without support for\r\n * specifying an index to search from.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to inspect.\r\n * @param {*} target The value to search for.\r\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\r\n */\r\n function arrayIncludes(array, value) {\r\n var length = array == null ? 0 : array.length;\r\n return !!length && baseIndexOf(array, value, 0) > -1;\r\n }\r\n\r\n /**\r\n * This function is like `arrayIncludes` except that it accepts a comparator.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to inspect.\r\n * @param {*} target The value to search for.\r\n * @param {Function} comparator The comparator invoked per element.\r\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\r\n */\r\n function arrayIncludesWith(array, value, comparator) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n if (comparator(value, array[index])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.map` for arrays without support for iteratee\r\n * shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the new mapped array.\r\n */\r\n function arrayMap(array, iteratee) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length,\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n result[index] = iteratee(array[index], index, array);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Appends the elements of `values` to `array`.\r\n *\r\n * @private\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to append.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function arrayPush(array, values) {\r\n var index = -1,\r\n length = values.length,\r\n offset = array.length;\r\n\r\n while (++index < length) {\r\n array[offset + index] = values[index];\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.reduce` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {*} [accumulator] The initial value.\r\n * @param {boolean} [initAccum] Specify using the first element of `array` as\r\n * the initial value.\r\n * @returns {*} Returns the accumulated value.\r\n */\r\n function arrayReduce(array, iteratee, accumulator, initAccum) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n if (initAccum && length) {\r\n accumulator = array[++index];\r\n }\r\n while (++index < length) {\r\n accumulator = iteratee(accumulator, array[index], index, array);\r\n }\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.reduceRight` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {*} [accumulator] The initial value.\r\n * @param {boolean} [initAccum] Specify using the last element of `array` as\r\n * the initial value.\r\n * @returns {*} Returns the accumulated value.\r\n */\r\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\r\n var length = array == null ? 0 : array.length;\r\n if (initAccum && length) {\r\n accumulator = array[--length];\r\n }\r\n while (length--) {\r\n accumulator = iteratee(accumulator, array[length], length, array);\r\n }\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.some` for arrays without support for iteratee\r\n * shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {boolean} Returns `true` if any element passes the predicate check,\r\n * else `false`.\r\n */\r\n function arraySome(array, predicate) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n if (predicate(array[index], index, array)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the size of an ASCII `string`.\r\n *\r\n * @private\r\n * @param {string} string The string inspect.\r\n * @returns {number} Returns the string size.\r\n */\r\n var asciiSize = baseProperty('length');\r\n\r\n /**\r\n * Converts an ASCII `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function asciiToArray(string) {\r\n return string.split('');\r\n }\r\n\r\n /**\r\n * Splits an ASCII `string` into an array of its words.\r\n *\r\n * @private\r\n * @param {string} The string to inspect.\r\n * @returns {Array} Returns the words of `string`.\r\n */\r\n function asciiWords(string) {\r\n return string.match(reAsciiWord) || [];\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\r\n * without support for iteratee shorthands, which iterates over `collection`\r\n * using `eachFunc`.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to inspect.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @param {Function} eachFunc The function to iterate over `collection`.\r\n * @returns {*} Returns the found element or its key, else `undefined`.\r\n */\r\n function baseFindKey(collection, predicate, eachFunc) {\r\n var result;\r\n eachFunc(collection, function(value, key, collection) {\r\n if (predicate(value, key, collection)) {\r\n result = key;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\r\n * support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @param {number} fromIndex The index to search from.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\r\n var length = array.length,\r\n index = fromIndex + (fromRight ? 1 : -1);\r\n\r\n while ((fromRight ? index-- : ++index < length)) {\r\n if (predicate(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function baseIndexOf(array, value, fromIndex) {\r\n return value === value\r\n ? strictIndexOf(array, value, fromIndex)\r\n : baseFindIndex(array, baseIsNaN, fromIndex);\r\n }\r\n\r\n /**\r\n * This function is like `baseIndexOf` except that it accepts a comparator.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @param {Function} comparator The comparator invoked per element.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function baseIndexOfWith(array, value, fromIndex, comparator) {\r\n var index = fromIndex - 1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n if (comparator(array[index], value)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isNaN` without support for number objects.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\r\n */\r\n function baseIsNaN(value) {\r\n return value !== value;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.mean` and `_.meanBy` without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {number} Returns the mean.\r\n */\r\n function baseMean(array, iteratee) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? (baseSum(array, iteratee) / length) : NAN;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.property` without support for deep paths.\r\n *\r\n * @private\r\n * @param {string} key The key of the property to get.\r\n * @returns {Function} Returns the new accessor function.\r\n */\r\n function baseProperty(key) {\r\n return function(object) {\r\n return object == null ? undefined : object[key];\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.propertyOf` without support for deep paths.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Function} Returns the new accessor function.\r\n */\r\n function basePropertyOf(object) {\r\n return function(key) {\r\n return object == null ? undefined : object[key];\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\r\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {*} accumulator The initial value.\r\n * @param {boolean} initAccum Specify using the first or last element of\r\n * `collection` as the initial value.\r\n * @param {Function} eachFunc The function to iterate over `collection`.\r\n * @returns {*} Returns the accumulated value.\r\n */\r\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\r\n eachFunc(collection, function(value, index, collection) {\r\n accumulator = initAccum\r\n ? (initAccum = false, value)\r\n : iteratee(accumulator, value, index, collection);\r\n });\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sortBy` which uses `comparer` to define the\r\n * sort order of `array` and replaces criteria objects with their corresponding\r\n * values.\r\n *\r\n * @private\r\n * @param {Array} array The array to sort.\r\n * @param {Function} comparer The function to define sort order.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function baseSortBy(array, comparer) {\r\n var length = array.length;\r\n\r\n array.sort(comparer);\r\n while (length--) {\r\n array[length] = array[length].value;\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sum` and `_.sumBy` without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {number} Returns the sum.\r\n */\r\n function baseSum(array, iteratee) {\r\n var result,\r\n index = -1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n var current = iteratee(array[index]);\r\n if (current !== undefined) {\r\n result = result === undefined ? current : (result + current);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.times` without support for iteratee shorthands\r\n * or max array length checks.\r\n *\r\n * @private\r\n * @param {number} n The number of times to invoke `iteratee`.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the array of results.\r\n */\r\n function baseTimes(n, iteratee) {\r\n var index = -1,\r\n result = Array(n);\r\n\r\n while (++index < n) {\r\n result[index] = iteratee(index);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\r\n * of key-value pairs for `object` corresponding to the property names of `props`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array} props The property names to get values for.\r\n * @returns {Object} Returns the key-value pairs.\r\n */\r\n function baseToPairs(object, props) {\r\n return arrayMap(props, function(key) {\r\n return [key, object[key]];\r\n });\r\n }\r\n\r\n /**\r\n * The base implementation of `_.trim`.\r\n *\r\n * @private\r\n * @param {string} string The string to trim.\r\n * @returns {string} Returns the trimmed string.\r\n */\r\n function baseTrim(string) {\r\n return string\r\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\r\n : string;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.unary` without support for storing metadata.\r\n *\r\n * @private\r\n * @param {Function} func The function to cap arguments for.\r\n * @returns {Function} Returns the new capped function.\r\n */\r\n function baseUnary(func) {\r\n return function(value) {\r\n return func(value);\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.values` and `_.valuesIn` which creates an\r\n * array of `object` property values corresponding to the property names\r\n * of `props`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array} props The property names to get values for.\r\n * @returns {Object} Returns the array of property values.\r\n */\r\n function baseValues(object, props) {\r\n return arrayMap(props, function(key) {\r\n return object[key];\r\n });\r\n }\r\n\r\n /**\r\n * Checks if a `cache` value for `key` exists.\r\n *\r\n * @private\r\n * @param {Object} cache The cache to query.\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\r\n */\r\n function cacheHas(cache, key) {\r\n return cache.has(key);\r\n }\r\n\r\n /**\r\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\r\n * that is not found in the character symbols.\r\n *\r\n * @private\r\n * @param {Array} strSymbols The string symbols to inspect.\r\n * @param {Array} chrSymbols The character symbols to find.\r\n * @returns {number} Returns the index of the first unmatched string symbol.\r\n */\r\n function charsStartIndex(strSymbols, chrSymbols) {\r\n var index = -1,\r\n length = strSymbols.length;\r\n\r\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\r\n return index;\r\n }\r\n\r\n /**\r\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\r\n * that is not found in the character symbols.\r\n *\r\n * @private\r\n * @param {Array} strSymbols The string symbols to inspect.\r\n * @param {Array} chrSymbols The character symbols to find.\r\n * @returns {number} Returns the index of the last unmatched string symbol.\r\n */\r\n function charsEndIndex(strSymbols, chrSymbols) {\r\n var index = strSymbols.length;\r\n\r\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\r\n return index;\r\n }\r\n\r\n /**\r\n * Gets the number of `placeholder` occurrences in `array`.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} placeholder The placeholder to search for.\r\n * @returns {number} Returns the placeholder count.\r\n */\r\n function countHolders(array, placeholder) {\r\n var length = array.length,\r\n result = 0;\r\n\r\n while (length--) {\r\n if (array[length] === placeholder) {\r\n ++result;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\r\n * letters to basic Latin letters.\r\n *\r\n * @private\r\n * @param {string} letter The matched letter to deburr.\r\n * @returns {string} Returns the deburred letter.\r\n */\r\n var deburrLetter = basePropertyOf(deburredLetters);\r\n\r\n /**\r\n * Used by `_.escape` to convert characters to HTML entities.\r\n *\r\n * @private\r\n * @param {string} chr The matched character to escape.\r\n * @returns {string} Returns the escaped character.\r\n */\r\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\r\n\r\n /**\r\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\r\n *\r\n * @private\r\n * @param {string} chr The matched character to escape.\r\n * @returns {string} Returns the escaped character.\r\n */\r\n function escapeStringChar(chr) {\r\n return '\\\\' + stringEscapes[chr];\r\n }\r\n\r\n /**\r\n * Gets the value at `key` of `object`.\r\n *\r\n * @private\r\n * @param {Object} [object] The object to query.\r\n * @param {string} key The key of the property to get.\r\n * @returns {*} Returns the property value.\r\n */\r\n function getValue(object, key) {\r\n return object == null ? undefined : object[key];\r\n }\r\n\r\n /**\r\n * Checks if `string` contains Unicode symbols.\r\n *\r\n * @private\r\n * @param {string} string The string to inspect.\r\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\r\n */\r\n function hasUnicode(string) {\r\n return reHasUnicode.test(string);\r\n }\r\n\r\n /**\r\n * Checks if `string` contains a word composed of Unicode symbols.\r\n *\r\n * @private\r\n * @param {string} string The string to inspect.\r\n * @returns {boolean} Returns `true` if a word is found, else `false`.\r\n */\r\n function hasUnicodeWord(string) {\r\n return reHasUnicodeWord.test(string);\r\n }\r\n\r\n /**\r\n * Converts `iterator` to an array.\r\n *\r\n * @private\r\n * @param {Object} iterator The iterator to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function iteratorToArray(iterator) {\r\n var data,\r\n result = [];\r\n\r\n while (!(data = iterator.next()).done) {\r\n result.push(data.value);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts `map` to its key-value pairs.\r\n *\r\n * @private\r\n * @param {Object} map The map to convert.\r\n * @returns {Array} Returns the key-value pairs.\r\n */\r\n function mapToArray(map) {\r\n var index = -1,\r\n result = Array(map.size);\r\n\r\n map.forEach(function(value, key) {\r\n result[++index] = [key, value];\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a unary function that invokes `func` with its argument transformed.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {Function} transform The argument transform.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function overArg(func, transform) {\r\n return function(arg) {\r\n return func(transform(arg));\r\n };\r\n }\r\n\r\n /**\r\n * Replaces all `placeholder` elements in `array` with an internal placeholder\r\n * and returns an array of their indexes.\r\n *\r\n * @private\r\n * @param {Array} array The array to modify.\r\n * @param {*} placeholder The placeholder to replace.\r\n * @returns {Array} Returns the new array of placeholder indexes.\r\n */\r\n function replaceHolders(array, placeholder) {\r\n var index = -1,\r\n length = array.length,\r\n resIndex = 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (value === placeholder || value === PLACEHOLDER) {\r\n array[index] = PLACEHOLDER;\r\n result[resIndex++] = index;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts `set` to an array of its values.\r\n *\r\n * @private\r\n * @param {Object} set The set to convert.\r\n * @returns {Array} Returns the values.\r\n */\r\n function setToArray(set) {\r\n var index = -1,\r\n result = Array(set.size);\r\n\r\n set.forEach(function(value) {\r\n result[++index] = value;\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts `set` to its value-value pairs.\r\n *\r\n * @private\r\n * @param {Object} set The set to convert.\r\n * @returns {Array} Returns the value-value pairs.\r\n */\r\n function setToPairs(set) {\r\n var index = -1,\r\n result = Array(set.size);\r\n\r\n set.forEach(function(value) {\r\n result[++index] = [value, value];\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.indexOf` which performs strict equality\r\n * comparisons of values, i.e. `===`.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function strictIndexOf(array, value, fromIndex) {\r\n var index = fromIndex - 1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n if (array[index] === value) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.lastIndexOf` which performs strict equality\r\n * comparisons of values, i.e. `===`.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function strictLastIndexOf(array, value, fromIndex) {\r\n var index = fromIndex + 1;\r\n while (index--) {\r\n if (array[index] === value) {\r\n return index;\r\n }\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Gets the number of symbols in `string`.\r\n *\r\n * @private\r\n * @param {string} string The string to inspect.\r\n * @returns {number} Returns the string size.\r\n */\r\n function stringSize(string) {\r\n return hasUnicode(string)\r\n ? unicodeSize(string)\r\n : asciiSize(string);\r\n }\r\n\r\n /**\r\n * Converts `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function stringToArray(string) {\r\n return hasUnicode(string)\r\n ? unicodeToArray(string)\r\n : asciiToArray(string);\r\n }\r\n\r\n /**\r\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\r\n * character of `string`.\r\n *\r\n * @private\r\n * @param {string} string The string to inspect.\r\n * @returns {number} Returns the index of the last non-whitespace character.\r\n */\r\n function trimmedEndIndex(string) {\r\n var index = string.length;\r\n\r\n while (index-- && reWhitespace.test(string.charAt(index))) {}\r\n return index;\r\n }\r\n\r\n /**\r\n * Used by `_.unescape` to convert HTML entities to characters.\r\n *\r\n * @private\r\n * @param {string} chr The matched character to unescape.\r\n * @returns {string} Returns the unescaped character.\r\n */\r\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\r\n\r\n /**\r\n * Gets the size of a Unicode `string`.\r\n *\r\n * @private\r\n * @param {string} string The string inspect.\r\n * @returns {number} Returns the string size.\r\n */\r\n function unicodeSize(string) {\r\n var result = reUnicode.lastIndex = 0;\r\n while (reUnicode.test(string)) {\r\n ++result;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts a Unicode `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function unicodeToArray(string) {\r\n return string.match(reUnicode) || [];\r\n }\r\n\r\n /**\r\n * Splits a Unicode `string` into an array of its words.\r\n *\r\n * @private\r\n * @param {string} The string to inspect.\r\n * @returns {Array} Returns the words of `string`.\r\n */\r\n function unicodeWords(string) {\r\n return string.match(reUnicodeWord) || [];\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Create a new pristine `lodash` function using the `context` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.1.0\r\n * @category Util\r\n * @param {Object} [context=root] The context object.\r\n * @returns {Function} Returns a new `lodash` function.\r\n * @example\r\n *\r\n * _.mixin({ 'foo': _.constant('foo') });\r\n *\r\n * var lodash = _.runInContext();\r\n * lodash.mixin({ 'bar': lodash.constant('bar') });\r\n *\r\n * _.isFunction(_.foo);\r\n * // => true\r\n * _.isFunction(_.bar);\r\n * // => false\r\n *\r\n * lodash.isFunction(lodash.foo);\r\n * // => false\r\n * lodash.isFunction(lodash.bar);\r\n * // => true\r\n *\r\n * // Create a suped-up `defer` in Node.js.\r\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\r\n */\r\n var runInContext = (function runInContext(context) {\r\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\r\n\r\n /** Built-in constructor references. */\r\n var Array = context.Array,\r\n Date = context.Date,\r\n Error = context.Error,\r\n Function = context.Function,\r\n Math = context.Math,\r\n Object = context.Object,\r\n RegExp = context.RegExp,\r\n String = context.String,\r\n TypeError = context.TypeError;\r\n\r\n /** Used for built-in method references. */\r\n var arrayProto = Array.prototype,\r\n funcProto = Function.prototype,\r\n objectProto = Object.prototype;\r\n\r\n /** Used to detect overreaching core-js shims. */\r\n var coreJsData = context['__core-js_shared__'];\r\n\r\n /** Used to resolve the decompiled source of functions. */\r\n var funcToString = funcProto.toString;\r\n\r\n /** Used to check objects for own properties. */\r\n var hasOwnProperty = objectProto.hasOwnProperty;\r\n\r\n /** Used to generate unique IDs. */\r\n var idCounter = 0;\r\n\r\n /** Used to detect methods masquerading as native. */\r\n var maskSrcKey = (function() {\r\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\r\n return uid ? ('Symbol(src)_1.' + uid) : '';\r\n }());\r\n\r\n /**\r\n * Used to resolve the\r\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\r\n * of values.\r\n */\r\n var nativeObjectToString = objectProto.toString;\r\n\r\n /** Used to infer the `Object` constructor. */\r\n var objectCtorString = funcToString.call(Object);\r\n\r\n /** Used to restore the original `_` reference in `_.noConflict`. */\r\n var oldDash = root._;\r\n\r\n /** Used to detect if a method is native. */\r\n var reIsNative = RegExp('^' +\r\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\r\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\r\n );\r\n\r\n /** Built-in value references. */\r\n var Buffer = moduleExports ? context.Buffer : undefined,\r\n Symbol = context.Symbol,\r\n Uint8Array = context.Uint8Array,\r\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\r\n getPrototype = overArg(Object.getPrototypeOf, Object),\r\n objectCreate = Object.create,\r\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\r\n splice = arrayProto.splice,\r\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\r\n symIterator = Symbol ? Symbol.iterator : undefined,\r\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\r\n\r\n var defineProperty = (function() {\r\n try {\r\n var func = getNative(Object, 'defineProperty');\r\n func({}, '', {});\r\n return func;\r\n } catch (e) {}\r\n }());\r\n\r\n /** Mocked built-ins. */\r\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\r\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\r\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\r\n\r\n /* Built-in method references for those with the same name as other `lodash` methods. */\r\n var nativeCeil = Math.ceil,\r\n nativeFloor = Math.floor,\r\n nativeGetSymbols = Object.getOwnPropertySymbols,\r\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\r\n nativeIsFinite = context.isFinite,\r\n nativeJoin = arrayProto.join,\r\n nativeKeys = overArg(Object.keys, Object),\r\n nativeMax = Math.max,\r\n nativeMin = Math.min,\r\n nativeNow = Date.now,\r\n nativeParseInt = context.parseInt,\r\n nativeRandom = Math.random,\r\n nativeReverse = arrayProto.reverse;\r\n\r\n /* Built-in method references that are verified to be native. */\r\n var DataView = getNative(context, 'DataView'),\r\n Map = getNative(context, 'Map'),\r\n Promise = getNative(context, 'Promise'),\r\n Set = getNative(context, 'Set'),\r\n WeakMap = getNative(context, 'WeakMap'),\r\n nativeCreate = getNative(Object, 'create');\r\n\r\n /** Used to store function metadata. */\r\n var metaMap = WeakMap && new WeakMap;\r\n\r\n /** Used to lookup unminified function names. */\r\n var realNames = {};\r\n\r\n /** Used to detect maps, sets, and weakmaps. */\r\n var dataViewCtorString = toSource(DataView),\r\n mapCtorString = toSource(Map),\r\n promiseCtorString = toSource(Promise),\r\n setCtorString = toSource(Set),\r\n weakMapCtorString = toSource(WeakMap);\r\n\r\n /** Used to convert symbols to primitives and strings. */\r\n var symbolProto = Symbol ? Symbol.prototype : undefined,\r\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\r\n symbolToString = symbolProto ? symbolProto.toString : undefined;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a `lodash` object which wraps `value` to enable implicit method\r\n * chain sequences. Methods that operate on and return arrays, collections,\r\n * and functions can be chained together. Methods that retrieve a single value\r\n * or may return a primitive value will automatically end the chain sequence\r\n * and return the unwrapped value. Otherwise, the value must be unwrapped\r\n * with `_#value`.\r\n *\r\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\r\n * enabled using `_.chain`.\r\n *\r\n * The execution of chained methods is lazy, that is, it's deferred until\r\n * `_#value` is implicitly or explicitly called.\r\n *\r\n * Lazy evaluation allows several methods to support shortcut fusion.\r\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\r\n * the creation of intermediate arrays and can greatly reduce the number of\r\n * iteratee executions. Sections of a chain sequence qualify for shortcut\r\n * fusion if the section is applied to an array and iteratees accept only\r\n * one argument. The heuristic for whether a section qualifies for shortcut\r\n * fusion is subject to change.\r\n *\r\n * Chaining is supported in custom builds as long as the `_#value` method is\r\n * directly or indirectly included in the build.\r\n *\r\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\r\n *\r\n * The wrapper `Array` methods are:\r\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\r\n *\r\n * The wrapper `String` methods are:\r\n * `replace` and `split`\r\n *\r\n * The wrapper methods that support shortcut fusion are:\r\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\r\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\r\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\r\n *\r\n * The chainable wrapper methods are:\r\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\r\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\r\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\r\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\r\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\r\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\r\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\r\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\r\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\r\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\r\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\r\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\r\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\r\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\r\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\r\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\r\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\r\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\r\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\r\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\r\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\r\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\r\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\r\n * `zipObject`, `zipObjectDeep`, and `zipWith`\r\n *\r\n * The wrapper methods that are **not** chainable by default are:\r\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\r\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\r\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\r\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\r\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\r\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\r\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\r\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\r\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\r\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\r\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\r\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\r\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\r\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\r\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\r\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\r\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\r\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\r\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\r\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\r\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\r\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\r\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\r\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\r\n * `upperFirst`, `value`, and `words`\r\n *\r\n * @name _\r\n * @constructor\r\n * @category Seq\r\n * @param {*} value The value to wrap in a `lodash` instance.\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * function square(n) {\r\n * return n * n;\r\n * }\r\n *\r\n * var wrapped = _([1, 2, 3]);\r\n *\r\n * // Returns an unwrapped value.\r\n * wrapped.reduce(_.add);\r\n * // => 6\r\n *\r\n * // Returns a wrapped value.\r\n * var squares = wrapped.map(square);\r\n *\r\n * _.isArray(squares);\r\n * // => false\r\n *\r\n * _.isArray(squares.value());\r\n * // => true\r\n */\r\n function lodash(value) {\r\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\r\n if (value instanceof LodashWrapper) {\r\n return value;\r\n }\r\n if (hasOwnProperty.call(value, '__wrapped__')) {\r\n return wrapperClone(value);\r\n }\r\n }\r\n return new LodashWrapper(value);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.create` without support for assigning\r\n * properties to the created object.\r\n *\r\n * @private\r\n * @param {Object} proto The object to inherit from.\r\n * @returns {Object} Returns the new object.\r\n */\r\n var baseCreate = (function() {\r\n function object() {}\r\n return function(proto) {\r\n if (!isObject(proto)) {\r\n return {};\r\n }\r\n if (objectCreate) {\r\n return objectCreate(proto);\r\n }\r\n object.prototype = proto;\r\n var result = new object;\r\n object.prototype = undefined;\r\n return result;\r\n };\r\n }());\r\n\r\n /**\r\n * The function whose prototype chain sequence wrappers inherit from.\r\n *\r\n * @private\r\n */\r\n function baseLodash() {\r\n // No operation performed.\r\n }\r\n\r\n /**\r\n * The base constructor for creating `lodash` wrapper objects.\r\n *\r\n * @private\r\n * @param {*} value The value to wrap.\r\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\r\n */\r\n function LodashWrapper(value, chainAll) {\r\n this.__wrapped__ = value;\r\n this.__actions__ = [];\r\n this.__chain__ = !!chainAll;\r\n this.__index__ = 0;\r\n this.__values__ = undefined;\r\n }\r\n\r\n /**\r\n * By default, the template delimiters used by lodash are like those in\r\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\r\n * following template settings to use alternative delimiters.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type {Object}\r\n */\r\n lodash.templateSettings = {\r\n\r\n /**\r\n * Used to detect `data` property values to be HTML-escaped.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type {RegExp}\r\n */\r\n 'escape': reEscape,\r\n\r\n /**\r\n * Used to detect code to be evaluated.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type {RegExp}\r\n */\r\n 'evaluate': reEvaluate,\r\n\r\n /**\r\n * Used to detect `data` property values to inject.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type {RegExp}\r\n */\r\n 'interpolate': reInterpolate,\r\n\r\n /**\r\n * Used to reference the data object in the template text.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type {string}\r\n */\r\n 'variable': '',\r\n\r\n /**\r\n * Used to import variables into the compiled template.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type {Object}\r\n */\r\n 'imports': {\r\n\r\n /**\r\n * A reference to the `lodash` function.\r\n *\r\n * @memberOf _.templateSettings.imports\r\n * @type {Function}\r\n */\r\n '_': lodash\r\n }\r\n };\r\n\r\n // Ensure wrappers are instances of `baseLodash`.\r\n lodash.prototype = baseLodash.prototype;\r\n lodash.prototype.constructor = lodash;\r\n\r\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\r\n LodashWrapper.prototype.constructor = LodashWrapper;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {*} value The value to wrap.\r\n */\r\n function LazyWrapper(value) {\r\n this.__wrapped__ = value;\r\n this.__actions__ = [];\r\n this.__dir__ = 1;\r\n this.__filtered__ = false;\r\n this.__iteratees__ = [];\r\n this.__takeCount__ = MAX_ARRAY_LENGTH;\r\n this.__views__ = [];\r\n }\r\n\r\n /**\r\n * Creates a clone of the lazy wrapper object.\r\n *\r\n * @private\r\n * @name clone\r\n * @memberOf LazyWrapper\r\n * @returns {Object} Returns the cloned `LazyWrapper` object.\r\n */\r\n function lazyClone() {\r\n var result = new LazyWrapper(this.__wrapped__);\r\n result.__actions__ = copyArray(this.__actions__);\r\n result.__dir__ = this.__dir__;\r\n result.__filtered__ = this.__filtered__;\r\n result.__iteratees__ = copyArray(this.__iteratees__);\r\n result.__takeCount__ = this.__takeCount__;\r\n result.__views__ = copyArray(this.__views__);\r\n return result;\r\n }\r\n\r\n /**\r\n * Reverses the direction of lazy iteration.\r\n *\r\n * @private\r\n * @name reverse\r\n * @memberOf LazyWrapper\r\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\r\n */\r\n function lazyReverse() {\r\n if (this.__filtered__) {\r\n var result = new LazyWrapper(this);\r\n result.__dir__ = -1;\r\n result.__filtered__ = true;\r\n } else {\r\n result = this.clone();\r\n result.__dir__ *= -1;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Extracts the unwrapped value from its lazy wrapper.\r\n *\r\n * @private\r\n * @name value\r\n * @memberOf LazyWrapper\r\n * @returns {*} Returns the unwrapped value.\r\n */\r\n function lazyValue() {\r\n var array = this.__wrapped__.value(),\r\n dir = this.__dir__,\r\n isArr = isArray(array),\r\n isRight = dir < 0,\r\n arrLength = isArr ? array.length : 0,\r\n view = getView(0, arrLength, this.__views__),\r\n start = view.start,\r\n end = view.end,\r\n length = end - start,\r\n index = isRight ? end : (start - 1),\r\n iteratees = this.__iteratees__,\r\n iterLength = iteratees.length,\r\n resIndex = 0,\r\n takeCount = nativeMin(length, this.__takeCount__);\r\n\r\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\r\n return baseWrapperValue(array, this.__actions__);\r\n }\r\n var result = [];\r\n\r\n outer:\r\n while (length-- && resIndex < takeCount) {\r\n index += dir;\r\n\r\n var iterIndex = -1,\r\n value = array[index];\r\n\r\n while (++iterIndex < iterLength) {\r\n var data = iteratees[iterIndex],\r\n iteratee = data.iteratee,\r\n type = data.type,\r\n computed = iteratee(value);\r\n\r\n if (type == LAZY_MAP_FLAG) {\r\n value = computed;\r\n } else if (!computed) {\r\n if (type == LAZY_FILTER_FLAG) {\r\n continue outer;\r\n } else {\r\n break outer;\r\n }\r\n }\r\n }\r\n result[resIndex++] = value;\r\n }\r\n return result;\r\n }\r\n\r\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\r\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\r\n LazyWrapper.prototype.constructor = LazyWrapper;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a hash object.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\n function Hash(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (++index < length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all key-value entries from the hash.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf Hash\r\n */\r\n function hashClear() {\r\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\r\n this.size = 0;\r\n }\r\n\r\n /**\r\n * Removes `key` and its value from the hash.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf Hash\r\n * @param {Object} hash The hash to modify.\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\r\n */\r\n function hashDelete(key) {\r\n var result = this.has(key) && delete this.__data__[key];\r\n this.size -= result ? 1 : 0;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the hash value for `key`.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf Hash\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\n function hashGet(key) {\r\n var data = this.__data__;\r\n if (nativeCreate) {\r\n var result = data[key];\r\n return result === HASH_UNDEFINED ? undefined : result;\r\n }\r\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\r\n }\r\n\r\n /**\r\n * Checks if a hash value for `key` exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf Hash\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\r\n */\r\n function hashHas(key) {\r\n var data = this.__data__;\r\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\r\n }\r\n\r\n /**\r\n * Sets the hash `key` to `value`.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf Hash\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the hash instance.\r\n */\r\n function hashSet(key, value) {\r\n var data = this.__data__;\r\n this.size += this.has(key) ? 0 : 1;\r\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\r\n return this;\r\n }\r\n\r\n // Add methods to `Hash`.\r\n Hash.prototype.clear = hashClear;\r\n Hash.prototype['delete'] = hashDelete;\r\n Hash.prototype.get = hashGet;\r\n Hash.prototype.has = hashHas;\r\n Hash.prototype.set = hashSet;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an list cache object.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\n function ListCache(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (++index < length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all key-value entries from the list cache.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf ListCache\r\n */\r\n function listCacheClear() {\r\n this.__data__ = [];\r\n this.size = 0;\r\n }\r\n\r\n /**\r\n * Removes `key` and its value from the list cache.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\r\n */\r\n function listCacheDelete(key) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n if (index < 0) {\r\n return false;\r\n }\r\n var lastIndex = data.length - 1;\r\n if (index == lastIndex) {\r\n data.pop();\r\n } else {\r\n splice.call(data, index, 1);\r\n }\r\n --this.size;\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the list cache value for `key`.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\n function listCacheGet(key) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n return index < 0 ? undefined : data[index][1];\r\n }\r\n\r\n /**\r\n * Checks if a list cache value for `key` exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf ListCache\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\r\n */\r\n function listCacheHas(key) {\r\n return assocIndexOf(this.__data__, key) > -1;\r\n }\r\n\r\n /**\r\n * Sets the list cache `key` to `value`.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the list cache instance.\r\n */\r\n function listCacheSet(key, value) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n if (index < 0) {\r\n ++this.size;\r\n data.push([key, value]);\r\n } else {\r\n data[index][1] = value;\r\n }\r\n return this;\r\n }\r\n\r\n // Add methods to `ListCache`.\r\n ListCache.prototype.clear = listCacheClear;\r\n ListCache.prototype['delete'] = listCacheDelete;\r\n ListCache.prototype.get = listCacheGet;\r\n ListCache.prototype.has = listCacheHas;\r\n ListCache.prototype.set = listCacheSet;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a map cache object to store key-value pairs.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\n function MapCache(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (++index < length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all key-value entries from the map.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf MapCache\r\n */\r\n function mapCacheClear() {\r\n this.size = 0;\r\n this.__data__ = {\r\n 'hash': new Hash,\r\n 'map': new (Map || ListCache),\r\n 'string': new Hash\r\n };\r\n }\r\n\r\n /**\r\n * Removes `key` and its value from the map.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\r\n */\r\n function mapCacheDelete(key) {\r\n var result = getMapData(this, key)['delete'](key);\r\n this.size -= result ? 1 : 0;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the map value for `key`.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\n function mapCacheGet(key) {\r\n return getMapData(this, key).get(key);\r\n }\r\n\r\n /**\r\n * Checks if a map value for `key` exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf MapCache\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\r\n */\r\n function mapCacheHas(key) {\r\n return getMapData(this, key).has(key);\r\n }\r\n\r\n /**\r\n * Sets the map `key` to `value`.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the map cache instance.\r\n */\r\n function mapCacheSet(key, value) {\r\n var data = getMapData(this, key),\r\n size = data.size;\r\n\r\n data.set(key, value);\r\n this.size += data.size == size ? 0 : 1;\r\n return this;\r\n }\r\n\r\n // Add methods to `MapCache`.\r\n MapCache.prototype.clear = mapCacheClear;\r\n MapCache.prototype['delete'] = mapCacheDelete;\r\n MapCache.prototype.get = mapCacheGet;\r\n MapCache.prototype.has = mapCacheHas;\r\n MapCache.prototype.set = mapCacheSet;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n *\r\n * Creates an array cache object to store unique values.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [values] The values to cache.\r\n */\r\n function SetCache(values) {\r\n var index = -1,\r\n length = values == null ? 0 : values.length;\r\n\r\n this.__data__ = new MapCache;\r\n while (++index < length) {\r\n this.add(values[index]);\r\n }\r\n }\r\n\r\n /**\r\n * Adds `value` to the array cache.\r\n *\r\n * @private\r\n * @name add\r\n * @memberOf SetCache\r\n * @alias push\r\n * @param {*} value The value to cache.\r\n * @returns {Object} Returns the cache instance.\r\n */\r\n function setCacheAdd(value) {\r\n this.__data__.set(value, HASH_UNDEFINED);\r\n return this;\r\n }\r\n\r\n /**\r\n * Checks if `value` is in the array cache.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf SetCache\r\n * @param {*} value The value to search for.\r\n * @returns {number} Returns `true` if `value` is found, else `false`.\r\n */\r\n function setCacheHas(value) {\r\n return this.__data__.has(value);\r\n }\r\n\r\n // Add methods to `SetCache`.\r\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\r\n SetCache.prototype.has = setCacheHas;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a stack cache object to store key-value pairs.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\n function Stack(entries) {\r\n var data = this.__data__ = new ListCache(entries);\r\n this.size = data.size;\r\n }\r\n\r\n /**\r\n * Removes all key-value entries from the stack.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf Stack\r\n */\r\n function stackClear() {\r\n this.__data__ = new ListCache;\r\n this.size = 0;\r\n }\r\n\r\n /**\r\n * Removes `key` and its value from the stack.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\r\n */\r\n function stackDelete(key) {\r\n var data = this.__data__,\r\n result = data['delete'](key);\r\n\r\n this.size = data.size;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the stack value for `key`.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\n function stackGet(key) {\r\n return this.__data__.get(key);\r\n }\r\n\r\n /**\r\n * Checks if a stack value for `key` exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf Stack\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\r\n */\r\n function stackHas(key) {\r\n return this.__data__.has(key);\r\n }\r\n\r\n /**\r\n * Sets the stack `key` to `value`.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the stack cache instance.\r\n */\r\n function stackSet(key, value) {\r\n var data = this.__data__;\r\n if (data instanceof ListCache) {\r\n var pairs = data.__data__;\r\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\r\n pairs.push([key, value]);\r\n this.size = ++data.size;\r\n return this;\r\n }\r\n data = this.__data__ = new MapCache(pairs);\r\n }\r\n data.set(key, value);\r\n this.size = data.size;\r\n return this;\r\n }\r\n\r\n // Add methods to `Stack`.\r\n Stack.prototype.clear = stackClear;\r\n Stack.prototype['delete'] = stackDelete;\r\n Stack.prototype.get = stackGet;\r\n Stack.prototype.has = stackHas;\r\n Stack.prototype.set = stackSet;\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an array of the enumerable property names of the array-like `value`.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @param {boolean} inherited Specify returning inherited property names.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function arrayLikeKeys(value, inherited) {\r\n var isArr = isArray(value),\r\n isArg = !isArr && isArguments(value),\r\n isBuff = !isArr && !isArg && isBuffer(value),\r\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\r\n skipIndexes = isArr || isArg || isBuff || isType,\r\n result = skipIndexes ? baseTimes(value.length, String) : [],\r\n length = result.length;\r\n\r\n for (var key in value) {\r\n if ((inherited || hasOwnProperty.call(value, key)) &&\r\n !(skipIndexes && (\r\n // Safari 9 has enumerable `arguments.length` in strict mode.\r\n key == 'length' ||\r\n // Node.js 0.10 has enumerable non-index properties on buffers.\r\n (isBuff && (key == 'offset' || key == 'parent')) ||\r\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\r\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\r\n // Skip index properties.\r\n isIndex(key, length)\r\n ))) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.sample` for arrays.\r\n *\r\n * @private\r\n * @param {Array} array The array to sample.\r\n * @returns {*} Returns the random element.\r\n */\r\n function arraySample(array) {\r\n var length = array.length;\r\n return length ? array[baseRandom(0, length - 1)] : undefined;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.sampleSize` for arrays.\r\n *\r\n * @private\r\n * @param {Array} array The array to sample.\r\n * @param {number} n The number of elements to sample.\r\n * @returns {Array} Returns the random elements.\r\n */\r\n function arraySampleSize(array, n) {\r\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\r\n }\r\n\r\n /**\r\n * A specialized version of `_.shuffle` for arrays.\r\n *\r\n * @private\r\n * @param {Array} array The array to shuffle.\r\n * @returns {Array} Returns the new shuffled array.\r\n */\r\n function arrayShuffle(array) {\r\n return shuffleSelf(copyArray(array));\r\n }\r\n\r\n /**\r\n * This function is like `assignValue` except that it doesn't assign\r\n * `undefined` values.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {string} key The key of the property to assign.\r\n * @param {*} value The value to assign.\r\n */\r\n function assignMergeValue(object, key, value) {\r\n if ((value !== undefined && !eq(object[key], value)) ||\r\n (value === undefined && !(key in object))) {\r\n baseAssignValue(object, key, value);\r\n }\r\n }\r\n\r\n /**\r\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\r\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {string} key The key of the property to assign.\r\n * @param {*} value The value to assign.\r\n */\r\n function assignValue(object, key, value) {\r\n var objValue = object[key];\r\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\r\n (value === undefined && !(key in object))) {\r\n baseAssignValue(object, key, value);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the index at which the `key` is found in `array` of key-value pairs.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} key The key to search for.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function assocIndexOf(array, key) {\r\n var length = array.length;\r\n while (length--) {\r\n if (eq(array[length][0], key)) {\r\n return length;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Aggregates elements of `collection` on `accumulator` with keys transformed\r\n * by `iteratee` and values set by `setter`.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} setter The function to set `accumulator` values.\r\n * @param {Function} iteratee The iteratee to transform keys.\r\n * @param {Object} accumulator The initial aggregated object.\r\n * @returns {Function} Returns `accumulator`.\r\n */\r\n function baseAggregator(collection, setter, iteratee, accumulator) {\r\n baseEach(collection, function(value, key, collection) {\r\n setter(accumulator, value, iteratee(value), collection);\r\n });\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.assign` without support for multiple sources\r\n * or `customizer` functions.\r\n *\r\n * @private\r\n * @param {Object} object The destination object.\r\n * @param {Object} source The source object.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseAssign(object, source) {\r\n return object && copyObject(source, keys(source), object);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.assignIn` without support for multiple sources\r\n * or `customizer` functions.\r\n *\r\n * @private\r\n * @param {Object} object The destination object.\r\n * @param {Object} source The source object.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseAssignIn(object, source) {\r\n return object && copyObject(source, keysIn(source), object);\r\n }\r\n\r\n /**\r\n * The base implementation of `assignValue` and `assignMergeValue` without\r\n * value checks.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {string} key The key of the property to assign.\r\n * @param {*} value The value to assign.\r\n */\r\n function baseAssignValue(object, key, value) {\r\n if (key == '__proto__' && defineProperty) {\r\n defineProperty(object, key, {\r\n 'configurable': true,\r\n 'enumerable': true,\r\n 'value': value,\r\n 'writable': true\r\n });\r\n } else {\r\n object[key] = value;\r\n }\r\n }\r\n\r\n /**\r\n * The base implementation of `_.at` without support for individual paths.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {string[]} paths The property paths to pick.\r\n * @returns {Array} Returns the picked elements.\r\n */\r\n function baseAt(object, paths) {\r\n var index = -1,\r\n length = paths.length,\r\n result = Array(length),\r\n skip = object == null;\r\n\r\n while (++index < length) {\r\n result[index] = skip ? undefined : get(object, paths[index]);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.clamp` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {number} number The number to clamp.\r\n * @param {number} [lower] The lower bound.\r\n * @param {number} upper The upper bound.\r\n * @returns {number} Returns the clamped number.\r\n */\r\n function baseClamp(number, lower, upper) {\r\n if (number === number) {\r\n if (upper !== undefined) {\r\n number = number <= upper ? number : upper;\r\n }\r\n if (lower !== undefined) {\r\n number = number >= lower ? number : lower;\r\n }\r\n }\r\n return number;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\r\n * traversed objects.\r\n *\r\n * @private\r\n * @param {*} value The value to clone.\r\n * @param {boolean} bitmask The bitmask flags.\r\n * 1 - Deep clone\r\n * 2 - Flatten inherited properties\r\n * 4 - Clone symbols\r\n * @param {Function} [customizer] The function to customize cloning.\r\n * @param {string} [key] The key of `value`.\r\n * @param {Object} [object] The parent object of `value`.\r\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\r\n * @returns {*} Returns the cloned value.\r\n */\r\n function baseClone(value, bitmask, customizer, key, object, stack) {\r\n var result,\r\n isDeep = bitmask & CLONE_DEEP_FLAG,\r\n isFlat = bitmask & CLONE_FLAT_FLAG,\r\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\r\n\r\n if (customizer) {\r\n result = object ? customizer(value, key, object, stack) : customizer(value);\r\n }\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n if (!isObject(value)) {\r\n return value;\r\n }\r\n var isArr = isArray(value);\r\n if (isArr) {\r\n result = initCloneArray(value);\r\n if (!isDeep) {\r\n return copyArray(value, result);\r\n }\r\n } else {\r\n var tag = getTag(value),\r\n isFunc = tag == funcTag || tag == genTag;\r\n\r\n if (isBuffer(value)) {\r\n return cloneBuffer(value, isDeep);\r\n }\r\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\r\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\r\n if (!isDeep) {\r\n return isFlat\r\n ? copySymbolsIn(value, baseAssignIn(result, value))\r\n : copySymbols(value, baseAssign(result, value));\r\n }\r\n } else {\r\n if (!cloneableTags[tag]) {\r\n return object ? value : {};\r\n }\r\n result = initCloneByTag(value, tag, isDeep);\r\n }\r\n }\r\n // Check for circular references and return its corresponding clone.\r\n stack || (stack = new Stack);\r\n var stacked = stack.get(value);\r\n if (stacked) {\r\n return stacked;\r\n }\r\n stack.set(value, result);\r\n\r\n if (isSet(value)) {\r\n value.forEach(function(subValue) {\r\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\r\n });\r\n } else if (isMap(value)) {\r\n value.forEach(function(subValue, key) {\r\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\r\n });\r\n }\r\n\r\n var keysFunc = isFull\r\n ? (isFlat ? getAllKeysIn : getAllKeys)\r\n : (isFlat ? keysIn : keys);\r\n\r\n var props = isArr ? undefined : keysFunc(value);\r\n arrayEach(props || value, function(subValue, key) {\r\n if (props) {\r\n key = subValue;\r\n subValue = value[key];\r\n }\r\n // Recursively populate clone (susceptible to call stack limits).\r\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.conforms` which doesn't clone `source`.\r\n *\r\n * @private\r\n * @param {Object} source The object of property predicates to conform to.\r\n * @returns {Function} Returns the new spec function.\r\n */\r\n function baseConforms(source) {\r\n var props = keys(source);\r\n return function(object) {\r\n return baseConformsTo(object, source, props);\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.conformsTo` which accepts `props` to check.\r\n *\r\n * @private\r\n * @param {Object} object The object to inspect.\r\n * @param {Object} source The object of property predicates to conform to.\r\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\r\n */\r\n function baseConformsTo(object, source, props) {\r\n var length = props.length;\r\n if (object == null) {\r\n return !length;\r\n }\r\n object = Object(object);\r\n while (length--) {\r\n var key = props[length],\r\n predicate = source[key],\r\n value = object[key];\r\n\r\n if ((value === undefined && !(key in object)) || !predicate(value)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\r\n * to provide to `func`.\r\n *\r\n * @private\r\n * @param {Function} func The function to delay.\r\n * @param {number} wait The number of milliseconds to delay invocation.\r\n * @param {Array} args The arguments to provide to `func`.\r\n * @returns {number|Object} Returns the timer id or timeout object.\r\n */\r\n function baseDelay(func, wait, args) {\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.difference` without support\r\n * for excluding multiple arrays or iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {Array} values The values to exclude.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of filtered values.\r\n */\r\n function baseDifference(array, values, iteratee, comparator) {\r\n var index = -1,\r\n includes = arrayIncludes,\r\n isCommon = true,\r\n length = array.length,\r\n result = [],\r\n valuesLength = values.length;\r\n\r\n if (!length) {\r\n return result;\r\n }\r\n if (iteratee) {\r\n values = arrayMap(values, baseUnary(iteratee));\r\n }\r\n if (comparator) {\r\n includes = arrayIncludesWith;\r\n isCommon = false;\r\n }\r\n else if (values.length >= LARGE_ARRAY_SIZE) {\r\n includes = cacheHas;\r\n isCommon = false;\r\n values = new SetCache(values);\r\n }\r\n outer:\r\n while (++index < length) {\r\n var value = array[index],\r\n computed = iteratee == null ? value : iteratee(value);\r\n\r\n value = (comparator || value !== 0) ? value : 0;\r\n if (isCommon && computed === computed) {\r\n var valuesIndex = valuesLength;\r\n while (valuesIndex--) {\r\n if (values[valuesIndex] === computed) {\r\n continue outer;\r\n }\r\n }\r\n result.push(value);\r\n }\r\n else if (!includes(values, computed, comparator)) {\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.forEach` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array|Object} Returns `collection`.\r\n */\r\n var baseEach = createBaseEach(baseForOwn);\r\n\r\n /**\r\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array|Object} Returns `collection`.\r\n */\r\n var baseEachRight = createBaseEach(baseForOwnRight, true);\r\n\r\n /**\r\n * The base implementation of `_.every` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\r\n * else `false`\r\n */\r\n function baseEvery(collection, predicate) {\r\n var result = true;\r\n baseEach(collection, function(value, index, collection) {\r\n result = !!predicate(value, index, collection);\r\n return result;\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.max` and `_.min` which accepts a\r\n * `comparator` to determine the extremum value.\r\n *\r\n * @private\r\n * @param {Array} array The array to iterate over.\r\n * @param {Function} iteratee The iteratee invoked per iteration.\r\n * @param {Function} comparator The comparator used to compare values.\r\n * @returns {*} Returns the extremum value.\r\n */\r\n function baseExtremum(array, iteratee, comparator) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n var value = array[index],\r\n current = iteratee(value);\r\n\r\n if (current != null && (computed === undefined\r\n ? (current === current && !isSymbol(current))\r\n : comparator(current, computed)\r\n )) {\r\n var computed = current,\r\n result = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.fill` without an iteratee call guard.\r\n *\r\n * @private\r\n * @param {Array} array The array to fill.\r\n * @param {*} value The value to fill `array` with.\r\n * @param {number} [start=0] The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function baseFill(array, value, start, end) {\r\n var length = array.length;\r\n\r\n start = toInteger(start);\r\n if (start < 0) {\r\n start = -start > length ? 0 : (length + start);\r\n }\r\n end = (end === undefined || end > length) ? length : toInteger(end);\r\n if (end < 0) {\r\n end += length;\r\n }\r\n end = start > end ? 0 : toLength(end);\r\n while (start < end) {\r\n array[start++] = value;\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.filter` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {Array} Returns the new filtered array.\r\n */\r\n function baseFilter(collection, predicate) {\r\n var result = [];\r\n baseEach(collection, function(value, index, collection) {\r\n if (predicate(value, index, collection)) {\r\n result.push(value);\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.flatten` with support for restricting flattening.\r\n *\r\n * @private\r\n * @param {Array} array The array to flatten.\r\n * @param {number} depth The maximum recursion depth.\r\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\r\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\r\n * @param {Array} [result=[]] The initial result value.\r\n * @returns {Array} Returns the new flattened array.\r\n */\r\n function baseFlatten(array, depth, predicate, isStrict, result) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n predicate || (predicate = isFlattenable);\r\n result || (result = []);\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (depth > 0 && predicate(value)) {\r\n if (depth > 1) {\r\n // Recursively flatten arrays (susceptible to call stack limits).\r\n baseFlatten(value, depth - 1, predicate, isStrict, result);\r\n } else {\r\n arrayPush(result, value);\r\n }\r\n } else if (!isStrict) {\r\n result[result.length] = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `baseForOwn` which iterates over `object`\r\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\r\n * Iteratee functions may exit iteration early by explicitly returning `false`.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {Function} keysFunc The function to get the keys of `object`.\r\n * @returns {Object} Returns `object`.\r\n */\r\n var baseFor = createBaseFor();\r\n\r\n /**\r\n * This function is like `baseFor` except that it iterates over properties\r\n * in the opposite order.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {Function} keysFunc The function to get the keys of `object`.\r\n * @returns {Object} Returns `object`.\r\n */\r\n var baseForRight = createBaseFor(true);\r\n\r\n /**\r\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseForOwn(object, iteratee) {\r\n return object && baseFor(object, iteratee, keys);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseForOwnRight(object, iteratee) {\r\n return object && baseForRight(object, iteratee, keys);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.functions` which creates an array of\r\n * `object` function property names filtered from `props`.\r\n *\r\n * @private\r\n * @param {Object} object The object to inspect.\r\n * @param {Array} props The property names to filter.\r\n * @returns {Array} Returns the function names.\r\n */\r\n function baseFunctions(object, props) {\r\n return arrayFilter(props, function(key) {\r\n return isFunction(object[key]);\r\n });\r\n }\r\n\r\n /**\r\n * The base implementation of `_.get` without support for default values.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path of the property to get.\r\n * @returns {*} Returns the resolved value.\r\n */\r\n function baseGet(object, path) {\r\n path = castPath(path, object);\r\n\r\n var index = 0,\r\n length = path.length;\r\n\r\n while (object != null && index < length) {\r\n object = object[toKey(path[index++])];\r\n }\r\n return (index && index == length) ? object : undefined;\r\n }\r\n\r\n /**\r\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\r\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\r\n * symbols of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Function} keysFunc The function to get the keys of `object`.\r\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\r\n * @returns {Array} Returns the array of property names and symbols.\r\n */\r\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\r\n var result = keysFunc(object);\r\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\r\n }\r\n\r\n /**\r\n * The base implementation of `getTag` without fallbacks for buggy environments.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the `toStringTag`.\r\n */\r\n function baseGetTag(value) {\r\n if (value == null) {\r\n return value === undefined ? undefinedTag : nullTag;\r\n }\r\n return (symToStringTag && symToStringTag in Object(value))\r\n ? getRawTag(value)\r\n : objectToString(value);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.gt` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\r\n * else `false`.\r\n */\r\n function baseGt(value, other) {\r\n return value > other;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.has` without support for deep paths.\r\n *\r\n * @private\r\n * @param {Object} [object] The object to query.\r\n * @param {Array|string} key The key to check.\r\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\r\n */\r\n function baseHas(object, key) {\r\n return object != null && hasOwnProperty.call(object, key);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.hasIn` without support for deep paths.\r\n *\r\n * @private\r\n * @param {Object} [object] The object to query.\r\n * @param {Array|string} key The key to check.\r\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\r\n */\r\n function baseHasIn(object, key) {\r\n return object != null && key in Object(object);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.inRange` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {number} number The number to check.\r\n * @param {number} start The start of the range.\r\n * @param {number} end The end of the range.\r\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\r\n */\r\n function baseInRange(number, start, end) {\r\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.intersection`, without support\r\n * for iteratee shorthands, that accepts an array of arrays to inspect.\r\n *\r\n * @private\r\n * @param {Array} arrays The arrays to inspect.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of shared values.\r\n */\r\n function baseIntersection(arrays, iteratee, comparator) {\r\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\r\n length = arrays[0].length,\r\n othLength = arrays.length,\r\n othIndex = othLength,\r\n caches = Array(othLength),\r\n maxLength = Infinity,\r\n result = [];\r\n\r\n while (othIndex--) {\r\n var array = arrays[othIndex];\r\n if (othIndex && iteratee) {\r\n array = arrayMap(array, baseUnary(iteratee));\r\n }\r\n maxLength = nativeMin(array.length, maxLength);\r\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\r\n ? new SetCache(othIndex && array)\r\n : undefined;\r\n }\r\n array = arrays[0];\r\n\r\n var index = -1,\r\n seen = caches[0];\r\n\r\n outer:\r\n while (++index < length && result.length < maxLength) {\r\n var value = array[index],\r\n computed = iteratee ? iteratee(value) : value;\r\n\r\n value = (comparator || value !== 0) ? value : 0;\r\n if (!(seen\r\n ? cacheHas(seen, computed)\r\n : includes(result, computed, comparator)\r\n )) {\r\n othIndex = othLength;\r\n while (--othIndex) {\r\n var cache = caches[othIndex];\r\n if (!(cache\r\n ? cacheHas(cache, computed)\r\n : includes(arrays[othIndex], computed, comparator))\r\n ) {\r\n continue outer;\r\n }\r\n }\r\n if (seen) {\r\n seen.push(computed);\r\n }\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.invert` and `_.invertBy` which inverts\r\n * `object` with values transformed by `iteratee` and set by `setter`.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} setter The function to set `accumulator` values.\r\n * @param {Function} iteratee The iteratee to transform values.\r\n * @param {Object} accumulator The initial inverted object.\r\n * @returns {Function} Returns `accumulator`.\r\n */\r\n function baseInverter(object, setter, iteratee, accumulator) {\r\n baseForOwn(object, function(value, key, object) {\r\n setter(accumulator, iteratee(value), key, object);\r\n });\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.invoke` without support for individual\r\n * method arguments.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path of the method to invoke.\r\n * @param {Array} args The arguments to invoke the method with.\r\n * @returns {*} Returns the result of the invoked method.\r\n */\r\n function baseInvoke(object, path, args) {\r\n path = castPath(path, object);\r\n object = parent(object, path);\r\n var func = object == null ? object : object[toKey(last(path))];\r\n return func == null ? undefined : apply(func, object, args);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isArguments`.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\r\n */\r\n function baseIsArguments(value) {\r\n return isObjectLike(value) && baseGetTag(value) == argsTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\r\n */\r\n function baseIsArrayBuffer(value) {\r\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isDate` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\r\n */\r\n function baseIsDate(value) {\r\n return isObjectLike(value) && baseGetTag(value) == dateTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isEqual` which supports partial comparisons\r\n * and tracks traversed objects.\r\n *\r\n * @private\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @param {boolean} bitmask The bitmask flags.\r\n * 1 - Unordered comparison\r\n * 2 - Partial comparison\r\n * @param {Function} [customizer] The function to customize comparisons.\r\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n */\r\n function baseIsEqual(value, other, bitmask, customizer, stack) {\r\n if (value === other) {\r\n return true;\r\n }\r\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\r\n return value !== value && other !== other;\r\n }\r\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\r\n }\r\n\r\n /**\r\n * A specialized version of `baseIsEqual` for arrays and objects which performs\r\n * deep comparisons and tracks traversed objects enabling objects with circular\r\n * references to be compared.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\r\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\r\n */\r\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\r\n var objIsArr = isArray(object),\r\n othIsArr = isArray(other),\r\n objTag = objIsArr ? arrayTag : getTag(object),\r\n othTag = othIsArr ? arrayTag : getTag(other);\r\n\r\n objTag = objTag == argsTag ? objectTag : objTag;\r\n othTag = othTag == argsTag ? objectTag : othTag;\r\n\r\n var objIsObj = objTag == objectTag,\r\n othIsObj = othTag == objectTag,\r\n isSameTag = objTag == othTag;\r\n\r\n if (isSameTag && isBuffer(object)) {\r\n if (!isBuffer(other)) {\r\n return false;\r\n }\r\n objIsArr = true;\r\n objIsObj = false;\r\n }\r\n if (isSameTag && !objIsObj) {\r\n stack || (stack = new Stack);\r\n return (objIsArr || isTypedArray(object))\r\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\r\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\r\n }\r\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\r\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\r\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\r\n\r\n if (objIsWrapped || othIsWrapped) {\r\n var objUnwrapped = objIsWrapped ? object.value() : object,\r\n othUnwrapped = othIsWrapped ? other.value() : other;\r\n\r\n stack || (stack = new Stack);\r\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\r\n }\r\n }\r\n if (!isSameTag) {\r\n return false;\r\n }\r\n stack || (stack = new Stack);\r\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isMap` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\r\n */\r\n function baseIsMap(value) {\r\n return isObjectLike(value) && getTag(value) == mapTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Object} object The object to inspect.\r\n * @param {Object} source The object of property values to match.\r\n * @param {Array} matchData The property names, values, and compare flags to match.\r\n * @param {Function} [customizer] The function to customize comparisons.\r\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\r\n */\r\n function baseIsMatch(object, source, matchData, customizer) {\r\n var index = matchData.length,\r\n length = index,\r\n noCustomizer = !customizer;\r\n\r\n if (object == null) {\r\n return !length;\r\n }\r\n object = Object(object);\r\n while (index--) {\r\n var data = matchData[index];\r\n if ((noCustomizer && data[2])\r\n ? data[1] !== object[data[0]]\r\n : !(data[0] in object)\r\n ) {\r\n return false;\r\n }\r\n }\r\n while (++index < length) {\r\n data = matchData[index];\r\n var key = data[0],\r\n objValue = object[key],\r\n srcValue = data[1];\r\n\r\n if (noCustomizer && data[2]) {\r\n if (objValue === undefined && !(key in object)) {\r\n return false;\r\n }\r\n } else {\r\n var stack = new Stack;\r\n if (customizer) {\r\n var result = customizer(objValue, srcValue, key, object, source, stack);\r\n }\r\n if (!(result === undefined\r\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\r\n : result\r\n )) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isNative` without bad shim checks.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a native function,\r\n * else `false`.\r\n */\r\n function baseIsNative(value) {\r\n if (!isObject(value) || isMasked(value)) {\r\n return false;\r\n }\r\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\r\n return pattern.test(toSource(value));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isRegExp` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\r\n */\r\n function baseIsRegExp(value) {\r\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isSet` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\r\n */\r\n function baseIsSet(value) {\r\n return isObjectLike(value) && getTag(value) == setTag;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\r\n */\r\n function baseIsTypedArray(value) {\r\n return isObjectLike(value) &&\r\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\r\n }\r\n\r\n /**\r\n * The base implementation of `_.iteratee`.\r\n *\r\n * @private\r\n * @param {*} [value=_.identity] The value to convert to an iteratee.\r\n * @returns {Function} Returns the iteratee.\r\n */\r\n function baseIteratee(value) {\r\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\r\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\r\n if (typeof value == 'function') {\r\n return value;\r\n }\r\n if (value == null) {\r\n return identity;\r\n }\r\n if (typeof value == 'object') {\r\n return isArray(value)\r\n ? baseMatchesProperty(value[0], value[1])\r\n : baseMatches(value);\r\n }\r\n return property(value);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function baseKeys(object) {\r\n if (!isPrototype(object)) {\r\n return nativeKeys(object);\r\n }\r\n var result = [];\r\n for (var key in Object(object)) {\r\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function baseKeysIn(object) {\r\n if (!isObject(object)) {\r\n return nativeKeysIn(object);\r\n }\r\n var isProto = isPrototype(object),\r\n result = [];\r\n\r\n for (var key in object) {\r\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.lt` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is less than `other`,\r\n * else `false`.\r\n */\r\n function baseLt(value, other) {\r\n return value < other;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.map` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the new mapped array.\r\n */\r\n function baseMap(collection, iteratee) {\r\n var index = -1,\r\n result = isArrayLike(collection) ? Array(collection.length) : [];\r\n\r\n baseEach(collection, function(value, key, collection) {\r\n result[++index] = iteratee(value, key, collection);\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.matches` which doesn't clone `source`.\r\n *\r\n * @private\r\n * @param {Object} source The object of property values to match.\r\n * @returns {Function} Returns the new spec function.\r\n */\r\n function baseMatches(source) {\r\n var matchData = getMatchData(source);\r\n if (matchData.length == 1 && matchData[0][2]) {\r\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\r\n }\r\n return function(object) {\r\n return object === source || baseIsMatch(object, source, matchData);\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\r\n *\r\n * @private\r\n * @param {string} path The path of the property to get.\r\n * @param {*} srcValue The value to match.\r\n * @returns {Function} Returns the new spec function.\r\n */\r\n function baseMatchesProperty(path, srcValue) {\r\n if (isKey(path) && isStrictComparable(srcValue)) {\r\n return matchesStrictComparable(toKey(path), srcValue);\r\n }\r\n return function(object) {\r\n var objValue = get(object, path);\r\n return (objValue === undefined && objValue === srcValue)\r\n ? hasIn(object, path)\r\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.merge` without support for multiple sources.\r\n *\r\n * @private\r\n * @param {Object} object The destination object.\r\n * @param {Object} source The source object.\r\n * @param {number} srcIndex The index of `source`.\r\n * @param {Function} [customizer] The function to customize merged values.\r\n * @param {Object} [stack] Tracks traversed source values and their merged\r\n * counterparts.\r\n */\r\n function baseMerge(object, source, srcIndex, customizer, stack) {\r\n if (object === source) {\r\n return;\r\n }\r\n baseFor(source, function(srcValue, key) {\r\n stack || (stack = new Stack);\r\n if (isObject(srcValue)) {\r\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\r\n }\r\n else {\r\n var newValue = customizer\r\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\r\n : undefined;\r\n\r\n if (newValue === undefined) {\r\n newValue = srcValue;\r\n }\r\n assignMergeValue(object, key, newValue);\r\n }\r\n }, keysIn);\r\n }\r\n\r\n /**\r\n * A specialized version of `baseMerge` for arrays and objects which performs\r\n * deep merges and tracks traversed objects enabling objects with circular\r\n * references to be merged.\r\n *\r\n * @private\r\n * @param {Object} object The destination object.\r\n * @param {Object} source The source object.\r\n * @param {string} key The key of the value to merge.\r\n * @param {number} srcIndex The index of `source`.\r\n * @param {Function} mergeFunc The function to merge values.\r\n * @param {Function} [customizer] The function to customize assigned values.\r\n * @param {Object} [stack] Tracks traversed source values and their merged\r\n * counterparts.\r\n */\r\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\r\n var objValue = safeGet(object, key),\r\n srcValue = safeGet(source, key),\r\n stacked = stack.get(srcValue);\r\n\r\n if (stacked) {\r\n assignMergeValue(object, key, stacked);\r\n return;\r\n }\r\n var newValue = customizer\r\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\r\n : undefined;\r\n\r\n var isCommon = newValue === undefined;\r\n\r\n if (isCommon) {\r\n var isArr = isArray(srcValue),\r\n isBuff = !isArr && isBuffer(srcValue),\r\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\r\n\r\n newValue = srcValue;\r\n if (isArr || isBuff || isTyped) {\r\n if (isArray(objValue)) {\r\n newValue = objValue;\r\n }\r\n else if (isArrayLikeObject(objValue)) {\r\n newValue = copyArray(objValue);\r\n }\r\n else if (isBuff) {\r\n isCommon = false;\r\n newValue = cloneBuffer(srcValue, true);\r\n }\r\n else if (isTyped) {\r\n isCommon = false;\r\n newValue = cloneTypedArray(srcValue, true);\r\n }\r\n else {\r\n newValue = [];\r\n }\r\n }\r\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\r\n newValue = objValue;\r\n if (isArguments(objValue)) {\r\n newValue = toPlainObject(objValue);\r\n }\r\n else if (!isObject(objValue) || isFunction(objValue)) {\r\n newValue = initCloneObject(srcValue);\r\n }\r\n }\r\n else {\r\n isCommon = false;\r\n }\r\n }\r\n if (isCommon) {\r\n // Recursively merge objects and arrays (susceptible to call stack limits).\r\n stack.set(srcValue, newValue);\r\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\r\n stack['delete'](srcValue);\r\n }\r\n assignMergeValue(object, key, newValue);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.nth` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {Array} array The array to query.\r\n * @param {number} n The index of the element to return.\r\n * @returns {*} Returns the nth element of `array`.\r\n */\r\n function baseNth(array, n) {\r\n var length = array.length;\r\n if (!length) {\r\n return;\r\n }\r\n n += n < 0 ? length : 0;\r\n return isIndex(n, length) ? array[n] : undefined;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.orderBy` without param guards.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\r\n * @param {string[]} orders The sort orders of `iteratees`.\r\n * @returns {Array} Returns the new sorted array.\r\n */\r\n function baseOrderBy(collection, iteratees, orders) {\r\n if (iteratees.length) {\r\n iteratees = arrayMap(iteratees, function(iteratee) {\r\n if (isArray(iteratee)) {\r\n return function(value) {\r\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\r\n }\r\n }\r\n return iteratee;\r\n });\r\n } else {\r\n iteratees = [identity];\r\n }\r\n\r\n var index = -1;\r\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\r\n\r\n var result = baseMap(collection, function(value, key, collection) {\r\n var criteria = arrayMap(iteratees, function(iteratee) {\r\n return iteratee(value);\r\n });\r\n return { 'criteria': criteria, 'index': ++index, 'value': value };\r\n });\r\n\r\n return baseSortBy(result, function(object, other) {\r\n return compareMultiple(object, other, orders);\r\n });\r\n }\r\n\r\n /**\r\n * The base implementation of `_.pick` without support for individual\r\n * property identifiers.\r\n *\r\n * @private\r\n * @param {Object} object The source object.\r\n * @param {string[]} paths The property paths to pick.\r\n * @returns {Object} Returns the new object.\r\n */\r\n function basePick(object, paths) {\r\n return basePickBy(object, paths, function(value, path) {\r\n return hasIn(object, path);\r\n });\r\n }\r\n\r\n /**\r\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Object} object The source object.\r\n * @param {string[]} paths The property paths to pick.\r\n * @param {Function} predicate The function invoked per property.\r\n * @returns {Object} Returns the new object.\r\n */\r\n function basePickBy(object, paths, predicate) {\r\n var index = -1,\r\n length = paths.length,\r\n result = {};\r\n\r\n while (++index < length) {\r\n var path = paths[index],\r\n value = baseGet(object, path);\r\n\r\n if (predicate(value, path)) {\r\n baseSet(result, castPath(path, object), value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseProperty` which supports deep paths.\r\n *\r\n * @private\r\n * @param {Array|string} path The path of the property to get.\r\n * @returns {Function} Returns the new accessor function.\r\n */\r\n function basePropertyDeep(path) {\r\n return function(object) {\r\n return baseGet(object, path);\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `_.pullAllBy` without support for iteratee\r\n * shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to remove.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function basePullAll(array, values, iteratee, comparator) {\r\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\r\n index = -1,\r\n length = values.length,\r\n seen = array;\r\n\r\n if (array === values) {\r\n values = copyArray(values);\r\n }\r\n if (iteratee) {\r\n seen = arrayMap(array, baseUnary(iteratee));\r\n }\r\n while (++index < length) {\r\n var fromIndex = 0,\r\n value = values[index],\r\n computed = iteratee ? iteratee(value) : value;\r\n\r\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\r\n if (seen !== array) {\r\n splice.call(seen, fromIndex, 1);\r\n }\r\n splice.call(array, fromIndex, 1);\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.pullAt` without support for individual\r\n * indexes or capturing the removed elements.\r\n *\r\n * @private\r\n * @param {Array} array The array to modify.\r\n * @param {number[]} indexes The indexes of elements to remove.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function basePullAt(array, indexes) {\r\n var length = array ? indexes.length : 0,\r\n lastIndex = length - 1;\r\n\r\n while (length--) {\r\n var index = indexes[length];\r\n if (length == lastIndex || index !== previous) {\r\n var previous = index;\r\n if (isIndex(index)) {\r\n splice.call(array, index, 1);\r\n } else {\r\n baseUnset(array, index);\r\n }\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.random` without support for returning\r\n * floating-point numbers.\r\n *\r\n * @private\r\n * @param {number} lower The lower bound.\r\n * @param {number} upper The upper bound.\r\n * @returns {number} Returns the random number.\r\n */\r\n function baseRandom(lower, upper) {\r\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\r\n * coerce arguments.\r\n *\r\n * @private\r\n * @param {number} start The start of the range.\r\n * @param {number} end The end of the range.\r\n * @param {number} step The value to increment or decrement by.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Array} Returns the range of numbers.\r\n */\r\n function baseRange(start, end, step, fromRight) {\r\n var index = -1,\r\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\r\n result = Array(length);\r\n\r\n while (length--) {\r\n result[fromRight ? length : ++index] = start;\r\n start += step;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.repeat` which doesn't coerce arguments.\r\n *\r\n * @private\r\n * @param {string} string The string to repeat.\r\n * @param {number} n The number of times to repeat the string.\r\n * @returns {string} Returns the repeated string.\r\n */\r\n function baseRepeat(string, n) {\r\n var result = '';\r\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\r\n return result;\r\n }\r\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\r\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\r\n do {\r\n if (n % 2) {\r\n result += string;\r\n }\r\n n = nativeFloor(n / 2);\r\n if (n) {\r\n string += string;\r\n }\r\n } while (n);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\r\n *\r\n * @private\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @param {number} [start=func.length-1] The start position of the rest parameter.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function baseRest(func, start) {\r\n return setToString(overRest(func, start, identity), func + '');\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sample`.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to sample.\r\n * @returns {*} Returns the random element.\r\n */\r\n function baseSample(collection) {\r\n return arraySample(values(collection));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sampleSize` without param guards.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to sample.\r\n * @param {number} n The number of elements to sample.\r\n * @returns {Array} Returns the random elements.\r\n */\r\n function baseSampleSize(collection, n) {\r\n var array = values(collection);\r\n return shuffleSelf(array, baseClamp(n, 0, array.length));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.set`.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to set.\r\n * @param {*} value The value to set.\r\n * @param {Function} [customizer] The function to customize path creation.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseSet(object, path, value, customizer) {\r\n if (!isObject(object)) {\r\n return object;\r\n }\r\n path = castPath(path, object);\r\n\r\n var index = -1,\r\n length = path.length,\r\n lastIndex = length - 1,\r\n nested = object;\r\n\r\n while (nested != null && ++index < length) {\r\n var key = toKey(path[index]),\r\n newValue = value;\r\n\r\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\r\n return object;\r\n }\r\n\r\n if (index != lastIndex) {\r\n var objValue = nested[key];\r\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\r\n if (newValue === undefined) {\r\n newValue = isObject(objValue)\r\n ? objValue\r\n : (isIndex(path[index + 1]) ? [] : {});\r\n }\r\n }\r\n assignValue(nested, key, newValue);\r\n nested = nested[key];\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * The base implementation of `setData` without support for hot loop shorting.\r\n *\r\n * @private\r\n * @param {Function} func The function to associate metadata with.\r\n * @param {*} data The metadata.\r\n * @returns {Function} Returns `func`.\r\n */\r\n var baseSetData = !metaMap ? identity : function(func, data) {\r\n metaMap.set(func, data);\r\n return func;\r\n };\r\n\r\n /**\r\n * The base implementation of `setToString` without support for hot loop shorting.\r\n *\r\n * @private\r\n * @param {Function} func The function to modify.\r\n * @param {Function} string The `toString` result.\r\n * @returns {Function} Returns `func`.\r\n */\r\n var baseSetToString = !defineProperty ? identity : function(func, string) {\r\n return defineProperty(func, 'toString', {\r\n 'configurable': true,\r\n 'enumerable': false,\r\n 'value': constant(string),\r\n 'writable': true\r\n });\r\n };\r\n\r\n /**\r\n * The base implementation of `_.shuffle`.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to shuffle.\r\n * @returns {Array} Returns the new shuffled array.\r\n */\r\n function baseShuffle(collection) {\r\n return shuffleSelf(values(collection));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.slice` without an iteratee call guard.\r\n *\r\n * @private\r\n * @param {Array} array The array to slice.\r\n * @param {number} [start=0] The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns the slice of `array`.\r\n */\r\n function baseSlice(array, start, end) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n if (start < 0) {\r\n start = -start > length ? 0 : (length + start);\r\n }\r\n end = end > length ? length : end;\r\n if (end < 0) {\r\n end += length;\r\n }\r\n length = start > end ? 0 : ((end - start) >>> 0);\r\n start >>>= 0;\r\n\r\n var result = Array(length);\r\n while (++index < length) {\r\n result[index] = array[index + start];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.some` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {boolean} Returns `true` if any element passes the predicate check,\r\n * else `false`.\r\n */\r\n function baseSome(collection, predicate) {\r\n var result;\r\n\r\n baseEach(collection, function(value, index, collection) {\r\n result = predicate(value, index, collection);\r\n return !result;\r\n });\r\n return !!result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\r\n * performs a binary search of `array` to determine the index at which `value`\r\n * should be inserted into `array` in order to maintain its sort order.\r\n *\r\n * @private\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n */\r\n function baseSortedIndex(array, value, retHighest) {\r\n var low = 0,\r\n high = array == null ? low : array.length;\r\n\r\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\r\n while (low < high) {\r\n var mid = (low + high) >>> 1,\r\n computed = array[mid];\r\n\r\n if (computed !== null && !isSymbol(computed) &&\r\n (retHighest ? (computed <= value) : (computed < value))) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n return high;\r\n }\r\n return baseSortedIndexBy(array, value, identity, retHighest);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\r\n * which invokes `iteratee` for `value` and each element of `array` to compute\r\n * their sort ranking. The iteratee is invoked with one argument; (value).\r\n *\r\n * @private\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @param {Function} iteratee The iteratee invoked per element.\r\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n */\r\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\r\n var low = 0,\r\n high = array == null ? 0 : array.length;\r\n if (high === 0) {\r\n return 0;\r\n }\r\n\r\n value = iteratee(value);\r\n var valIsNaN = value !== value,\r\n valIsNull = value === null,\r\n valIsSymbol = isSymbol(value),\r\n valIsUndefined = value === undefined;\r\n\r\n while (low < high) {\r\n var mid = nativeFloor((low + high) / 2),\r\n computed = iteratee(array[mid]),\r\n othIsDefined = computed !== undefined,\r\n othIsNull = computed === null,\r\n othIsReflexive = computed === computed,\r\n othIsSymbol = isSymbol(computed);\r\n\r\n if (valIsNaN) {\r\n var setLow = retHighest || othIsReflexive;\r\n } else if (valIsUndefined) {\r\n setLow = othIsReflexive && (retHighest || othIsDefined);\r\n } else if (valIsNull) {\r\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\r\n } else if (valIsSymbol) {\r\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\r\n } else if (othIsNull || othIsSymbol) {\r\n setLow = false;\r\n } else {\r\n setLow = retHighest ? (computed <= value) : (computed < value);\r\n }\r\n if (setLow) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n return nativeMin(high, MAX_ARRAY_INDEX);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\r\n * support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @returns {Array} Returns the new duplicate free array.\r\n */\r\n function baseSortedUniq(array, iteratee) {\r\n var index = -1,\r\n length = array.length,\r\n resIndex = 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index],\r\n computed = iteratee ? iteratee(value) : value;\r\n\r\n if (!index || !eq(computed, seen)) {\r\n var seen = computed;\r\n result[resIndex++] = value === 0 ? 0 : value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.toNumber` which doesn't ensure correct\r\n * conversions of binary, hexadecimal, or octal string values.\r\n *\r\n * @private\r\n * @param {*} value The value to process.\r\n * @returns {number} Returns the number.\r\n */\r\n function baseToNumber(value) {\r\n if (typeof value == 'number') {\r\n return value;\r\n }\r\n if (isSymbol(value)) {\r\n return NAN;\r\n }\r\n return +value;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.toString` which doesn't convert nullish\r\n * values to empty strings.\r\n *\r\n * @private\r\n * @param {*} value The value to process.\r\n * @returns {string} Returns the string.\r\n */\r\n function baseToString(value) {\r\n // Exit early for strings to avoid a performance hit in some environments.\r\n if (typeof value == 'string') {\r\n return value;\r\n }\r\n if (isArray(value)) {\r\n // Recursively convert values (susceptible to call stack limits).\r\n return arrayMap(value, baseToString) + '';\r\n }\r\n if (isSymbol(value)) {\r\n return symbolToString ? symbolToString.call(value) : '';\r\n }\r\n var result = (value + '');\r\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new duplicate free array.\r\n */\r\n function baseUniq(array, iteratee, comparator) {\r\n var index = -1,\r\n includes = arrayIncludes,\r\n length = array.length,\r\n isCommon = true,\r\n result = [],\r\n seen = result;\r\n\r\n if (comparator) {\r\n isCommon = false;\r\n includes = arrayIncludesWith;\r\n }\r\n else if (length >= LARGE_ARRAY_SIZE) {\r\n var set = iteratee ? null : createSet(array);\r\n if (set) {\r\n return setToArray(set);\r\n }\r\n isCommon = false;\r\n includes = cacheHas;\r\n seen = new SetCache;\r\n }\r\n else {\r\n seen = iteratee ? [] : result;\r\n }\r\n outer:\r\n while (++index < length) {\r\n var value = array[index],\r\n computed = iteratee ? iteratee(value) : value;\r\n\r\n value = (comparator || value !== 0) ? value : 0;\r\n if (isCommon && computed === computed) {\r\n var seenIndex = seen.length;\r\n while (seenIndex--) {\r\n if (seen[seenIndex] === computed) {\r\n continue outer;\r\n }\r\n }\r\n if (iteratee) {\r\n seen.push(computed);\r\n }\r\n result.push(value);\r\n }\r\n else if (!includes(seen, computed, comparator)) {\r\n if (seen !== result) {\r\n seen.push(computed);\r\n }\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.unset`.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The property path to unset.\r\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\r\n */\r\n function baseUnset(object, path) {\r\n path = castPath(path, object);\r\n object = parent(object, path);\r\n return object == null || delete object[toKey(last(path))];\r\n }\r\n\r\n /**\r\n * The base implementation of `_.update`.\r\n *\r\n * @private\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to update.\r\n * @param {Function} updater The function to produce the updated value.\r\n * @param {Function} [customizer] The function to customize path creation.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseUpdate(object, path, updater, customizer) {\r\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\r\n * without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to query.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Array} Returns the slice of `array`.\r\n */\r\n function baseWhile(array, predicate, isDrop, fromRight) {\r\n var length = array.length,\r\n index = fromRight ? length : -1;\r\n\r\n while ((fromRight ? index-- : ++index < length) &&\r\n predicate(array[index], index, array)) {}\r\n\r\n return isDrop\r\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\r\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\r\n }\r\n\r\n /**\r\n * The base implementation of `wrapperValue` which returns the result of\r\n * performing a sequence of actions on the unwrapped `value`, where each\r\n * successive action is supplied the return value of the previous.\r\n *\r\n * @private\r\n * @param {*} value The unwrapped value.\r\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\r\n * @returns {*} Returns the resolved value.\r\n */\r\n function baseWrapperValue(value, actions) {\r\n var result = value;\r\n if (result instanceof LazyWrapper) {\r\n result = result.value();\r\n }\r\n return arrayReduce(actions, function(result, action) {\r\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\r\n }, result);\r\n }\r\n\r\n /**\r\n * The base implementation of methods like `_.xor`, without support for\r\n * iteratee shorthands, that accepts an array of arrays to inspect.\r\n *\r\n * @private\r\n * @param {Array} arrays The arrays to inspect.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of values.\r\n */\r\n function baseXor(arrays, iteratee, comparator) {\r\n var length = arrays.length;\r\n if (length < 2) {\r\n return length ? baseUniq(arrays[0]) : [];\r\n }\r\n var index = -1,\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n var array = arrays[index],\r\n othIndex = -1;\r\n\r\n while (++othIndex < length) {\r\n if (othIndex != index) {\r\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\r\n }\r\n }\r\n }\r\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\r\n }\r\n\r\n /**\r\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\r\n *\r\n * @private\r\n * @param {Array} props The property identifiers.\r\n * @param {Array} values The property values.\r\n * @param {Function} assignFunc The function to assign values.\r\n * @returns {Object} Returns the new object.\r\n */\r\n function baseZipObject(props, values, assignFunc) {\r\n var index = -1,\r\n length = props.length,\r\n valsLength = values.length,\r\n result = {};\r\n\r\n while (++index < length) {\r\n var value = index < valsLength ? values[index] : undefined;\r\n assignFunc(result, props[index], value);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Casts `value` to an empty array if it's not an array like object.\r\n *\r\n * @private\r\n * @param {*} value The value to inspect.\r\n * @returns {Array|Object} Returns the cast array-like object.\r\n */\r\n function castArrayLikeObject(value) {\r\n return isArrayLikeObject(value) ? value : [];\r\n }\r\n\r\n /**\r\n * Casts `value` to `identity` if it's not a function.\r\n *\r\n * @private\r\n * @param {*} value The value to inspect.\r\n * @returns {Function} Returns cast function.\r\n */\r\n function castFunction(value) {\r\n return typeof value == 'function' ? value : identity;\r\n }\r\n\r\n /**\r\n * Casts `value` to a path array if it's not one.\r\n *\r\n * @private\r\n * @param {*} value The value to inspect.\r\n * @param {Object} [object] The object to query keys on.\r\n * @returns {Array} Returns the cast property path array.\r\n */\r\n function castPath(value, object) {\r\n if (isArray(value)) {\r\n return value;\r\n }\r\n return isKey(value, object) ? [value] : stringToPath(toString(value));\r\n }\r\n\r\n /**\r\n * A `baseRest` alias which can be replaced with `identity` by module\r\n * replacement plugins.\r\n *\r\n * @private\r\n * @type {Function}\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @returns {Function} Returns the new function.\r\n */\r\n var castRest = baseRest;\r\n\r\n /**\r\n * Casts `array` to a slice if it's needed.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {number} start The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns the cast slice.\r\n */\r\n function castSlice(array, start, end) {\r\n var length = array.length;\r\n end = end === undefined ? length : end;\r\n return (!start && end >= length) ? array : baseSlice(array, start, end);\r\n }\r\n\r\n /**\r\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\r\n *\r\n * @private\r\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\r\n */\r\n var clearTimeout = ctxClearTimeout || function(id) {\r\n return root.clearTimeout(id);\r\n };\r\n\r\n /**\r\n * Creates a clone of `buffer`.\r\n *\r\n * @private\r\n * @param {Buffer} buffer The buffer to clone.\r\n * @param {boolean} [isDeep] Specify a deep clone.\r\n * @returns {Buffer} Returns the cloned buffer.\r\n */\r\n function cloneBuffer(buffer, isDeep) {\r\n if (isDeep) {\r\n return buffer.slice();\r\n }\r\n var length = buffer.length,\r\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\r\n\r\n buffer.copy(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a clone of `arrayBuffer`.\r\n *\r\n * @private\r\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\r\n * @returns {ArrayBuffer} Returns the cloned array buffer.\r\n */\r\n function cloneArrayBuffer(arrayBuffer) {\r\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\r\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a clone of `dataView`.\r\n *\r\n * @private\r\n * @param {Object} dataView The data view to clone.\r\n * @param {boolean} [isDeep] Specify a deep clone.\r\n * @returns {Object} Returns the cloned data view.\r\n */\r\n function cloneDataView(dataView, isDeep) {\r\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\r\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\r\n }\r\n\r\n /**\r\n * Creates a clone of `regexp`.\r\n *\r\n * @private\r\n * @param {Object} regexp The regexp to clone.\r\n * @returns {Object} Returns the cloned regexp.\r\n */\r\n function cloneRegExp(regexp) {\r\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\r\n result.lastIndex = regexp.lastIndex;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a clone of the `symbol` object.\r\n *\r\n * @private\r\n * @param {Object} symbol The symbol object to clone.\r\n * @returns {Object} Returns the cloned symbol object.\r\n */\r\n function cloneSymbol(symbol) {\r\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\r\n }\r\n\r\n /**\r\n * Creates a clone of `typedArray`.\r\n *\r\n * @private\r\n * @param {Object} typedArray The typed array to clone.\r\n * @param {boolean} [isDeep] Specify a deep clone.\r\n * @returns {Object} Returns the cloned typed array.\r\n */\r\n function cloneTypedArray(typedArray, isDeep) {\r\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\r\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\r\n }\r\n\r\n /**\r\n * Compares values to sort them in ascending order.\r\n *\r\n * @private\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {number} Returns the sort order indicator for `value`.\r\n */\r\n function compareAscending(value, other) {\r\n if (value !== other) {\r\n var valIsDefined = value !== undefined,\r\n valIsNull = value === null,\r\n valIsReflexive = value === value,\r\n valIsSymbol = isSymbol(value);\r\n\r\n var othIsDefined = other !== undefined,\r\n othIsNull = other === null,\r\n othIsReflexive = other === other,\r\n othIsSymbol = isSymbol(other);\r\n\r\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\r\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\r\n (valIsNull && othIsDefined && othIsReflexive) ||\r\n (!valIsDefined && othIsReflexive) ||\r\n !valIsReflexive) {\r\n return 1;\r\n }\r\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\r\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\r\n (othIsNull && valIsDefined && valIsReflexive) ||\r\n (!othIsDefined && valIsReflexive) ||\r\n !othIsReflexive) {\r\n return -1;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Used by `_.orderBy` to compare multiple properties of a value to another\r\n * and stable sort them.\r\n *\r\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\r\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\r\n * of corresponding values.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {boolean[]|string[]} orders The order to sort by for each property.\r\n * @returns {number} Returns the sort order indicator for `object`.\r\n */\r\n function compareMultiple(object, other, orders) {\r\n var index = -1,\r\n objCriteria = object.criteria,\r\n othCriteria = other.criteria,\r\n length = objCriteria.length,\r\n ordersLength = orders.length;\r\n\r\n while (++index < length) {\r\n var result = compareAscending(objCriteria[index], othCriteria[index]);\r\n if (result) {\r\n if (index >= ordersLength) {\r\n return result;\r\n }\r\n var order = orders[index];\r\n return result * (order == 'desc' ? -1 : 1);\r\n }\r\n }\r\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n // that causes it, under certain circumstances, to provide the same value for\r\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\r\n // for more details.\r\n //\r\n // This also ensures a stable sort in V8 and other engines.\r\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\r\n return object.index - other.index;\r\n }\r\n\r\n /**\r\n * Creates an array that is the composition of partially applied arguments,\r\n * placeholders, and provided arguments into a single array of arguments.\r\n *\r\n * @private\r\n * @param {Array} args The provided arguments.\r\n * @param {Array} partials The arguments to prepend to those provided.\r\n * @param {Array} holders The `partials` placeholder indexes.\r\n * @params {boolean} [isCurried] Specify composing for a curried function.\r\n * @returns {Array} Returns the new array of composed arguments.\r\n */\r\n function composeArgs(args, partials, holders, isCurried) {\r\n var argsIndex = -1,\r\n argsLength = args.length,\r\n holdersLength = holders.length,\r\n leftIndex = -1,\r\n leftLength = partials.length,\r\n rangeLength = nativeMax(argsLength - holdersLength, 0),\r\n result = Array(leftLength + rangeLength),\r\n isUncurried = !isCurried;\r\n\r\n while (++leftIndex < leftLength) {\r\n result[leftIndex] = partials[leftIndex];\r\n }\r\n while (++argsIndex < holdersLength) {\r\n if (isUncurried || argsIndex < argsLength) {\r\n result[holders[argsIndex]] = args[argsIndex];\r\n }\r\n }\r\n while (rangeLength--) {\r\n result[leftIndex++] = args[argsIndex++];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * This function is like `composeArgs` except that the arguments composition\r\n * is tailored for `_.partialRight`.\r\n *\r\n * @private\r\n * @param {Array} args The provided arguments.\r\n * @param {Array} partials The arguments to append to those provided.\r\n * @param {Array} holders The `partials` placeholder indexes.\r\n * @params {boolean} [isCurried] Specify composing for a curried function.\r\n * @returns {Array} Returns the new array of composed arguments.\r\n */\r\n function composeArgsRight(args, partials, holders, isCurried) {\r\n var argsIndex = -1,\r\n argsLength = args.length,\r\n holdersIndex = -1,\r\n holdersLength = holders.length,\r\n rightIndex = -1,\r\n rightLength = partials.length,\r\n rangeLength = nativeMax(argsLength - holdersLength, 0),\r\n result = Array(rangeLength + rightLength),\r\n isUncurried = !isCurried;\r\n\r\n while (++argsIndex < rangeLength) {\r\n result[argsIndex] = args[argsIndex];\r\n }\r\n var offset = argsIndex;\r\n while (++rightIndex < rightLength) {\r\n result[offset + rightIndex] = partials[rightIndex];\r\n }\r\n while (++holdersIndex < holdersLength) {\r\n if (isUncurried || argsIndex < argsLength) {\r\n result[offset + holders[holdersIndex]] = args[argsIndex++];\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Copies the values of `source` to `array`.\r\n *\r\n * @private\r\n * @param {Array} source The array to copy values from.\r\n * @param {Array} [array=[]] The array to copy values to.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function copyArray(source, array) {\r\n var index = -1,\r\n length = source.length;\r\n\r\n array || (array = Array(length));\r\n while (++index < length) {\r\n array[index] = source[index];\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Copies properties of `source` to `object`.\r\n *\r\n * @private\r\n * @param {Object} source The object to copy properties from.\r\n * @param {Array} props The property identifiers to copy.\r\n * @param {Object} [object={}] The object to copy properties to.\r\n * @param {Function} [customizer] The function to customize copied values.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function copyObject(source, props, object, customizer) {\r\n var isNew = !object;\r\n object || (object = {});\r\n\r\n var index = -1,\r\n length = props.length;\r\n\r\n while (++index < length) {\r\n var key = props[index];\r\n\r\n var newValue = customizer\r\n ? customizer(object[key], source[key], key, object, source)\r\n : undefined;\r\n\r\n if (newValue === undefined) {\r\n newValue = source[key];\r\n }\r\n if (isNew) {\r\n baseAssignValue(object, key, newValue);\r\n } else {\r\n assignValue(object, key, newValue);\r\n }\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * Copies own symbols of `source` to `object`.\r\n *\r\n * @private\r\n * @param {Object} source The object to copy symbols from.\r\n * @param {Object} [object={}] The object to copy symbols to.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function copySymbols(source, object) {\r\n return copyObject(source, getSymbols(source), object);\r\n }\r\n\r\n /**\r\n * Copies own and inherited symbols of `source` to `object`.\r\n *\r\n * @private\r\n * @param {Object} source The object to copy symbols from.\r\n * @param {Object} [object={}] The object to copy symbols to.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function copySymbolsIn(source, object) {\r\n return copyObject(source, getSymbolsIn(source), object);\r\n }\r\n\r\n /**\r\n * Creates a function like `_.groupBy`.\r\n *\r\n * @private\r\n * @param {Function} setter The function to set accumulator values.\r\n * @param {Function} [initializer] The accumulator object initializer.\r\n * @returns {Function} Returns the new aggregator function.\r\n */\r\n function createAggregator(setter, initializer) {\r\n return function(collection, iteratee) {\r\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\r\n accumulator = initializer ? initializer() : {};\r\n\r\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function like `_.assign`.\r\n *\r\n * @private\r\n * @param {Function} assigner The function to assign values.\r\n * @returns {Function} Returns the new assigner function.\r\n */\r\n function createAssigner(assigner) {\r\n return baseRest(function(object, sources) {\r\n var index = -1,\r\n length = sources.length,\r\n customizer = length > 1 ? sources[length - 1] : undefined,\r\n guard = length > 2 ? sources[2] : undefined;\r\n\r\n customizer = (assigner.length > 3 && typeof customizer == 'function')\r\n ? (length--, customizer)\r\n : undefined;\r\n\r\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\r\n customizer = length < 3 ? undefined : customizer;\r\n length = 1;\r\n }\r\n object = Object(object);\r\n while (++index < length) {\r\n var source = sources[index];\r\n if (source) {\r\n assigner(object, source, index, customizer);\r\n }\r\n }\r\n return object;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a `baseEach` or `baseEachRight` function.\r\n *\r\n * @private\r\n * @param {Function} eachFunc The function to iterate over a collection.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Function} Returns the new base function.\r\n */\r\n function createBaseEach(eachFunc, fromRight) {\r\n return function(collection, iteratee) {\r\n if (collection == null) {\r\n return collection;\r\n }\r\n if (!isArrayLike(collection)) {\r\n return eachFunc(collection, iteratee);\r\n }\r\n var length = collection.length,\r\n index = fromRight ? length : -1,\r\n iterable = Object(collection);\r\n\r\n while ((fromRight ? index-- : ++index < length)) {\r\n if (iteratee(iterable[index], index, iterable) === false) {\r\n break;\r\n }\r\n }\r\n return collection;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\r\n *\r\n * @private\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Function} Returns the new base function.\r\n */\r\n function createBaseFor(fromRight) {\r\n return function(object, iteratee, keysFunc) {\r\n var index = -1,\r\n iterable = Object(object),\r\n props = keysFunc(object),\r\n length = props.length;\r\n\r\n while (length--) {\r\n var key = props[fromRight ? length : ++index];\r\n if (iteratee(iterable[key], key, iterable) === false) {\r\n break;\r\n }\r\n }\r\n return object;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that wraps `func` to invoke it with the optional `this`\r\n * binding of `thisArg`.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createBind(func, bitmask, thisArg) {\r\n var isBind = bitmask & WRAP_BIND_FLAG,\r\n Ctor = createCtor(func);\r\n\r\n function wrapper() {\r\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\r\n return fn.apply(isBind ? thisArg : this, arguments);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a function like `_.lowerFirst`.\r\n *\r\n * @private\r\n * @param {string} methodName The name of the `String` case method to use.\r\n * @returns {Function} Returns the new case function.\r\n */\r\n function createCaseFirst(methodName) {\r\n return function(string) {\r\n string = toString(string);\r\n\r\n var strSymbols = hasUnicode(string)\r\n ? stringToArray(string)\r\n : undefined;\r\n\r\n var chr = strSymbols\r\n ? strSymbols[0]\r\n : string.charAt(0);\r\n\r\n var trailing = strSymbols\r\n ? castSlice(strSymbols, 1).join('')\r\n : string.slice(1);\r\n\r\n return chr[methodName]() + trailing;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function like `_.camelCase`.\r\n *\r\n * @private\r\n * @param {Function} callback The function to combine each word.\r\n * @returns {Function} Returns the new compounder function.\r\n */\r\n function createCompounder(callback) {\r\n return function(string) {\r\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that produces an instance of `Ctor` regardless of\r\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\r\n *\r\n * @private\r\n * @param {Function} Ctor The constructor to wrap.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createCtor(Ctor) {\r\n return function() {\r\n // Use a `switch` statement to work with class constructors. See\r\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\r\n // for more details.\r\n var args = arguments;\r\n switch (args.length) {\r\n case 0: return new Ctor;\r\n case 1: return new Ctor(args[0]);\r\n case 2: return new Ctor(args[0], args[1]);\r\n case 3: return new Ctor(args[0], args[1], args[2]);\r\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\r\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\r\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\r\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\r\n }\r\n var thisBinding = baseCreate(Ctor.prototype),\r\n result = Ctor.apply(thisBinding, args);\r\n\r\n // Mimic the constructor's `return` behavior.\r\n // See https://es5.github.io/#x13.2.2 for more details.\r\n return isObject(result) ? result : thisBinding;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that wraps `func` to enable currying.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @param {number} arity The arity of `func`.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createCurry(func, bitmask, arity) {\r\n var Ctor = createCtor(func);\r\n\r\n function wrapper() {\r\n var length = arguments.length,\r\n args = Array(length),\r\n index = length,\r\n placeholder = getHolder(wrapper);\r\n\r\n while (index--) {\r\n args[index] = arguments[index];\r\n }\r\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\r\n ? []\r\n : replaceHolders(args, placeholder);\r\n\r\n length -= holders.length;\r\n if (length < arity) {\r\n return createRecurry(\r\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\r\n args, holders, undefined, undefined, arity - length);\r\n }\r\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\r\n return apply(fn, this, args);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a `_.find` or `_.findLast` function.\r\n *\r\n * @private\r\n * @param {Function} findIndexFunc The function to find the collection index.\r\n * @returns {Function} Returns the new find function.\r\n */\r\n function createFind(findIndexFunc) {\r\n return function(collection, predicate, fromIndex) {\r\n var iterable = Object(collection);\r\n if (!isArrayLike(collection)) {\r\n var iteratee = getIteratee(predicate, 3);\r\n collection = keys(collection);\r\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\r\n }\r\n var index = findIndexFunc(collection, predicate, fromIndex);\r\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a `_.flow` or `_.flowRight` function.\r\n *\r\n * @private\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Function} Returns the new flow function.\r\n */\r\n function createFlow(fromRight) {\r\n return flatRest(function(funcs) {\r\n var length = funcs.length,\r\n index = length,\r\n prereq = LodashWrapper.prototype.thru;\r\n\r\n if (fromRight) {\r\n funcs.reverse();\r\n }\r\n while (index--) {\r\n var func = funcs[index];\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\r\n var wrapper = new LodashWrapper([], true);\r\n }\r\n }\r\n index = wrapper ? index : length;\r\n while (++index < length) {\r\n func = funcs[index];\r\n\r\n var funcName = getFuncName(func),\r\n data = funcName == 'wrapper' ? getData(func) : undefined;\r\n\r\n if (data && isLaziable(data[0]) &&\r\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\r\n !data[4].length && data[9] == 1\r\n ) {\r\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\r\n } else {\r\n wrapper = (func.length == 1 && isLaziable(func))\r\n ? wrapper[funcName]()\r\n : wrapper.thru(func);\r\n }\r\n }\r\n return function() {\r\n var args = arguments,\r\n value = args[0];\r\n\r\n if (wrapper && args.length == 1 && isArray(value)) {\r\n return wrapper.plant(value).value();\r\n }\r\n var index = 0,\r\n result = length ? funcs[index].apply(this, args) : value;\r\n\r\n while (++index < length) {\r\n result = funcs[index].call(this, result);\r\n }\r\n return result;\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Creates a function that wraps `func` to invoke it with optional `this`\r\n * binding of `thisArg`, partial application, and currying.\r\n *\r\n * @private\r\n * @param {Function|string} func The function or method name to wrap.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @param {Array} [partials] The arguments to prepend to those provided to\r\n * the new function.\r\n * @param {Array} [holders] The `partials` placeholder indexes.\r\n * @param {Array} [partialsRight] The arguments to append to those provided\r\n * to the new function.\r\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\r\n * @param {Array} [argPos] The argument positions of the new function.\r\n * @param {number} [ary] The arity cap of `func`.\r\n * @param {number} [arity] The arity of `func`.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\r\n var isAry = bitmask & WRAP_ARY_FLAG,\r\n isBind = bitmask & WRAP_BIND_FLAG,\r\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\r\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\r\n isFlip = bitmask & WRAP_FLIP_FLAG,\r\n Ctor = isBindKey ? undefined : createCtor(func);\r\n\r\n function wrapper() {\r\n var length = arguments.length,\r\n args = Array(length),\r\n index = length;\r\n\r\n while (index--) {\r\n args[index] = arguments[index];\r\n }\r\n if (isCurried) {\r\n var placeholder = getHolder(wrapper),\r\n holdersCount = countHolders(args, placeholder);\r\n }\r\n if (partials) {\r\n args = composeArgs(args, partials, holders, isCurried);\r\n }\r\n if (partialsRight) {\r\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\r\n }\r\n length -= holdersCount;\r\n if (isCurried && length < arity) {\r\n var newHolders = replaceHolders(args, placeholder);\r\n return createRecurry(\r\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\r\n args, newHolders, argPos, ary, arity - length\r\n );\r\n }\r\n var thisBinding = isBind ? thisArg : this,\r\n fn = isBindKey ? thisBinding[func] : func;\r\n\r\n length = args.length;\r\n if (argPos) {\r\n args = reorder(args, argPos);\r\n } else if (isFlip && length > 1) {\r\n args.reverse();\r\n }\r\n if (isAry && ary < length) {\r\n args.length = ary;\r\n }\r\n if (this && this !== root && this instanceof wrapper) {\r\n fn = Ctor || createCtor(fn);\r\n }\r\n return fn.apply(thisBinding, args);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a function like `_.invertBy`.\r\n *\r\n * @private\r\n * @param {Function} setter The function to set accumulator values.\r\n * @param {Function} toIteratee The function to resolve iteratees.\r\n * @returns {Function} Returns the new inverter function.\r\n */\r\n function createInverter(setter, toIteratee) {\r\n return function(object, iteratee) {\r\n return baseInverter(object, setter, toIteratee(iteratee), {});\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that performs a mathematical operation on two values.\r\n *\r\n * @private\r\n * @param {Function} operator The function to perform the operation.\r\n * @param {number} [defaultValue] The value used for `undefined` arguments.\r\n * @returns {Function} Returns the new mathematical operation function.\r\n */\r\n function createMathOperation(operator, defaultValue) {\r\n return function(value, other) {\r\n var result;\r\n if (value === undefined && other === undefined) {\r\n return defaultValue;\r\n }\r\n if (value !== undefined) {\r\n result = value;\r\n }\r\n if (other !== undefined) {\r\n if (result === undefined) {\r\n return other;\r\n }\r\n if (typeof value == 'string' || typeof other == 'string') {\r\n value = baseToString(value);\r\n other = baseToString(other);\r\n } else {\r\n value = baseToNumber(value);\r\n other = baseToNumber(other);\r\n }\r\n result = operator(value, other);\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function like `_.over`.\r\n *\r\n * @private\r\n * @param {Function} arrayFunc The function to iterate over iteratees.\r\n * @returns {Function} Returns the new over function.\r\n */\r\n function createOver(arrayFunc) {\r\n return flatRest(function(iteratees) {\r\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\r\n return baseRest(function(args) {\r\n var thisArg = this;\r\n return arrayFunc(iteratees, function(iteratee) {\r\n return apply(iteratee, thisArg, args);\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Creates the padding for `string` based on `length`. The `chars` string\r\n * is truncated if the number of characters exceeds `length`.\r\n *\r\n * @private\r\n * @param {number} length The padding length.\r\n * @param {string} [chars=' '] The string used as padding.\r\n * @returns {string} Returns the padding for `string`.\r\n */\r\n function createPadding(length, chars) {\r\n chars = chars === undefined ? ' ' : baseToString(chars);\r\n\r\n var charsLength = chars.length;\r\n if (charsLength < 2) {\r\n return charsLength ? baseRepeat(chars, length) : chars;\r\n }\r\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\r\n return hasUnicode(chars)\r\n ? castSlice(stringToArray(result), 0, length).join('')\r\n : result.slice(0, length);\r\n }\r\n\r\n /**\r\n * Creates a function that wraps `func` to invoke it with the `this` binding\r\n * of `thisArg` and `partials` prepended to the arguments it receives.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @param {*} thisArg The `this` binding of `func`.\r\n * @param {Array} partials The arguments to prepend to those provided to\r\n * the new function.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createPartial(func, bitmask, thisArg, partials) {\r\n var isBind = bitmask & WRAP_BIND_FLAG,\r\n Ctor = createCtor(func);\r\n\r\n function wrapper() {\r\n var argsIndex = -1,\r\n argsLength = arguments.length,\r\n leftIndex = -1,\r\n leftLength = partials.length,\r\n args = Array(leftLength + argsLength),\r\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\r\n\r\n while (++leftIndex < leftLength) {\r\n args[leftIndex] = partials[leftIndex];\r\n }\r\n while (argsLength--) {\r\n args[leftIndex++] = arguments[++argsIndex];\r\n }\r\n return apply(fn, isBind ? thisArg : this, args);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a `_.range` or `_.rangeRight` function.\r\n *\r\n * @private\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Function} Returns the new range function.\r\n */\r\n function createRange(fromRight) {\r\n return function(start, end, step) {\r\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\r\n end = step = undefined;\r\n }\r\n // Ensure the sign of `-0` is preserved.\r\n start = toFinite(start);\r\n if (end === undefined) {\r\n end = start;\r\n start = 0;\r\n } else {\r\n end = toFinite(end);\r\n }\r\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\r\n return baseRange(start, end, step, fromRight);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that performs a relational operation on two values.\r\n *\r\n * @private\r\n * @param {Function} operator The function to perform the operation.\r\n * @returns {Function} Returns the new relational operation function.\r\n */\r\n function createRelationalOperation(operator) {\r\n return function(value, other) {\r\n if (!(typeof value == 'string' && typeof other == 'string')) {\r\n value = toNumber(value);\r\n other = toNumber(other);\r\n }\r\n return operator(value, other);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that wraps `func` to continue currying.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @param {Function} wrapFunc The function to create the `func` wrapper.\r\n * @param {*} placeholder The placeholder value.\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @param {Array} [partials] The arguments to prepend to those provided to\r\n * the new function.\r\n * @param {Array} [holders] The `partials` placeholder indexes.\r\n * @param {Array} [argPos] The argument positions of the new function.\r\n * @param {number} [ary] The arity cap of `func`.\r\n * @param {number} [arity] The arity of `func`.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\r\n var isCurry = bitmask & WRAP_CURRY_FLAG,\r\n newHolders = isCurry ? holders : undefined,\r\n newHoldersRight = isCurry ? undefined : holders,\r\n newPartials = isCurry ? partials : undefined,\r\n newPartialsRight = isCurry ? undefined : partials;\r\n\r\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\r\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\r\n\r\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\r\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\r\n }\r\n var newData = [\r\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\r\n newHoldersRight, argPos, ary, arity\r\n ];\r\n\r\n var result = wrapFunc.apply(undefined, newData);\r\n if (isLaziable(func)) {\r\n setData(result, newData);\r\n }\r\n result.placeholder = placeholder;\r\n return setWrapToString(result, func, bitmask);\r\n }\r\n\r\n /**\r\n * Creates a function like `_.round`.\r\n *\r\n * @private\r\n * @param {string} methodName The name of the `Math` method to use when rounding.\r\n * @returns {Function} Returns the new round function.\r\n */\r\n function createRound(methodName) {\r\n var func = Math[methodName];\r\n return function(number, precision) {\r\n number = toNumber(number);\r\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\r\n if (precision && nativeIsFinite(number)) {\r\n // Shift with exponential notation to avoid floating-point issues.\r\n // See [MDN](https://mdn.io/round#Examples) for more details.\r\n var pair = (toString(number) + 'e').split('e'),\r\n value = func(pair[0] + 'e' + (+pair[1] + precision));\r\n\r\n pair = (toString(value) + 'e').split('e');\r\n return +(pair[0] + 'e' + (+pair[1] - precision));\r\n }\r\n return func(number);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a set object of `values`.\r\n *\r\n * @private\r\n * @param {Array} values The values to add to the set.\r\n * @returns {Object} Returns the new set.\r\n */\r\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\r\n return new Set(values);\r\n };\r\n\r\n /**\r\n * Creates a `_.toPairs` or `_.toPairsIn` function.\r\n *\r\n * @private\r\n * @param {Function} keysFunc The function to get the keys of a given object.\r\n * @returns {Function} Returns the new pairs function.\r\n */\r\n function createToPairs(keysFunc) {\r\n return function(object) {\r\n var tag = getTag(object);\r\n if (tag == mapTag) {\r\n return mapToArray(object);\r\n }\r\n if (tag == setTag) {\r\n return setToPairs(object);\r\n }\r\n return baseToPairs(object, keysFunc(object));\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that either curries or invokes `func` with optional\r\n * `this` binding and partially applied arguments.\r\n *\r\n * @private\r\n * @param {Function|string} func The function or method name to wrap.\r\n * @param {number} bitmask The bitmask flags.\r\n * 1 - `_.bind`\r\n * 2 - `_.bindKey`\r\n * 4 - `_.curry` or `_.curryRight` of a bound function\r\n * 8 - `_.curry`\r\n * 16 - `_.curryRight`\r\n * 32 - `_.partial`\r\n * 64 - `_.partialRight`\r\n * 128 - `_.rearg`\r\n * 256 - `_.ary`\r\n * 512 - `_.flip`\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @param {Array} [partials] The arguments to be partially applied.\r\n * @param {Array} [holders] The `partials` placeholder indexes.\r\n * @param {Array} [argPos] The argument positions of the new function.\r\n * @param {number} [ary] The arity cap of `func`.\r\n * @param {number} [arity] The arity of `func`.\r\n * @returns {Function} Returns the new wrapped function.\r\n */\r\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\r\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\r\n if (!isBindKey && typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n var length = partials ? partials.length : 0;\r\n if (!length) {\r\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\r\n partials = holders = undefined;\r\n }\r\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\r\n arity = arity === undefined ? arity : toInteger(arity);\r\n length -= holders ? holders.length : 0;\r\n\r\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\r\n var partialsRight = partials,\r\n holdersRight = holders;\r\n\r\n partials = holders = undefined;\r\n }\r\n var data = isBindKey ? undefined : getData(func);\r\n\r\n var newData = [\r\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\r\n argPos, ary, arity\r\n ];\r\n\r\n if (data) {\r\n mergeData(newData, data);\r\n }\r\n func = newData[0];\r\n bitmask = newData[1];\r\n thisArg = newData[2];\r\n partials = newData[3];\r\n holders = newData[4];\r\n arity = newData[9] = newData[9] === undefined\r\n ? (isBindKey ? 0 : func.length)\r\n : nativeMax(newData[9] - length, 0);\r\n\r\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\r\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\r\n }\r\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\r\n var result = createBind(func, bitmask, thisArg);\r\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\r\n result = createCurry(func, bitmask, arity);\r\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\r\n result = createPartial(func, bitmask, thisArg, partials);\r\n } else {\r\n result = createHybrid.apply(undefined, newData);\r\n }\r\n var setter = data ? baseSetData : setData;\r\n return setWrapToString(setter(result, newData), func, bitmask);\r\n }\r\n\r\n /**\r\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\r\n * of source objects to the destination object for all destination properties\r\n * that resolve to `undefined`.\r\n *\r\n * @private\r\n * @param {*} objValue The destination value.\r\n * @param {*} srcValue The source value.\r\n * @param {string} key The key of the property to assign.\r\n * @param {Object} object The parent object of `objValue`.\r\n * @returns {*} Returns the value to assign.\r\n */\r\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\r\n if (objValue === undefined ||\r\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\r\n return srcValue;\r\n }\r\n return objValue;\r\n }\r\n\r\n /**\r\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\r\n * objects into destination objects that are passed thru.\r\n *\r\n * @private\r\n * @param {*} objValue The destination value.\r\n * @param {*} srcValue The source value.\r\n * @param {string} key The key of the property to merge.\r\n * @param {Object} object The parent object of `objValue`.\r\n * @param {Object} source The parent object of `srcValue`.\r\n * @param {Object} [stack] Tracks traversed source values and their merged\r\n * counterparts.\r\n * @returns {*} Returns the value to assign.\r\n */\r\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\r\n if (isObject(objValue) && isObject(srcValue)) {\r\n // Recursively merge objects and arrays (susceptible to call stack limits).\r\n stack.set(srcValue, objValue);\r\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\r\n stack['delete'](srcValue);\r\n }\r\n return objValue;\r\n }\r\n\r\n /**\r\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\r\n * objects.\r\n *\r\n * @private\r\n * @param {*} value The value to inspect.\r\n * @param {string} key The key of the property to inspect.\r\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\r\n */\r\n function customOmitClone(value) {\r\n return isPlainObject(value) ? undefined : value;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseIsEqualDeep` for arrays with support for\r\n * partial deep comparisons.\r\n *\r\n * @private\r\n * @param {Array} array The array to compare.\r\n * @param {Array} other The other array to compare.\r\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed `array` and `other` objects.\r\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\r\n */\r\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\r\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\r\n arrLength = array.length,\r\n othLength = other.length;\r\n\r\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\r\n return false;\r\n }\r\n // Check that cyclic values are equal.\r\n var arrStacked = stack.get(array);\r\n var othStacked = stack.get(other);\r\n if (arrStacked && othStacked) {\r\n return arrStacked == other && othStacked == array;\r\n }\r\n var index = -1,\r\n result = true,\r\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\r\n\r\n stack.set(array, other);\r\n stack.set(other, array);\r\n\r\n // Ignore non-index properties.\r\n while (++index < arrLength) {\r\n var arrValue = array[index],\r\n othValue = other[index];\r\n\r\n if (customizer) {\r\n var compared = isPartial\r\n ? customizer(othValue, arrValue, index, other, array, stack)\r\n : customizer(arrValue, othValue, index, array, other, stack);\r\n }\r\n if (compared !== undefined) {\r\n if (compared) {\r\n continue;\r\n }\r\n result = false;\r\n break;\r\n }\r\n // Recursively compare arrays (susceptible to call stack limits).\r\n if (seen) {\r\n if (!arraySome(other, function(othValue, othIndex) {\r\n if (!cacheHas(seen, othIndex) &&\r\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\r\n return seen.push(othIndex);\r\n }\r\n })) {\r\n result = false;\r\n break;\r\n }\r\n } else if (!(\r\n arrValue === othValue ||\r\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\r\n )) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n stack['delete'](array);\r\n stack['delete'](other);\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseIsEqualDeep` for comparing objects of\r\n * the same `toStringTag`.\r\n *\r\n * **Note:** This function only supports comparing values with tags of\r\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {string} tag The `toStringTag` of the objects to compare.\r\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed `object` and `other` objects.\r\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\r\n */\r\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\r\n switch (tag) {\r\n case dataViewTag:\r\n if ((object.byteLength != other.byteLength) ||\r\n (object.byteOffset != other.byteOffset)) {\r\n return false;\r\n }\r\n object = object.buffer;\r\n other = other.buffer;\r\n\r\n case arrayBufferTag:\r\n if ((object.byteLength != other.byteLength) ||\r\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\r\n return false;\r\n }\r\n return true;\r\n\r\n case boolTag:\r\n case dateTag:\r\n case numberTag:\r\n // Coerce booleans to `1` or `0` and dates to milliseconds.\r\n // Invalid dates are coerced to `NaN`.\r\n return eq(+object, +other);\r\n\r\n case errorTag:\r\n return object.name == other.name && object.message == other.message;\r\n\r\n case regexpTag:\r\n case stringTag:\r\n // Coerce regexes to strings and treat strings, primitives and objects,\r\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\r\n // for more details.\r\n return object == (other + '');\r\n\r\n case mapTag:\r\n var convert = mapToArray;\r\n\r\n case setTag:\r\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\r\n convert || (convert = setToArray);\r\n\r\n if (object.size != other.size && !isPartial) {\r\n return false;\r\n }\r\n // Assume cyclic values are equal.\r\n var stacked = stack.get(object);\r\n if (stacked) {\r\n return stacked == other;\r\n }\r\n bitmask |= COMPARE_UNORDERED_FLAG;\r\n\r\n // Recursively compare objects (susceptible to call stack limits).\r\n stack.set(object, other);\r\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\r\n stack['delete'](object);\r\n return result;\r\n\r\n case symbolTag:\r\n if (symbolValueOf) {\r\n return symbolValueOf.call(object) == symbolValueOf.call(other);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseIsEqualDeep` for objects with support for\r\n * partial deep comparisons.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed `object` and `other` objects.\r\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\r\n */\r\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\r\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\r\n objProps = getAllKeys(object),\r\n objLength = objProps.length,\r\n othProps = getAllKeys(other),\r\n othLength = othProps.length;\r\n\r\n if (objLength != othLength && !isPartial) {\r\n return false;\r\n }\r\n var index = objLength;\r\n while (index--) {\r\n var key = objProps[index];\r\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\r\n return false;\r\n }\r\n }\r\n // Check that cyclic values are equal.\r\n var objStacked = stack.get(object);\r\n var othStacked = stack.get(other);\r\n if (objStacked && othStacked) {\r\n return objStacked == other && othStacked == object;\r\n }\r\n var result = true;\r\n stack.set(object, other);\r\n stack.set(other, object);\r\n\r\n var skipCtor = isPartial;\r\n while (++index < objLength) {\r\n key = objProps[index];\r\n var objValue = object[key],\r\n othValue = other[key];\r\n\r\n if (customizer) {\r\n var compared = isPartial\r\n ? customizer(othValue, objValue, key, other, object, stack)\r\n : customizer(objValue, othValue, key, object, other, stack);\r\n }\r\n // Recursively compare objects (susceptible to call stack limits).\r\n if (!(compared === undefined\r\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\r\n : compared\r\n )) {\r\n result = false;\r\n break;\r\n }\r\n skipCtor || (skipCtor = key == 'constructor');\r\n }\r\n if (result && !skipCtor) {\r\n var objCtor = object.constructor,\r\n othCtor = other.constructor;\r\n\r\n // Non `Object` object instances with different constructors are not equal.\r\n if (objCtor != othCtor &&\r\n ('constructor' in object && 'constructor' in other) &&\r\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\r\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\r\n result = false;\r\n }\r\n }\r\n stack['delete'](object);\r\n stack['delete'](other);\r\n return result;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseRest` which flattens the rest array.\r\n *\r\n * @private\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function flatRest(func) {\r\n return setToString(overRest(func, undefined, flatten), func + '');\r\n }\r\n\r\n /**\r\n * Creates an array of own enumerable property names and symbols of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names and symbols.\r\n */\r\n function getAllKeys(object) {\r\n return baseGetAllKeys(object, keys, getSymbols);\r\n }\r\n\r\n /**\r\n * Creates an array of own and inherited enumerable property names and\r\n * symbols of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names and symbols.\r\n */\r\n function getAllKeysIn(object) {\r\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\r\n }\r\n\r\n /**\r\n * Gets metadata for `func`.\r\n *\r\n * @private\r\n * @param {Function} func The function to query.\r\n * @returns {*} Returns the metadata for `func`.\r\n */\r\n var getData = !metaMap ? noop : function(func) {\r\n return metaMap.get(func);\r\n };\r\n\r\n /**\r\n * Gets the name of `func`.\r\n *\r\n * @private\r\n * @param {Function} func The function to query.\r\n * @returns {string} Returns the function name.\r\n */\r\n function getFuncName(func) {\r\n var result = (func.name + ''),\r\n array = realNames[result],\r\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\r\n\r\n while (length--) {\r\n var data = array[length],\r\n otherFunc = data.func;\r\n if (otherFunc == null || otherFunc == func) {\r\n return data.name;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the argument placeholder value for `func`.\r\n *\r\n * @private\r\n * @param {Function} func The function to inspect.\r\n * @returns {*} Returns the placeholder value.\r\n */\r\n function getHolder(func) {\r\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\r\n return object.placeholder;\r\n }\r\n\r\n /**\r\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\r\n * this function returns the custom method, otherwise it returns `baseIteratee`.\r\n * If arguments are provided, the chosen function is invoked with them and\r\n * its result is returned.\r\n *\r\n * @private\r\n * @param {*} [value] The value to convert to an iteratee.\r\n * @param {number} [arity] The arity of the created iteratee.\r\n * @returns {Function} Returns the chosen function or its result.\r\n */\r\n function getIteratee() {\r\n var result = lodash.iteratee || iteratee;\r\n result = result === iteratee ? baseIteratee : result;\r\n return arguments.length ? result(arguments[0], arguments[1]) : result;\r\n }\r\n\r\n /**\r\n * Gets the data for `map`.\r\n *\r\n * @private\r\n * @param {Object} map The map to query.\r\n * @param {string} key The reference key.\r\n * @returns {*} Returns the map data.\r\n */\r\n function getMapData(map, key) {\r\n var data = map.__data__;\r\n return isKeyable(key)\r\n ? data[typeof key == 'string' ? 'string' : 'hash']\r\n : data.map;\r\n }\r\n\r\n /**\r\n * Gets the property names, values, and compare flags of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the match data of `object`.\r\n */\r\n function getMatchData(object) {\r\n var result = keys(object),\r\n length = result.length;\r\n\r\n while (length--) {\r\n var key = result[length],\r\n value = object[key];\r\n\r\n result[length] = [key, value, isStrictComparable(value)];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the native function at `key` of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {string} key The key of the method to get.\r\n * @returns {*} Returns the function if it's native, else `undefined`.\r\n */\r\n function getNative(object, key) {\r\n var value = getValue(object, key);\r\n return baseIsNative(value) ? value : undefined;\r\n }\r\n\r\n /**\r\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the raw `toStringTag`.\r\n */\r\n function getRawTag(value) {\r\n var isOwn = hasOwnProperty.call(value, symToStringTag),\r\n tag = value[symToStringTag];\r\n\r\n try {\r\n value[symToStringTag] = undefined;\r\n var unmasked = true;\r\n } catch (e) {}\r\n\r\n var result = nativeObjectToString.call(value);\r\n if (unmasked) {\r\n if (isOwn) {\r\n value[symToStringTag] = tag;\r\n } else {\r\n delete value[symToStringTag];\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array of the own enumerable symbols of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of symbols.\r\n */\r\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\r\n if (object == null) {\r\n return [];\r\n }\r\n object = Object(object);\r\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\r\n return propertyIsEnumerable.call(object, symbol);\r\n });\r\n };\r\n\r\n /**\r\n * Creates an array of the own and inherited enumerable symbols of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of symbols.\r\n */\r\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\r\n var result = [];\r\n while (object) {\r\n arrayPush(result, getSymbols(object));\r\n object = getPrototype(object);\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Gets the `toStringTag` of `value`.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the `toStringTag`.\r\n */\r\n var getTag = baseGetTag;\r\n\r\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\r\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\r\n (Map && getTag(new Map) != mapTag) ||\r\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\r\n (Set && getTag(new Set) != setTag) ||\r\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\r\n getTag = function(value) {\r\n var result = baseGetTag(value),\r\n Ctor = result == objectTag ? value.constructor : undefined,\r\n ctorString = Ctor ? toSource(Ctor) : '';\r\n\r\n if (ctorString) {\r\n switch (ctorString) {\r\n case dataViewCtorString: return dataViewTag;\r\n case mapCtorString: return mapTag;\r\n case promiseCtorString: return promiseTag;\r\n case setCtorString: return setTag;\r\n case weakMapCtorString: return weakMapTag;\r\n }\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\r\n *\r\n * @private\r\n * @param {number} start The start of the view.\r\n * @param {number} end The end of the view.\r\n * @param {Array} transforms The transformations to apply to the view.\r\n * @returns {Object} Returns an object containing the `start` and `end`\r\n * positions of the view.\r\n */\r\n function getView(start, end, transforms) {\r\n var index = -1,\r\n length = transforms.length;\r\n\r\n while (++index < length) {\r\n var data = transforms[index],\r\n size = data.size;\r\n\r\n switch (data.type) {\r\n case 'drop': start += size; break;\r\n case 'dropRight': end -= size; break;\r\n case 'take': end = nativeMin(end, start + size); break;\r\n case 'takeRight': start = nativeMax(start, end - size); break;\r\n }\r\n }\r\n return { 'start': start, 'end': end };\r\n }\r\n\r\n /**\r\n * Extracts wrapper details from the `source` body comment.\r\n *\r\n * @private\r\n * @param {string} source The source to inspect.\r\n * @returns {Array} Returns the wrapper details.\r\n */\r\n function getWrapDetails(source) {\r\n var match = source.match(reWrapDetails);\r\n return match ? match[1].split(reSplitDetails) : [];\r\n }\r\n\r\n /**\r\n * Checks if `path` exists on `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path to check.\r\n * @param {Function} hasFunc The function to check properties.\r\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\r\n */\r\n function hasPath(object, path, hasFunc) {\r\n path = castPath(path, object);\r\n\r\n var index = -1,\r\n length = path.length,\r\n result = false;\r\n\r\n while (++index < length) {\r\n var key = toKey(path[index]);\r\n if (!(result = object != null && hasFunc(object, key))) {\r\n break;\r\n }\r\n object = object[key];\r\n }\r\n if (result || ++index != length) {\r\n return result;\r\n }\r\n length = object == null ? 0 : object.length;\r\n return !!length && isLength(length) && isIndex(key, length) &&\r\n (isArray(object) || isArguments(object));\r\n }\r\n\r\n /**\r\n * Initializes an array clone.\r\n *\r\n * @private\r\n * @param {Array} array The array to clone.\r\n * @returns {Array} Returns the initialized clone.\r\n */\r\n function initCloneArray(array) {\r\n var length = array.length,\r\n result = new array.constructor(length);\r\n\r\n // Add properties assigned by `RegExp#exec`.\r\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\r\n result.index = array.index;\r\n result.input = array.input;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Initializes an object clone.\r\n *\r\n * @private\r\n * @param {Object} object The object to clone.\r\n * @returns {Object} Returns the initialized clone.\r\n */\r\n function initCloneObject(object) {\r\n return (typeof object.constructor == 'function' && !isPrototype(object))\r\n ? baseCreate(getPrototype(object))\r\n : {};\r\n }\r\n\r\n /**\r\n * Initializes an object clone based on its `toStringTag`.\r\n *\r\n * **Note:** This function only supports cloning values with tags of\r\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\r\n *\r\n * @private\r\n * @param {Object} object The object to clone.\r\n * @param {string} tag The `toStringTag` of the object to clone.\r\n * @param {boolean} [isDeep] Specify a deep clone.\r\n * @returns {Object} Returns the initialized clone.\r\n */\r\n function initCloneByTag(object, tag, isDeep) {\r\n var Ctor = object.constructor;\r\n switch (tag) {\r\n case arrayBufferTag:\r\n return cloneArrayBuffer(object);\r\n\r\n case boolTag:\r\n case dateTag:\r\n return new Ctor(+object);\r\n\r\n case dataViewTag:\r\n return cloneDataView(object, isDeep);\r\n\r\n case float32Tag: case float64Tag:\r\n case int8Tag: case int16Tag: case int32Tag:\r\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\r\n return cloneTypedArray(object, isDeep);\r\n\r\n case mapTag:\r\n return new Ctor;\r\n\r\n case numberTag:\r\n case stringTag:\r\n return new Ctor(object);\r\n\r\n case regexpTag:\r\n return cloneRegExp(object);\r\n\r\n case setTag:\r\n return new Ctor;\r\n\r\n case symbolTag:\r\n return cloneSymbol(object);\r\n }\r\n }\r\n\r\n /**\r\n * Inserts wrapper `details` in a comment at the top of the `source` body.\r\n *\r\n * @private\r\n * @param {string} source The source to modify.\r\n * @returns {Array} details The details to insert.\r\n * @returns {string} Returns the modified source.\r\n */\r\n function insertWrapDetails(source, details) {\r\n var length = details.length;\r\n if (!length) {\r\n return source;\r\n }\r\n var lastIndex = length - 1;\r\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\r\n details = details.join(length > 2 ? ', ' : ' ');\r\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\r\n }\r\n\r\n /**\r\n * Checks if `value` is a flattenable `arguments` object or array.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\r\n */\r\n function isFlattenable(value) {\r\n return isArray(value) || isArguments(value) ||\r\n !!(spreadableSymbol && value && value[spreadableSymbol]);\r\n }\r\n\r\n /**\r\n * Checks if `value` is a valid array-like index.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\r\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\r\n */\r\n function isIndex(value, length) {\r\n var type = typeof value;\r\n length = length == null ? MAX_SAFE_INTEGER : length;\r\n\r\n return !!length &&\r\n (type == 'number' ||\r\n (type != 'symbol' && reIsUint.test(value))) &&\r\n (value > -1 && value % 1 == 0 && value < length);\r\n }\r\n\r\n /**\r\n * Checks if the given arguments are from an iteratee call.\r\n *\r\n * @private\r\n * @param {*} value The potential iteratee value argument.\r\n * @param {*} index The potential iteratee index or key argument.\r\n * @param {*} object The potential iteratee object argument.\r\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\r\n * else `false`.\r\n */\r\n function isIterateeCall(value, index, object) {\r\n if (!isObject(object)) {\r\n return false;\r\n }\r\n var type = typeof index;\r\n if (type == 'number'\r\n ? (isArrayLike(object) && isIndex(index, object.length))\r\n : (type == 'string' && index in object)\r\n ) {\r\n return eq(object[index], value);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a property name and not a property path.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @param {Object} [object] The object to query keys on.\r\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\r\n */\r\n function isKey(value, object) {\r\n if (isArray(value)) {\r\n return false;\r\n }\r\n var type = typeof value;\r\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\r\n value == null || isSymbol(value)) {\r\n return true;\r\n }\r\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\r\n (object != null && value in Object(object));\r\n }\r\n\r\n /**\r\n * Checks if `value` is suitable for use as unique object key.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\r\n */\r\n function isKeyable(value) {\r\n var type = typeof value;\r\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\r\n ? (value !== '__proto__')\r\n : (value === null);\r\n }\r\n\r\n /**\r\n * Checks if `func` has a lazy counterpart.\r\n *\r\n * @private\r\n * @param {Function} func The function to check.\r\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\r\n * else `false`.\r\n */\r\n function isLaziable(func) {\r\n var funcName = getFuncName(func),\r\n other = lodash[funcName];\r\n\r\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\r\n return false;\r\n }\r\n if (func === other) {\r\n return true;\r\n }\r\n var data = getData(other);\r\n return !!data && func === data[0];\r\n }\r\n\r\n /**\r\n * Checks if `func` has its source masked.\r\n *\r\n * @private\r\n * @param {Function} func The function to check.\r\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\r\n */\r\n function isMasked(func) {\r\n return !!maskSrcKey && (maskSrcKey in func);\r\n }\r\n\r\n /**\r\n * Checks if `func` is capable of being masked.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\r\n */\r\n var isMaskable = coreJsData ? isFunction : stubFalse;\r\n\r\n /**\r\n * Checks if `value` is likely a prototype object.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\r\n */\r\n function isPrototype(value) {\r\n var Ctor = value && value.constructor,\r\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\r\n\r\n return value === proto;\r\n }\r\n\r\n /**\r\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` if suitable for strict\r\n * equality comparisons, else `false`.\r\n */\r\n function isStrictComparable(value) {\r\n return value === value && !isObject(value);\r\n }\r\n\r\n /**\r\n * A specialized version of `matchesProperty` for source values suitable\r\n * for strict equality comparisons, i.e. `===`.\r\n *\r\n * @private\r\n * @param {string} key The key of the property to get.\r\n * @param {*} srcValue The value to match.\r\n * @returns {Function} Returns the new spec function.\r\n */\r\n function matchesStrictComparable(key, srcValue) {\r\n return function(object) {\r\n if (object == null) {\r\n return false;\r\n }\r\n return object[key] === srcValue &&\r\n (srcValue !== undefined || (key in Object(object)));\r\n };\r\n }\r\n\r\n /**\r\n * A specialized version of `_.memoize` which clears the memoized function's\r\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\r\n *\r\n * @private\r\n * @param {Function} func The function to have its output memoized.\r\n * @returns {Function} Returns the new memoized function.\r\n */\r\n function memoizeCapped(func) {\r\n var result = memoize(func, function(key) {\r\n if (cache.size === MAX_MEMOIZE_SIZE) {\r\n cache.clear();\r\n }\r\n return key;\r\n });\r\n\r\n var cache = result.cache;\r\n return result;\r\n }\r\n\r\n /**\r\n * Merges the function metadata of `source` into `data`.\r\n *\r\n * Merging metadata reduces the number of wrappers used to invoke a function.\r\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\r\n * may be applied regardless of execution order. Methods like `_.ary` and\r\n * `_.rearg` modify function arguments, making the order in which they are\r\n * executed important, preventing the merging of metadata. However, we make\r\n * an exception for a safe combined case where curried functions have `_.ary`\r\n * and or `_.rearg` applied.\r\n *\r\n * @private\r\n * @param {Array} data The destination metadata.\r\n * @param {Array} source The source metadata.\r\n * @returns {Array} Returns `data`.\r\n */\r\n function mergeData(data, source) {\r\n var bitmask = data[1],\r\n srcBitmask = source[1],\r\n newBitmask = bitmask | srcBitmask,\r\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\r\n\r\n var isCombo =\r\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\r\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\r\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\r\n\r\n // Exit early if metadata can't be merged.\r\n if (!(isCommon || isCombo)) {\r\n return data;\r\n }\r\n // Use source `thisArg` if available.\r\n if (srcBitmask & WRAP_BIND_FLAG) {\r\n data[2] = source[2];\r\n // Set when currying a bound function.\r\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\r\n }\r\n // Compose partial arguments.\r\n var value = source[3];\r\n if (value) {\r\n var partials = data[3];\r\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\r\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\r\n }\r\n // Compose partial right arguments.\r\n value = source[5];\r\n if (value) {\r\n partials = data[5];\r\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\r\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\r\n }\r\n // Use source `argPos` if available.\r\n value = source[7];\r\n if (value) {\r\n data[7] = value;\r\n }\r\n // Use source `ary` if it's smaller.\r\n if (srcBitmask & WRAP_ARY_FLAG) {\r\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\r\n }\r\n // Use source `arity` if one is not provided.\r\n if (data[9] == null) {\r\n data[9] = source[9];\r\n }\r\n // Use source `func` and merge bitmasks.\r\n data[0] = source[0];\r\n data[1] = newBitmask;\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * This function is like\r\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\r\n * except that it includes inherited enumerable properties.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function nativeKeysIn(object) {\r\n var result = [];\r\n if (object != null) {\r\n for (var key in Object(object)) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts `value` to a string using `Object.prototype.toString`.\r\n *\r\n * @private\r\n * @param {*} value The value to convert.\r\n * @returns {string} Returns the converted string.\r\n */\r\n function objectToString(value) {\r\n return nativeObjectToString.call(value);\r\n }\r\n\r\n /**\r\n * A specialized version of `baseRest` which transforms the rest array.\r\n *\r\n * @private\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @param {number} [start=func.length-1] The start position of the rest parameter.\r\n * @param {Function} transform The rest array transform.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function overRest(func, start, transform) {\r\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\r\n return function() {\r\n var args = arguments,\r\n index = -1,\r\n length = nativeMax(args.length - start, 0),\r\n array = Array(length);\r\n\r\n while (++index < length) {\r\n array[index] = args[start + index];\r\n }\r\n index = -1;\r\n var otherArgs = Array(start + 1);\r\n while (++index < start) {\r\n otherArgs[index] = args[index];\r\n }\r\n otherArgs[start] = transform(array);\r\n return apply(func, this, otherArgs);\r\n };\r\n }\r\n\r\n /**\r\n * Gets the parent value at `path` of `object`.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Array} path The path to get the parent value of.\r\n * @returns {*} Returns the parent value.\r\n */\r\n function parent(object, path) {\r\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\r\n }\r\n\r\n /**\r\n * Reorder `array` according to the specified indexes where the element at\r\n * the first index is assigned as the first element, the element at\r\n * the second index is assigned as the second element, and so on.\r\n *\r\n * @private\r\n * @param {Array} array The array to reorder.\r\n * @param {Array} indexes The arranged array indexes.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function reorder(array, indexes) {\r\n var arrLength = array.length,\r\n length = nativeMin(indexes.length, arrLength),\r\n oldArray = copyArray(array);\r\n\r\n while (length--) {\r\n var index = indexes[length];\r\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {string} key The key of the property to get.\r\n * @returns {*} Returns the property value.\r\n */\r\n function safeGet(object, key) {\r\n if (key === 'constructor' && typeof object[key] === 'function') {\r\n return;\r\n }\r\n\r\n if (key == '__proto__') {\r\n return;\r\n }\r\n\r\n return object[key];\r\n }\r\n\r\n /**\r\n * Sets metadata for `func`.\r\n *\r\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\r\n * period of time, it will trip its breaker and transition to an identity\r\n * function to avoid garbage collection pauses in V8. See\r\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\r\n * for more details.\r\n *\r\n * @private\r\n * @param {Function} func The function to associate metadata with.\r\n * @param {*} data The metadata.\r\n * @returns {Function} Returns `func`.\r\n */\r\n var setData = shortOut(baseSetData);\r\n\r\n /**\r\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\r\n *\r\n * @private\r\n * @param {Function} func The function to delay.\r\n * @param {number} wait The number of milliseconds to delay invocation.\r\n * @returns {number|Object} Returns the timer id or timeout object.\r\n */\r\n var setTimeout = ctxSetTimeout || function(func, wait) {\r\n return root.setTimeout(func, wait);\r\n };\r\n\r\n /**\r\n * Sets the `toString` method of `func` to return `string`.\r\n *\r\n * @private\r\n * @param {Function} func The function to modify.\r\n * @param {Function} string The `toString` result.\r\n * @returns {Function} Returns `func`.\r\n */\r\n var setToString = shortOut(baseSetToString);\r\n\r\n /**\r\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\r\n * with wrapper details in a comment at the top of the source body.\r\n *\r\n * @private\r\n * @param {Function} wrapper The function to modify.\r\n * @param {Function} reference The reference function.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @returns {Function} Returns `wrapper`.\r\n */\r\n function setWrapToString(wrapper, reference, bitmask) {\r\n var source = (reference + '');\r\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\r\n }\r\n\r\n /**\r\n * Creates a function that'll short out and invoke `identity` instead\r\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\r\n * milliseconds.\r\n *\r\n * @private\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new shortable function.\r\n */\r\n function shortOut(func) {\r\n var count = 0,\r\n lastCalled = 0;\r\n\r\n return function() {\r\n var stamp = nativeNow(),\r\n remaining = HOT_SPAN - (stamp - lastCalled);\r\n\r\n lastCalled = stamp;\r\n if (remaining > 0) {\r\n if (++count >= HOT_COUNT) {\r\n return arguments[0];\r\n }\r\n } else {\r\n count = 0;\r\n }\r\n return func.apply(undefined, arguments);\r\n };\r\n }\r\n\r\n /**\r\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\r\n *\r\n * @private\r\n * @param {Array} array The array to shuffle.\r\n * @param {number} [size=array.length] The size of `array`.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function shuffleSelf(array, size) {\r\n var index = -1,\r\n length = array.length,\r\n lastIndex = length - 1;\r\n\r\n size = size === undefined ? length : size;\r\n while (++index < size) {\r\n var rand = baseRandom(index, lastIndex),\r\n value = array[rand];\r\n\r\n array[rand] = array[index];\r\n array[index] = value;\r\n }\r\n array.length = size;\r\n return array;\r\n }\r\n\r\n /**\r\n * Converts `string` to a property path array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the property path array.\r\n */\r\n var stringToPath = memoizeCapped(function(string) {\r\n var result = [];\r\n if (string.charCodeAt(0) === 46 /* . */) {\r\n result.push('');\r\n }\r\n string.replace(rePropName, function(match, number, quote, subString) {\r\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\r\n });\r\n return result;\r\n });\r\n\r\n /**\r\n * Converts `value` to a string key if it's not a string or symbol.\r\n *\r\n * @private\r\n * @param {*} value The value to inspect.\r\n * @returns {string|symbol} Returns the key.\r\n */\r\n function toKey(value) {\r\n if (typeof value == 'string' || isSymbol(value)) {\r\n return value;\r\n }\r\n var result = (value + '');\r\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\r\n }\r\n\r\n /**\r\n * Converts `func` to its source code.\r\n *\r\n * @private\r\n * @param {Function} func The function to convert.\r\n * @returns {string} Returns the source code.\r\n */\r\n function toSource(func) {\r\n if (func != null) {\r\n try {\r\n return funcToString.call(func);\r\n } catch (e) {}\r\n try {\r\n return (func + '');\r\n } catch (e) {}\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Updates wrapper `details` based on `bitmask` flags.\r\n *\r\n * @private\r\n * @returns {Array} details The details to modify.\r\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\r\n * @returns {Array} Returns `details`.\r\n */\r\n function updateWrapDetails(details, bitmask) {\r\n arrayEach(wrapFlags, function(pair) {\r\n var value = '_.' + pair[0];\r\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\r\n details.push(value);\r\n }\r\n });\r\n return details.sort();\r\n }\r\n\r\n /**\r\n * Creates a clone of `wrapper`.\r\n *\r\n * @private\r\n * @param {Object} wrapper The wrapper to clone.\r\n * @returns {Object} Returns the cloned wrapper.\r\n */\r\n function wrapperClone(wrapper) {\r\n if (wrapper instanceof LazyWrapper) {\r\n return wrapper.clone();\r\n }\r\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\r\n result.__actions__ = copyArray(wrapper.__actions__);\r\n result.__index__ = wrapper.__index__;\r\n result.__values__ = wrapper.__values__;\r\n return result;\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an array of elements split into groups the length of `size`.\r\n * If `array` can't be split evenly, the final chunk will be the remaining\r\n * elements.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to process.\r\n * @param {number} [size=1] The length of each chunk\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the new array of chunks.\r\n * @example\r\n *\r\n * _.chunk(['a', 'b', 'c', 'd'], 2);\r\n * // => [['a', 'b'], ['c', 'd']]\r\n *\r\n * _.chunk(['a', 'b', 'c', 'd'], 3);\r\n * // => [['a', 'b', 'c'], ['d']]\r\n */\r\n function chunk(array, size, guard) {\r\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\r\n size = 1;\r\n } else {\r\n size = nativeMax(toInteger(size), 0);\r\n }\r\n var length = array == null ? 0 : array.length;\r\n if (!length || size < 1) {\r\n return [];\r\n }\r\n var index = 0,\r\n resIndex = 0,\r\n result = Array(nativeCeil(length / size));\r\n\r\n while (index < length) {\r\n result[resIndex++] = baseSlice(array, index, (index += size));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array with all falsey values removed. The values `false`, `null`,\r\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to compact.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @example\r\n *\r\n * _.compact([0, 1, false, 2, '', 3]);\r\n * // => [1, 2, 3]\r\n */\r\n function compact(array) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length,\r\n resIndex = 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (value) {\r\n result[resIndex++] = value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new array concatenating `array` with any additional arrays\r\n * and/or values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to concatenate.\r\n * @param {...*} [values] The values to concatenate.\r\n * @returns {Array} Returns the new concatenated array.\r\n * @example\r\n *\r\n * var array = [1];\r\n * var other = _.concat(array, 2, [3], [[4]]);\r\n *\r\n * console.log(other);\r\n * // => [1, 2, 3, [4]]\r\n *\r\n * console.log(array);\r\n * // => [1]\r\n */\r\n function concat() {\r\n var length = arguments.length;\r\n if (!length) {\r\n return [];\r\n }\r\n var args = Array(length - 1),\r\n array = arguments[0],\r\n index = length;\r\n\r\n while (index--) {\r\n args[index - 1] = arguments[index];\r\n }\r\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\r\n }\r\n\r\n /**\r\n * Creates an array of `array` values not included in the other given arrays\r\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons. The order and references of result values are\r\n * determined by the first array.\r\n *\r\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {...Array} [values] The values to exclude.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @see _.without, _.xor\r\n * @example\r\n *\r\n * _.difference([2, 1], [2, 3]);\r\n * // => [1]\r\n */\r\n var difference = baseRest(function(array, values) {\r\n return isArrayLikeObject(array)\r\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\r\n : [];\r\n });\r\n\r\n /**\r\n * This method is like `_.difference` except that it accepts `iteratee` which\r\n * is invoked for each element of `array` and `values` to generate the criterion\r\n * by which they're compared. The order and references of result values are\r\n * determined by the first array. The iteratee is invoked with one argument:\r\n * (value).\r\n *\r\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {...Array} [values] The values to exclude.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @example\r\n *\r\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\r\n * // => [1.2]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\r\n * // => [{ 'x': 2 }]\r\n */\r\n var differenceBy = baseRest(function(array, values) {\r\n var iteratee = last(values);\r\n if (isArrayLikeObject(iteratee)) {\r\n iteratee = undefined;\r\n }\r\n return isArrayLikeObject(array)\r\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\r\n : [];\r\n });\r\n\r\n /**\r\n * This method is like `_.difference` except that it accepts `comparator`\r\n * which is invoked to compare elements of `array` to `values`. The order and\r\n * references of result values are determined by the first array. The comparator\r\n * is invoked with two arguments: (arrVal, othVal).\r\n *\r\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {...Array} [values] The values to exclude.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\r\n *\r\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\r\n * // => [{ 'x': 2, 'y': 1 }]\r\n */\r\n var differenceWith = baseRest(function(array, values) {\r\n var comparator = last(values);\r\n if (isArrayLikeObject(comparator)) {\r\n comparator = undefined;\r\n }\r\n return isArrayLikeObject(array)\r\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\r\n : [];\r\n });\r\n\r\n /**\r\n * Creates a slice of `array` with `n` elements dropped from the beginning.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.5.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {number} [n=1] The number of elements to drop.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.drop([1, 2, 3]);\r\n * // => [2, 3]\r\n *\r\n * _.drop([1, 2, 3], 2);\r\n * // => [3]\r\n *\r\n * _.drop([1, 2, 3], 5);\r\n * // => []\r\n *\r\n * _.drop([1, 2, 3], 0);\r\n * // => [1, 2, 3]\r\n */\r\n function drop(array, n, guard) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n n = (guard || n === undefined) ? 1 : toInteger(n);\r\n return baseSlice(array, n < 0 ? 0 : n, length);\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` with `n` elements dropped from the end.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {number} [n=1] The number of elements to drop.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.dropRight([1, 2, 3]);\r\n * // => [1, 2]\r\n *\r\n * _.dropRight([1, 2, 3], 2);\r\n * // => [1]\r\n *\r\n * _.dropRight([1, 2, 3], 5);\r\n * // => []\r\n *\r\n * _.dropRight([1, 2, 3], 0);\r\n * // => [1, 2, 3]\r\n */\r\n function dropRight(array, n, guard) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n n = (guard || n === undefined) ? 1 : toInteger(n);\r\n n = length - n;\r\n return baseSlice(array, 0, n < 0 ? 0 : n);\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` excluding elements dropped from the end.\r\n * Elements are dropped until `predicate` returns falsey. The predicate is\r\n * invoked with three arguments: (value, index, array).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': true },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': false }\r\n * ];\r\n *\r\n * _.dropRightWhile(users, function(o) { return !o.active; });\r\n * // => objects for ['barney']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\r\n * // => objects for ['barney', 'fred']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.dropRightWhile(users, ['active', false]);\r\n * // => objects for ['barney']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.dropRightWhile(users, 'active');\r\n * // => objects for ['barney', 'fred', 'pebbles']\r\n */\r\n function dropRightWhile(array, predicate) {\r\n return (array && array.length)\r\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\r\n : [];\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` excluding elements dropped from the beginning.\r\n * Elements are dropped until `predicate` returns falsey. The predicate is\r\n * invoked with three arguments: (value, index, array).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': false },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': true }\r\n * ];\r\n *\r\n * _.dropWhile(users, function(o) { return !o.active; });\r\n * // => objects for ['pebbles']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\r\n * // => objects for ['fred', 'pebbles']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.dropWhile(users, ['active', false]);\r\n * // => objects for ['pebbles']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.dropWhile(users, 'active');\r\n * // => objects for ['barney', 'fred', 'pebbles']\r\n */\r\n function dropWhile(array, predicate) {\r\n return (array && array.length)\r\n ? baseWhile(array, getIteratee(predicate, 3), true)\r\n : [];\r\n }\r\n\r\n /**\r\n * Fills elements of `array` with `value` from `start` up to, but not\r\n * including, `end`.\r\n *\r\n * **Note:** This method mutates `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.2.0\r\n * @category Array\r\n * @param {Array} array The array to fill.\r\n * @param {*} value The value to fill `array` with.\r\n * @param {number} [start=0] The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = [1, 2, 3];\r\n *\r\n * _.fill(array, 'a');\r\n * console.log(array);\r\n * // => ['a', 'a', 'a']\r\n *\r\n * _.fill(Array(3), 2);\r\n * // => [2, 2, 2]\r\n *\r\n * _.fill([4, 6, 8, 10], '*', 1, 3);\r\n * // => [4, '*', '*', 10]\r\n */\r\n function fill(array, value, start, end) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\r\n start = 0;\r\n end = length;\r\n }\r\n return baseFill(array, value, start, end);\r\n }\r\n\r\n /**\r\n * This method is like `_.find` except that it returns the index of the first\r\n * element `predicate` returns truthy for instead of the element itself.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @returns {number} Returns the index of the found element, else `-1`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': false },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': true }\r\n * ];\r\n *\r\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\r\n * // => 0\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.findIndex(users, { 'user': 'fred', 'active': false });\r\n * // => 1\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.findIndex(users, ['active', false]);\r\n * // => 0\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.findIndex(users, 'active');\r\n * // => 2\r\n */\r\n function findIndex(array, predicate, fromIndex) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return -1;\r\n }\r\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\r\n if (index < 0) {\r\n index = nativeMax(length + index, 0);\r\n }\r\n return baseFindIndex(array, getIteratee(predicate, 3), index);\r\n }\r\n\r\n /**\r\n * This method is like `_.findIndex` except that it iterates over elements\r\n * of `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param {number} [fromIndex=array.length-1] The index to search from.\r\n * @returns {number} Returns the index of the found element, else `-1`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': true },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': false }\r\n * ];\r\n *\r\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\r\n * // => 2\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\r\n * // => 0\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.findLastIndex(users, ['active', false]);\r\n * // => 2\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.findLastIndex(users, 'active');\r\n * // => 0\r\n */\r\n function findLastIndex(array, predicate, fromIndex) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return -1;\r\n }\r\n var index = length - 1;\r\n if (fromIndex !== undefined) {\r\n index = toInteger(fromIndex);\r\n index = fromIndex < 0\r\n ? nativeMax(length + index, 0)\r\n : nativeMin(index, length - 1);\r\n }\r\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\r\n }\r\n\r\n /**\r\n * Flattens `array` a single level deep.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to flatten.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * _.flatten([1, [2, [3, [4]], 5]]);\r\n * // => [1, 2, [3, [4]], 5]\r\n */\r\n function flatten(array) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? baseFlatten(array, 1) : [];\r\n }\r\n\r\n /**\r\n * Recursively flattens `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to flatten.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\r\n * // => [1, 2, 3, 4, 5]\r\n */\r\n function flattenDeep(array) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? baseFlatten(array, INFINITY) : [];\r\n }\r\n\r\n /**\r\n * Recursively flatten `array` up to `depth` times.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.4.0\r\n * @category Array\r\n * @param {Array} array The array to flatten.\r\n * @param {number} [depth=1] The maximum recursion depth.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * var array = [1, [2, [3, [4]], 5]];\r\n *\r\n * _.flattenDepth(array, 1);\r\n * // => [1, 2, [3, [4]], 5]\r\n *\r\n * _.flattenDepth(array, 2);\r\n * // => [1, 2, 3, [4], 5]\r\n */\r\n function flattenDepth(array, depth) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n depth = depth === undefined ? 1 : toInteger(depth);\r\n return baseFlatten(array, depth);\r\n }\r\n\r\n /**\r\n * The inverse of `_.toPairs`; this method returns an object composed\r\n * from key-value `pairs`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} pairs The key-value pairs.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * _.fromPairs([['a', 1], ['b', 2]]);\r\n * // => { 'a': 1, 'b': 2 }\r\n */\r\n function fromPairs(pairs) {\r\n var index = -1,\r\n length = pairs == null ? 0 : pairs.length,\r\n result = {};\r\n\r\n while (++index < length) {\r\n var pair = pairs[index];\r\n result[pair[0]] = pair[1];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the first element of `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @alias first\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @returns {*} Returns the first element of `array`.\r\n * @example\r\n *\r\n * _.head([1, 2, 3]);\r\n * // => 1\r\n *\r\n * _.head([]);\r\n * // => undefined\r\n */\r\n function head(array) {\r\n return (array && array.length) ? array[0] : undefined;\r\n }\r\n\r\n /**\r\n * Gets the index at which the first occurrence of `value` is found in `array`\r\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons. If `fromIndex` is negative, it's used as the\r\n * offset from the end of `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n * @example\r\n *\r\n * _.indexOf([1, 2, 1, 2], 2);\r\n * // => 1\r\n *\r\n * // Search from the `fromIndex`.\r\n * _.indexOf([1, 2, 1, 2], 2, 2);\r\n * // => 3\r\n */\r\n function indexOf(array, value, fromIndex) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return -1;\r\n }\r\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\r\n if (index < 0) {\r\n index = nativeMax(length + index, 0);\r\n }\r\n return baseIndexOf(array, value, index);\r\n }\r\n\r\n /**\r\n * Gets all but the last element of `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.initial([1, 2, 3]);\r\n * // => [1, 2]\r\n */\r\n function initial(array) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? baseSlice(array, 0, -1) : [];\r\n }\r\n\r\n /**\r\n * Creates an array of unique values that are included in all given arrays\r\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons. The order and references of result values are\r\n * determined by the first array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @returns {Array} Returns the new array of intersecting values.\r\n * @example\r\n *\r\n * _.intersection([2, 1], [2, 3]);\r\n * // => [2]\r\n */\r\n var intersection = baseRest(function(arrays) {\r\n var mapped = arrayMap(arrays, castArrayLikeObject);\r\n return (mapped.length && mapped[0] === arrays[0])\r\n ? baseIntersection(mapped)\r\n : [];\r\n });\r\n\r\n /**\r\n * This method is like `_.intersection` except that it accepts `iteratee`\r\n * which is invoked for each element of each `arrays` to generate the criterion\r\n * by which they're compared. The order and references of result values are\r\n * determined by the first array. The iteratee is invoked with one argument:\r\n * (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns the new array of intersecting values.\r\n * @example\r\n *\r\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\r\n * // => [2.1]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\r\n * // => [{ 'x': 1 }]\r\n */\r\n var intersectionBy = baseRest(function(arrays) {\r\n var iteratee = last(arrays),\r\n mapped = arrayMap(arrays, castArrayLikeObject);\r\n\r\n if (iteratee === last(mapped)) {\r\n iteratee = undefined;\r\n } else {\r\n mapped.pop();\r\n }\r\n return (mapped.length && mapped[0] === arrays[0])\r\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\r\n : [];\r\n });\r\n\r\n /**\r\n * This method is like `_.intersection` except that it accepts `comparator`\r\n * which is invoked to compare elements of `arrays`. The order and references\r\n * of result values are determined by the first array. The comparator is\r\n * invoked with two arguments: (arrVal, othVal).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of intersecting values.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\r\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\r\n *\r\n * _.intersectionWith(objects, others, _.isEqual);\r\n * // => [{ 'x': 1, 'y': 2 }]\r\n */\r\n var intersectionWith = baseRest(function(arrays) {\r\n var comparator = last(arrays),\r\n mapped = arrayMap(arrays, castArrayLikeObject);\r\n\r\n comparator = typeof comparator == 'function' ? comparator : undefined;\r\n if (comparator) {\r\n mapped.pop();\r\n }\r\n return (mapped.length && mapped[0] === arrays[0])\r\n ? baseIntersection(mapped, undefined, comparator)\r\n : [];\r\n });\r\n\r\n /**\r\n * Converts all elements in `array` into a string separated by `separator`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to convert.\r\n * @param {string} [separator=','] The element separator.\r\n * @returns {string} Returns the joined string.\r\n * @example\r\n *\r\n * _.join(['a', 'b', 'c'], '~');\r\n * // => 'a~b~c'\r\n */\r\n function join(array, separator) {\r\n return array == null ? '' : nativeJoin.call(array, separator);\r\n }\r\n\r\n /**\r\n * Gets the last element of `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @returns {*} Returns the last element of `array`.\r\n * @example\r\n *\r\n * _.last([1, 2, 3]);\r\n * // => 3\r\n */\r\n function last(array) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? array[length - 1] : undefined;\r\n }\r\n\r\n /**\r\n * This method is like `_.indexOf` except that it iterates over elements of\r\n * `array` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} [fromIndex=array.length-1] The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n * @example\r\n *\r\n * _.lastIndexOf([1, 2, 1, 2], 2);\r\n * // => 3\r\n *\r\n * // Search from the `fromIndex`.\r\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\r\n * // => 1\r\n */\r\n function lastIndexOf(array, value, fromIndex) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return -1;\r\n }\r\n var index = length;\r\n if (fromIndex !== undefined) {\r\n index = toInteger(fromIndex);\r\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\r\n }\r\n return value === value\r\n ? strictLastIndexOf(array, value, index)\r\n : baseFindIndex(array, baseIsNaN, index, true);\r\n }\r\n\r\n /**\r\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\r\n * element from the end is returned.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.11.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {number} [n=0] The index of the element to return.\r\n * @returns {*} Returns the nth element of `array`.\r\n * @example\r\n *\r\n * var array = ['a', 'b', 'c', 'd'];\r\n *\r\n * _.nth(array, 1);\r\n * // => 'b'\r\n *\r\n * _.nth(array, -2);\r\n * // => 'c';\r\n */\r\n function nth(array, n) {\r\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\r\n }\r\n\r\n /**\r\n * Removes all given values from `array` using\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons.\r\n *\r\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\r\n * to remove elements from an array by predicate.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {...*} [values] The values to remove.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\r\n *\r\n * _.pull(array, 'a', 'c');\r\n * console.log(array);\r\n * // => ['b', 'b']\r\n */\r\n var pull = baseRest(pullAll);\r\n\r\n /**\r\n * This method is like `_.pull` except that it accepts an array of values to remove.\r\n *\r\n * **Note:** Unlike `_.difference`, this method mutates `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to remove.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\r\n *\r\n * _.pullAll(array, ['a', 'c']);\r\n * console.log(array);\r\n * // => ['b', 'b']\r\n */\r\n function pullAll(array, values) {\r\n return (array && array.length && values && values.length)\r\n ? basePullAll(array, values)\r\n : array;\r\n }\r\n\r\n /**\r\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\r\n * invoked for each element of `array` and `values` to generate the criterion\r\n * by which they're compared. The iteratee is invoked with one argument: (value).\r\n *\r\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to remove.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\r\n *\r\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\r\n * console.log(array);\r\n * // => [{ 'x': 2 }]\r\n */\r\n function pullAllBy(array, values, iteratee) {\r\n return (array && array.length && values && values.length)\r\n ? basePullAll(array, values, getIteratee(iteratee, 2))\r\n : array;\r\n }\r\n\r\n /**\r\n * This method is like `_.pullAll` except that it accepts `comparator` which\r\n * is invoked to compare elements of `array` to `values`. The comparator is\r\n * invoked with two arguments: (arrVal, othVal).\r\n *\r\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.6.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to remove.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\r\n *\r\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\r\n * console.log(array);\r\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\r\n */\r\n function pullAllWith(array, values, comparator) {\r\n return (array && array.length && values && values.length)\r\n ? basePullAll(array, values, undefined, comparator)\r\n : array;\r\n }\r\n\r\n /**\r\n * Removes elements from `array` corresponding to `indexes` and returns an\r\n * array of removed elements.\r\n *\r\n * **Note:** Unlike `_.at`, this method mutates `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\r\n * @returns {Array} Returns the new array of removed elements.\r\n * @example\r\n *\r\n * var array = ['a', 'b', 'c', 'd'];\r\n * var pulled = _.pullAt(array, [1, 3]);\r\n *\r\n * console.log(array);\r\n * // => ['a', 'c']\r\n *\r\n * console.log(pulled);\r\n * // => ['b', 'd']\r\n */\r\n var pullAt = flatRest(function(array, indexes) {\r\n var length = array == null ? 0 : array.length,\r\n result = baseAt(array, indexes);\r\n\r\n basePullAt(array, arrayMap(indexes, function(index) {\r\n return isIndex(index, length) ? +index : index;\r\n }).sort(compareAscending));\r\n\r\n return result;\r\n });\r\n\r\n /**\r\n * Removes all elements from `array` that `predicate` returns truthy for\r\n * and returns an array of the removed elements. The predicate is invoked\r\n * with three arguments: (value, index, array).\r\n *\r\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\r\n * to pull elements from an array by value.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new array of removed elements.\r\n * @example\r\n *\r\n * var array = [1, 2, 3, 4];\r\n * var evens = _.remove(array, function(n) {\r\n * return n % 2 == 0;\r\n * });\r\n *\r\n * console.log(array);\r\n * // => [1, 3]\r\n *\r\n * console.log(evens);\r\n * // => [2, 4]\r\n */\r\n function remove(array, predicate) {\r\n var result = [];\r\n if (!(array && array.length)) {\r\n return result;\r\n }\r\n var index = -1,\r\n indexes = [],\r\n length = array.length;\r\n\r\n predicate = getIteratee(predicate, 3);\r\n while (++index < length) {\r\n var value = array[index];\r\n if (predicate(value, index, array)) {\r\n result.push(value);\r\n indexes.push(index);\r\n }\r\n }\r\n basePullAt(array, indexes);\r\n return result;\r\n }\r\n\r\n /**\r\n * Reverses `array` so that the first element becomes the last, the second\r\n * element becomes the second to last, and so on.\r\n *\r\n * **Note:** This method mutates `array` and is based on\r\n * [`Array#reverse`](https://mdn.io/Array/reverse).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to modify.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = [1, 2, 3];\r\n *\r\n * _.reverse(array);\r\n * // => [3, 2, 1]\r\n *\r\n * console.log(array);\r\n * // => [3, 2, 1]\r\n */\r\n function reverse(array) {\r\n return array == null ? array : nativeReverse.call(array);\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` from `start` up to, but not including, `end`.\r\n *\r\n * **Note:** This method is used instead of\r\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\r\n * returned.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to slice.\r\n * @param {number} [start=0] The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns the slice of `array`.\r\n */\r\n function slice(array, start, end) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\r\n start = 0;\r\n end = length;\r\n }\r\n else {\r\n start = start == null ? 0 : toInteger(start);\r\n end = end === undefined ? length : toInteger(end);\r\n }\r\n return baseSlice(array, start, end);\r\n }\r\n\r\n /**\r\n * Uses a binary search to determine the lowest index at which `value`\r\n * should be inserted into `array` in order to maintain its sort order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n * @example\r\n *\r\n * _.sortedIndex([30, 50], 40);\r\n * // => 1\r\n */\r\n function sortedIndex(array, value) {\r\n return baseSortedIndex(array, value);\r\n }\r\n\r\n /**\r\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\r\n * which is invoked for `value` and each element of `array` to compute their\r\n * sort ranking. The iteratee is invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\r\n *\r\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\r\n * // => 0\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\r\n * // => 0\r\n */\r\n function sortedIndexBy(array, value, iteratee) {\r\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\r\n }\r\n\r\n /**\r\n * This method is like `_.indexOf` except that it performs a binary\r\n * search on a sorted `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n * @example\r\n *\r\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\r\n * // => 1\r\n */\r\n function sortedIndexOf(array, value) {\r\n var length = array == null ? 0 : array.length;\r\n if (length) {\r\n var index = baseSortedIndex(array, value);\r\n if (index < length && eq(array[index], value)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * This method is like `_.sortedIndex` except that it returns the highest\r\n * index at which `value` should be inserted into `array` in order to\r\n * maintain its sort order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n * @example\r\n *\r\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\r\n * // => 4\r\n */\r\n function sortedLastIndex(array, value) {\r\n return baseSortedIndex(array, value, true);\r\n }\r\n\r\n /**\r\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\r\n * which is invoked for `value` and each element of `array` to compute their\r\n * sort ranking. The iteratee is invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The sorted array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\r\n *\r\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\r\n * // => 1\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\r\n * // => 1\r\n */\r\n function sortedLastIndexBy(array, value, iteratee) {\r\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\r\n }\r\n\r\n /**\r\n * This method is like `_.lastIndexOf` except that it performs a binary\r\n * search on a sorted `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n * @example\r\n *\r\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\r\n * // => 3\r\n */\r\n function sortedLastIndexOf(array, value) {\r\n var length = array == null ? 0 : array.length;\r\n if (length) {\r\n var index = baseSortedIndex(array, value, true) - 1;\r\n if (eq(array[index], value)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * This method is like `_.uniq` except that it's designed and optimized\r\n * for sorted arrays.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @returns {Array} Returns the new duplicate free array.\r\n * @example\r\n *\r\n * _.sortedUniq([1, 1, 2]);\r\n * // => [1, 2]\r\n */\r\n function sortedUniq(array) {\r\n return (array && array.length)\r\n ? baseSortedUniq(array)\r\n : [];\r\n }\r\n\r\n /**\r\n * This method is like `_.uniqBy` except that it's designed and optimized\r\n * for sorted arrays.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [iteratee] The iteratee invoked per element.\r\n * @returns {Array} Returns the new duplicate free array.\r\n * @example\r\n *\r\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\r\n * // => [1.1, 2.3]\r\n */\r\n function sortedUniqBy(array, iteratee) {\r\n return (array && array.length)\r\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\r\n : [];\r\n }\r\n\r\n /**\r\n * Gets all but the first element of `array`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.tail([1, 2, 3]);\r\n * // => [2, 3]\r\n */\r\n function tail(array) {\r\n var length = array == null ? 0 : array.length;\r\n return length ? baseSlice(array, 1, length) : [];\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` with `n` elements taken from the beginning.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {number} [n=1] The number of elements to take.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.take([1, 2, 3]);\r\n * // => [1]\r\n *\r\n * _.take([1, 2, 3], 2);\r\n * // => [1, 2]\r\n *\r\n * _.take([1, 2, 3], 5);\r\n * // => [1, 2, 3]\r\n *\r\n * _.take([1, 2, 3], 0);\r\n * // => []\r\n */\r\n function take(array, n, guard) {\r\n if (!(array && array.length)) {\r\n return [];\r\n }\r\n n = (guard || n === undefined) ? 1 : toInteger(n);\r\n return baseSlice(array, 0, n < 0 ? 0 : n);\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` with `n` elements taken from the end.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {number} [n=1] The number of elements to take.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * _.takeRight([1, 2, 3]);\r\n * // => [3]\r\n *\r\n * _.takeRight([1, 2, 3], 2);\r\n * // => [2, 3]\r\n *\r\n * _.takeRight([1, 2, 3], 5);\r\n * // => [1, 2, 3]\r\n *\r\n * _.takeRight([1, 2, 3], 0);\r\n * // => []\r\n */\r\n function takeRight(array, n, guard) {\r\n var length = array == null ? 0 : array.length;\r\n if (!length) {\r\n return [];\r\n }\r\n n = (guard || n === undefined) ? 1 : toInteger(n);\r\n n = length - n;\r\n return baseSlice(array, n < 0 ? 0 : n, length);\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` with elements taken from the end. Elements are\r\n * taken until `predicate` returns falsey. The predicate is invoked with\r\n * three arguments: (value, index, array).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': true },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': false }\r\n * ];\r\n *\r\n * _.takeRightWhile(users, function(o) { return !o.active; });\r\n * // => objects for ['fred', 'pebbles']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\r\n * // => objects for ['pebbles']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.takeRightWhile(users, ['active', false]);\r\n * // => objects for ['fred', 'pebbles']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.takeRightWhile(users, 'active');\r\n * // => []\r\n */\r\n function takeRightWhile(array, predicate) {\r\n return (array && array.length)\r\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\r\n : [];\r\n }\r\n\r\n /**\r\n * Creates a slice of `array` with elements taken from the beginning. Elements\r\n * are taken until `predicate` returns falsey. The predicate is invoked with\r\n * three arguments: (value, index, array).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Array\r\n * @param {Array} array The array to query.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the slice of `array`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': false },\r\n * { 'user': 'fred', 'active': false },\r\n * { 'user': 'pebbles', 'active': true }\r\n * ];\r\n *\r\n * _.takeWhile(users, function(o) { return !o.active; });\r\n * // => objects for ['barney', 'fred']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\r\n * // => objects for ['barney']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.takeWhile(users, ['active', false]);\r\n * // => objects for ['barney', 'fred']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.takeWhile(users, 'active');\r\n * // => []\r\n */\r\n function takeWhile(array, predicate) {\r\n return (array && array.length)\r\n ? baseWhile(array, getIteratee(predicate, 3))\r\n : [];\r\n }\r\n\r\n /**\r\n * Creates an array of unique values, in order, from all given arrays using\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @returns {Array} Returns the new array of combined values.\r\n * @example\r\n *\r\n * _.union([2], [1, 2]);\r\n * // => [2, 1]\r\n */\r\n var union = baseRest(function(arrays) {\r\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\r\n });\r\n\r\n /**\r\n * This method is like `_.union` except that it accepts `iteratee` which is\r\n * invoked for each element of each `arrays` to generate the criterion by\r\n * which uniqueness is computed. Result values are chosen from the first\r\n * array in which the value occurs. The iteratee is invoked with one argument:\r\n * (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns the new array of combined values.\r\n * @example\r\n *\r\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\r\n * // => [2.1, 1.2]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\r\n * // => [{ 'x': 1 }, { 'x': 2 }]\r\n */\r\n var unionBy = baseRest(function(arrays) {\r\n var iteratee = last(arrays);\r\n if (isArrayLikeObject(iteratee)) {\r\n iteratee = undefined;\r\n }\r\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\r\n });\r\n\r\n /**\r\n * This method is like `_.union` except that it accepts `comparator` which\r\n * is invoked to compare elements of `arrays`. Result values are chosen from\r\n * the first array in which the value occurs. The comparator is invoked\r\n * with two arguments: (arrVal, othVal).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of combined values.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\r\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\r\n *\r\n * _.unionWith(objects, others, _.isEqual);\r\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\r\n */\r\n var unionWith = baseRest(function(arrays) {\r\n var comparator = last(arrays);\r\n comparator = typeof comparator == 'function' ? comparator : undefined;\r\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\r\n });\r\n\r\n /**\r\n * Creates a duplicate-free version of an array, using\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons, in which only the first occurrence of each element\r\n * is kept. The order of result values is determined by the order they occur\r\n * in the array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @returns {Array} Returns the new duplicate free array.\r\n * @example\r\n *\r\n * _.uniq([2, 1, 2]);\r\n * // => [2, 1]\r\n */\r\n function uniq(array) {\r\n return (array && array.length) ? baseUniq(array) : [];\r\n }\r\n\r\n /**\r\n * This method is like `_.uniq` except that it accepts `iteratee` which is\r\n * invoked for each element in `array` to generate the criterion by which\r\n * uniqueness is computed. The order of result values is determined by the\r\n * order they occur in the array. The iteratee is invoked with one argument:\r\n * (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns the new duplicate free array.\r\n * @example\r\n *\r\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\r\n * // => [2.1, 1.2]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n * // => [{ 'x': 1 }, { 'x': 2 }]\r\n */\r\n function uniqBy(array, iteratee) {\r\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\r\n }\r\n\r\n /**\r\n * This method is like `_.uniq` except that it accepts `comparator` which\r\n * is invoked to compare elements of `array`. The order of result values is\r\n * determined by the order they occur in the array.The comparator is invoked\r\n * with two arguments: (arrVal, othVal).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new duplicate free array.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\r\n *\r\n * _.uniqWith(objects, _.isEqual);\r\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\r\n */\r\n function uniqWith(array, comparator) {\r\n comparator = typeof comparator == 'function' ? comparator : undefined;\r\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\r\n }\r\n\r\n /**\r\n * This method is like `_.zip` except that it accepts an array of grouped\r\n * elements and creates an array regrouping the elements to their pre-zip\r\n * configuration.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.2.0\r\n * @category Array\r\n * @param {Array} array The array of grouped elements to process.\r\n * @returns {Array} Returns the new array of regrouped elements.\r\n * @example\r\n *\r\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\r\n * // => [['a', 1, true], ['b', 2, false]]\r\n *\r\n * _.unzip(zipped);\r\n * // => [['a', 'b'], [1, 2], [true, false]]\r\n */\r\n function unzip(array) {\r\n if (!(array && array.length)) {\r\n return [];\r\n }\r\n var length = 0;\r\n array = arrayFilter(array, function(group) {\r\n if (isArrayLikeObject(group)) {\r\n length = nativeMax(group.length, length);\r\n return true;\r\n }\r\n });\r\n return baseTimes(length, function(index) {\r\n return arrayMap(array, baseProperty(index));\r\n });\r\n }\r\n\r\n /**\r\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\r\n * how regrouped values should be combined. The iteratee is invoked with the\r\n * elements of each group: (...group).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.8.0\r\n * @category Array\r\n * @param {Array} array The array of grouped elements to process.\r\n * @param {Function} [iteratee=_.identity] The function to combine\r\n * regrouped values.\r\n * @returns {Array} Returns the new array of regrouped elements.\r\n * @example\r\n *\r\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\r\n * // => [[1, 10, 100], [2, 20, 200]]\r\n *\r\n * _.unzipWith(zipped, _.add);\r\n * // => [3, 30, 300]\r\n */\r\n function unzipWith(array, iteratee) {\r\n if (!(array && array.length)) {\r\n return [];\r\n }\r\n var result = unzip(array);\r\n if (iteratee == null) {\r\n return result;\r\n }\r\n return arrayMap(result, function(group) {\r\n return apply(iteratee, undefined, group);\r\n });\r\n }\r\n\r\n /**\r\n * Creates an array excluding all given values using\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * for equality comparisons.\r\n *\r\n * **Note:** Unlike `_.pull`, this method returns a new array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {Array} array The array to inspect.\r\n * @param {...*} [values] The values to exclude.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @see _.difference, _.xor\r\n * @example\r\n *\r\n * _.without([2, 1, 2, 3], 1, 2);\r\n * // => [3]\r\n */\r\n var without = baseRest(function(array, values) {\r\n return isArrayLikeObject(array)\r\n ? baseDifference(array, values)\r\n : [];\r\n });\r\n\r\n /**\r\n * Creates an array of unique values that is the\r\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\r\n * of the given arrays. The order of result values is determined by the order\r\n * they occur in the arrays.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.4.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @see _.difference, _.without\r\n * @example\r\n *\r\n * _.xor([2, 1], [2, 3]);\r\n * // => [1, 3]\r\n */\r\n var xor = baseRest(function(arrays) {\r\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\r\n });\r\n\r\n /**\r\n * This method is like `_.xor` except that it accepts `iteratee` which is\r\n * invoked for each element of each `arrays` to generate the criterion by\r\n * which by which they're compared. The order of result values is determined\r\n * by the order they occur in the arrays. The iteratee is invoked with one\r\n * argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @example\r\n *\r\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\r\n * // => [1.2, 3.4]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\r\n * // => [{ 'x': 2 }]\r\n */\r\n var xorBy = baseRest(function(arrays) {\r\n var iteratee = last(arrays);\r\n if (isArrayLikeObject(iteratee)) {\r\n iteratee = undefined;\r\n }\r\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\r\n });\r\n\r\n /**\r\n * This method is like `_.xor` except that it accepts `comparator` which is\r\n * invoked to compare elements of `arrays`. The order of result values is\r\n * determined by the order they occur in the arrays. The comparator is invoked\r\n * with two arguments: (arrVal, othVal).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to inspect.\r\n * @param {Function} [comparator] The comparator invoked per element.\r\n * @returns {Array} Returns the new array of filtered values.\r\n * @example\r\n *\r\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\r\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\r\n *\r\n * _.xorWith(objects, others, _.isEqual);\r\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\r\n */\r\n var xorWith = baseRest(function(arrays) {\r\n var comparator = last(arrays);\r\n comparator = typeof comparator == 'function' ? comparator : undefined;\r\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\r\n });\r\n\r\n /**\r\n * Creates an array of grouped elements, the first of which contains the\r\n * first elements of the given arrays, the second of which contains the\r\n * second elements of the given arrays, and so on.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to process.\r\n * @returns {Array} Returns the new array of grouped elements.\r\n * @example\r\n *\r\n * _.zip(['a', 'b'], [1, 2], [true, false]);\r\n * // => [['a', 1, true], ['b', 2, false]]\r\n */\r\n var zip = baseRest(unzip);\r\n\r\n /**\r\n * This method is like `_.fromPairs` except that it accepts two arrays,\r\n * one of property identifiers and one of corresponding values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.4.0\r\n * @category Array\r\n * @param {Array} [props=[]] The property identifiers.\r\n * @param {Array} [values=[]] The property values.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * _.zipObject(['a', 'b'], [1, 2]);\r\n * // => { 'a': 1, 'b': 2 }\r\n */\r\n function zipObject(props, values) {\r\n return baseZipObject(props || [], values || [], assignValue);\r\n }\r\n\r\n /**\r\n * This method is like `_.zipObject` except that it supports property paths.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.1.0\r\n * @category Array\r\n * @param {Array} [props=[]] The property identifiers.\r\n * @param {Array} [values=[]] The property values.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\r\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\r\n */\r\n function zipObjectDeep(props, values) {\r\n return baseZipObject(props || [], values || [], baseSet);\r\n }\r\n\r\n /**\r\n * This method is like `_.zip` except that it accepts `iteratee` to specify\r\n * how grouped values should be combined. The iteratee is invoked with the\r\n * elements of each group: (...group).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.8.0\r\n * @category Array\r\n * @param {...Array} [arrays] The arrays to process.\r\n * @param {Function} [iteratee=_.identity] The function to combine\r\n * grouped values.\r\n * @returns {Array} Returns the new array of grouped elements.\r\n * @example\r\n *\r\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\r\n * return a + b + c;\r\n * });\r\n * // => [111, 222]\r\n */\r\n var zipWith = baseRest(function(arrays) {\r\n var length = arrays.length,\r\n iteratee = length > 1 ? arrays[length - 1] : undefined;\r\n\r\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\r\n return unzipWith(arrays, iteratee);\r\n });\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\r\n * chain sequences enabled. The result of such sequences must be unwrapped\r\n * with `_#value`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.3.0\r\n * @category Seq\r\n * @param {*} value The value to wrap.\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36 },\r\n * { 'user': 'fred', 'age': 40 },\r\n * { 'user': 'pebbles', 'age': 1 }\r\n * ];\r\n *\r\n * var youngest = _\r\n * .chain(users)\r\n * .sortBy('age')\r\n * .map(function(o) {\r\n * return o.user + ' is ' + o.age;\r\n * })\r\n * .head()\r\n * .value();\r\n * // => 'pebbles is 1'\r\n */\r\n function chain(value) {\r\n var result = lodash(value);\r\n result.__chain__ = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * This method invokes `interceptor` and returns `value`. The interceptor\r\n * is invoked with one argument; (value). The purpose of this method is to\r\n * \"tap into\" a method chain sequence in order to modify intermediate results.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Seq\r\n * @param {*} value The value to provide to `interceptor`.\r\n * @param {Function} interceptor The function to invoke.\r\n * @returns {*} Returns `value`.\r\n * @example\r\n *\r\n * _([1, 2, 3])\r\n * .tap(function(array) {\r\n * // Mutate input array.\r\n * array.pop();\r\n * })\r\n * .reverse()\r\n * .value();\r\n * // => [2, 1]\r\n */\r\n function tap(value, interceptor) {\r\n interceptor(value);\r\n return value;\r\n }\r\n\r\n /**\r\n * This method is like `_.tap` except that it returns the result of `interceptor`.\r\n * The purpose of this method is to \"pass thru\" values replacing intermediate\r\n * results in a method chain sequence.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Seq\r\n * @param {*} value The value to provide to `interceptor`.\r\n * @param {Function} interceptor The function to invoke.\r\n * @returns {*} Returns the result of `interceptor`.\r\n * @example\r\n *\r\n * _(' abc ')\r\n * .chain()\r\n * .trim()\r\n * .thru(function(value) {\r\n * return [value];\r\n * })\r\n * .value();\r\n * // => ['abc']\r\n */\r\n function thru(value, interceptor) {\r\n return interceptor(value);\r\n }\r\n\r\n /**\r\n * This method is the wrapper version of `_.at`.\r\n *\r\n * @name at\r\n * @memberOf _\r\n * @since 1.0.0\r\n * @category Seq\r\n * @param {...(string|string[])} [paths] The property paths to pick.\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\r\n *\r\n * _(object).at(['a[0].b.c', 'a[1]']).value();\r\n * // => [3, 4]\r\n */\r\n var wrapperAt = flatRest(function(paths) {\r\n var length = paths.length,\r\n start = length ? paths[0] : 0,\r\n value = this.__wrapped__,\r\n interceptor = function(object) { return baseAt(object, paths); };\r\n\r\n if (length > 1 || this.__actions__.length ||\r\n !(value instanceof LazyWrapper) || !isIndex(start)) {\r\n return this.thru(interceptor);\r\n }\r\n value = value.slice(start, +start + (length ? 1 : 0));\r\n value.__actions__.push({\r\n 'func': thru,\r\n 'args': [interceptor],\r\n 'thisArg': undefined\r\n });\r\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\r\n if (length && !array.length) {\r\n array.push(undefined);\r\n }\r\n return array;\r\n });\r\n });\r\n\r\n /**\r\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\r\n *\r\n * @name chain\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Seq\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36 },\r\n * { 'user': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * // A sequence without explicit chaining.\r\n * _(users).head();\r\n * // => { 'user': 'barney', 'age': 36 }\r\n *\r\n * // A sequence with explicit chaining.\r\n * _(users)\r\n * .chain()\r\n * .head()\r\n * .pick('user')\r\n * .value();\r\n * // => { 'user': 'barney' }\r\n */\r\n function wrapperChain() {\r\n return chain(this);\r\n }\r\n\r\n /**\r\n * Executes the chain sequence and returns the wrapped result.\r\n *\r\n * @name commit\r\n * @memberOf _\r\n * @since 3.2.0\r\n * @category Seq\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * var array = [1, 2];\r\n * var wrapped = _(array).push(3);\r\n *\r\n * console.log(array);\r\n * // => [1, 2]\r\n *\r\n * wrapped = wrapped.commit();\r\n * console.log(array);\r\n * // => [1, 2, 3]\r\n *\r\n * wrapped.last();\r\n * // => 3\r\n *\r\n * console.log(array);\r\n * // => [1, 2, 3]\r\n */\r\n function wrapperCommit() {\r\n return new LodashWrapper(this.value(), this.__chain__);\r\n }\r\n\r\n /**\r\n * Gets the next value on a wrapped object following the\r\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\r\n *\r\n * @name next\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Seq\r\n * @returns {Object} Returns the next iterator value.\r\n * @example\r\n *\r\n * var wrapped = _([1, 2]);\r\n *\r\n * wrapped.next();\r\n * // => { 'done': false, 'value': 1 }\r\n *\r\n * wrapped.next();\r\n * // => { 'done': false, 'value': 2 }\r\n *\r\n * wrapped.next();\r\n * // => { 'done': true, 'value': undefined }\r\n */\r\n function wrapperNext() {\r\n if (this.__values__ === undefined) {\r\n this.__values__ = toArray(this.value());\r\n }\r\n var done = this.__index__ >= this.__values__.length,\r\n value = done ? undefined : this.__values__[this.__index__++];\r\n\r\n return { 'done': done, 'value': value };\r\n }\r\n\r\n /**\r\n * Enables the wrapper to be iterable.\r\n *\r\n * @name Symbol.iterator\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Seq\r\n * @returns {Object} Returns the wrapper object.\r\n * @example\r\n *\r\n * var wrapped = _([1, 2]);\r\n *\r\n * wrapped[Symbol.iterator]() === wrapped;\r\n * // => true\r\n *\r\n * Array.from(wrapped);\r\n * // => [1, 2]\r\n */\r\n function wrapperToIterator() {\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\r\n *\r\n * @name plant\r\n * @memberOf _\r\n * @since 3.2.0\r\n * @category Seq\r\n * @param {*} value The value to plant.\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * function square(n) {\r\n * return n * n;\r\n * }\r\n *\r\n * var wrapped = _([1, 2]).map(square);\r\n * var other = wrapped.plant([3, 4]);\r\n *\r\n * other.value();\r\n * // => [9, 16]\r\n *\r\n * wrapped.value();\r\n * // => [1, 4]\r\n */\r\n function wrapperPlant(value) {\r\n var result,\r\n parent = this;\r\n\r\n while (parent instanceof baseLodash) {\r\n var clone = wrapperClone(parent);\r\n clone.__index__ = 0;\r\n clone.__values__ = undefined;\r\n if (result) {\r\n previous.__wrapped__ = clone;\r\n } else {\r\n result = clone;\r\n }\r\n var previous = clone;\r\n parent = parent.__wrapped__;\r\n }\r\n previous.__wrapped__ = value;\r\n return result;\r\n }\r\n\r\n /**\r\n * This method is the wrapper version of `_.reverse`.\r\n *\r\n * **Note:** This method mutates the wrapped array.\r\n *\r\n * @name reverse\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Seq\r\n * @returns {Object} Returns the new `lodash` wrapper instance.\r\n * @example\r\n *\r\n * var array = [1, 2, 3];\r\n *\r\n * _(array).reverse().value()\r\n * // => [3, 2, 1]\r\n *\r\n * console.log(array);\r\n * // => [3, 2, 1]\r\n */\r\n function wrapperReverse() {\r\n var value = this.__wrapped__;\r\n if (value instanceof LazyWrapper) {\r\n var wrapped = value;\r\n if (this.__actions__.length) {\r\n wrapped = new LazyWrapper(this);\r\n }\r\n wrapped = wrapped.reverse();\r\n wrapped.__actions__.push({\r\n 'func': thru,\r\n 'args': [reverse],\r\n 'thisArg': undefined\r\n });\r\n return new LodashWrapper(wrapped, this.__chain__);\r\n }\r\n return this.thru(reverse);\r\n }\r\n\r\n /**\r\n * Executes the chain sequence to resolve the unwrapped value.\r\n *\r\n * @name value\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @alias toJSON, valueOf\r\n * @category Seq\r\n * @returns {*} Returns the resolved unwrapped value.\r\n * @example\r\n *\r\n * _([1, 2, 3]).value();\r\n * // => [1, 2, 3]\r\n */\r\n function wrapperValue() {\r\n return baseWrapperValue(this.__wrapped__, this.__actions__);\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of `collection` thru `iteratee`. The corresponding value of\r\n * each key is the number of times the key was returned by `iteratee`. The\r\n * iteratee is invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.5.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\r\n * // => { '4': 1, '6': 2 }\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.countBy(['one', 'two', 'three'], 'length');\r\n * // => { '3': 2, '5': 1 }\r\n */\r\n var countBy = createAggregator(function(result, value, key) {\r\n if (hasOwnProperty.call(result, key)) {\r\n ++result[key];\r\n } else {\r\n baseAssignValue(result, key, 1);\r\n }\r\n });\r\n\r\n /**\r\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\r\n * Iteration is stopped once `predicate` returns falsey. The predicate is\r\n * invoked with three arguments: (value, index|key, collection).\r\n *\r\n * **Note:** This method returns `true` for\r\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\r\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\r\n * elements of empty collections.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.every([true, 1, null, 'yes'], Boolean);\r\n * // => false\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36, 'active': false },\r\n * { 'user': 'fred', 'age': 40, 'active': false }\r\n * ];\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.every(users, { 'user': 'barney', 'active': false });\r\n * // => false\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.every(users, ['active', false]);\r\n * // => true\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.every(users, 'active');\r\n * // => false\r\n */\r\n function every(collection, predicate, guard) {\r\n var func = isArray(collection) ? arrayEvery : baseEvery;\r\n if (guard && isIterateeCall(collection, predicate, guard)) {\r\n predicate = undefined;\r\n }\r\n return func(collection, getIteratee(predicate, 3));\r\n }\r\n\r\n /**\r\n * Iterates over elements of `collection`, returning an array of all elements\r\n * `predicate` returns truthy for. The predicate is invoked with three\r\n * arguments: (value, index|key, collection).\r\n *\r\n * **Note:** Unlike `_.remove`, this method returns a new array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new filtered array.\r\n * @see _.reject\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36, 'active': true },\r\n * { 'user': 'fred', 'age': 40, 'active': false }\r\n * ];\r\n *\r\n * _.filter(users, function(o) { return !o.active; });\r\n * // => objects for ['fred']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.filter(users, { 'age': 36, 'active': true });\r\n * // => objects for ['barney']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.filter(users, ['active', false]);\r\n * // => objects for ['fred']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.filter(users, 'active');\r\n * // => objects for ['barney']\r\n *\r\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\r\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\r\n * // => objects for ['fred', 'barney']\r\n */\r\n function filter(collection, predicate) {\r\n var func = isArray(collection) ? arrayFilter : baseFilter;\r\n return func(collection, getIteratee(predicate, 3));\r\n }\r\n\r\n /**\r\n * Iterates over elements of `collection`, returning the first element\r\n * `predicate` returns truthy for. The predicate is invoked with three\r\n * arguments: (value, index|key, collection).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @returns {*} Returns the matched element, else `undefined`.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36, 'active': true },\r\n * { 'user': 'fred', 'age': 40, 'active': false },\r\n * { 'user': 'pebbles', 'age': 1, 'active': true }\r\n * ];\r\n *\r\n * _.find(users, function(o) { return o.age < 40; });\r\n * // => object for 'barney'\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.find(users, { 'age': 1, 'active': true });\r\n * // => object for 'pebbles'\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.find(users, ['active', false]);\r\n * // => object for 'fred'\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.find(users, 'active');\r\n * // => object for 'barney'\r\n */\r\n var find = createFind(findIndex);\r\n\r\n /**\r\n * This method is like `_.find` except that it iterates over elements of\r\n * `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param {number} [fromIndex=collection.length-1] The index to search from.\r\n * @returns {*} Returns the matched element, else `undefined`.\r\n * @example\r\n *\r\n * _.findLast([1, 2, 3, 4], function(n) {\r\n * return n % 2 == 1;\r\n * });\r\n * // => 3\r\n */\r\n var findLast = createFind(findLastIndex);\r\n\r\n /**\r\n * Creates a flattened array of values by running each element in `collection`\r\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\r\n * with three arguments: (value, index|key, collection).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * function duplicate(n) {\r\n * return [n, n];\r\n * }\r\n *\r\n * _.flatMap([1, 2], duplicate);\r\n * // => [1, 1, 2, 2]\r\n */\r\n function flatMap(collection, iteratee) {\r\n return baseFlatten(map(collection, iteratee), 1);\r\n }\r\n\r\n /**\r\n * This method is like `_.flatMap` except that it recursively flattens the\r\n * mapped results.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.7.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * function duplicate(n) {\r\n * return [[[n, n]]];\r\n * }\r\n *\r\n * _.flatMapDeep([1, 2], duplicate);\r\n * // => [1, 1, 2, 2]\r\n */\r\n function flatMapDeep(collection, iteratee) {\r\n return baseFlatten(map(collection, iteratee), INFINITY);\r\n }\r\n\r\n /**\r\n * This method is like `_.flatMap` except that it recursively flattens the\r\n * mapped results up to `depth` times.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.7.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @param {number} [depth=1] The maximum recursion depth.\r\n * @returns {Array} Returns the new flattened array.\r\n * @example\r\n *\r\n * function duplicate(n) {\r\n * return [[[n, n]]];\r\n * }\r\n *\r\n * _.flatMapDepth([1, 2], duplicate, 2);\r\n * // => [[1, 1], [2, 2]]\r\n */\r\n function flatMapDepth(collection, iteratee, depth) {\r\n depth = depth === undefined ? 1 : toInteger(depth);\r\n return baseFlatten(map(collection, iteratee), depth);\r\n }\r\n\r\n /**\r\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\r\n * The iteratee is invoked with three arguments: (value, index|key, collection).\r\n * Iteratee functions may exit iteration early by explicitly returning `false`.\r\n *\r\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\r\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\r\n * or `_.forOwn` for object iteration.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @alias each\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Array|Object} Returns `collection`.\r\n * @see _.forEachRight\r\n * @example\r\n *\r\n * _.forEach([1, 2], function(value) {\r\n * console.log(value);\r\n * });\r\n * // => Logs `1` then `2`.\r\n *\r\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\r\n */\r\n function forEach(collection, iteratee) {\r\n var func = isArray(collection) ? arrayEach : baseEach;\r\n return func(collection, getIteratee(iteratee, 3));\r\n }\r\n\r\n /**\r\n * This method is like `_.forEach` except that it iterates over elements of\r\n * `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @alias eachRight\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Array|Object} Returns `collection`.\r\n * @see _.forEach\r\n * @example\r\n *\r\n * _.forEachRight([1, 2], function(value) {\r\n * console.log(value);\r\n * });\r\n * // => Logs `2` then `1`.\r\n */\r\n function forEachRight(collection, iteratee) {\r\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\r\n return func(collection, getIteratee(iteratee, 3));\r\n }\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of `collection` thru `iteratee`. The order of grouped values\r\n * is determined by the order they occur in `collection`. The corresponding\r\n * value of each key is an array of elements responsible for generating the\r\n * key. The iteratee is invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\r\n * // => { '4': [4.2], '6': [6.1, 6.3] }\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.groupBy(['one', 'two', 'three'], 'length');\r\n * // => { '3': ['one', 'two'], '5': ['three'] }\r\n */\r\n var groupBy = createAggregator(function(result, value, key) {\r\n if (hasOwnProperty.call(result, key)) {\r\n result[key].push(value);\r\n } else {\r\n baseAssignValue(result, key, [value]);\r\n }\r\n });\r\n\r\n /**\r\n * Checks if `value` is in `collection`. If `collection` is a string, it's\r\n * checked for a substring of `value`, otherwise\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\r\n * the offset from the end of `collection`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object|string} collection The collection to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\r\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\r\n * @example\r\n *\r\n * _.includes([1, 2, 3], 1);\r\n * // => true\r\n *\r\n * _.includes([1, 2, 3], 1, 2);\r\n * // => false\r\n *\r\n * _.includes({ 'a': 1, 'b': 2 }, 1);\r\n * // => true\r\n *\r\n * _.includes('abcd', 'bc');\r\n * // => true\r\n */\r\n function includes(collection, value, fromIndex, guard) {\r\n collection = isArrayLike(collection) ? collection : values(collection);\r\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\r\n\r\n var length = collection.length;\r\n if (fromIndex < 0) {\r\n fromIndex = nativeMax(length + fromIndex, 0);\r\n }\r\n return isString(collection)\r\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\r\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\r\n }\r\n\r\n /**\r\n * Invokes the method at `path` of each element in `collection`, returning\r\n * an array of the results of each invoked method. Any additional arguments\r\n * are provided to each invoked method. If `path` is a function, it's invoked\r\n * for, and `this` bound to, each element in `collection`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Array|Function|string} path The path of the method to invoke or\r\n * the function invoked per iteration.\r\n * @param {...*} [args] The arguments to invoke each method with.\r\n * @returns {Array} Returns the array of results.\r\n * @example\r\n *\r\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\r\n * // => [[1, 5, 7], [1, 2, 3]]\r\n *\r\n * _.invokeMap([123, 456], String.prototype.split, '');\r\n * // => [['1', '2', '3'], ['4', '5', '6']]\r\n */\r\n var invokeMap = baseRest(function(collection, path, args) {\r\n var index = -1,\r\n isFunc = typeof path == 'function',\r\n result = isArrayLike(collection) ? Array(collection.length) : [];\r\n\r\n baseEach(collection, function(value) {\r\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\r\n });\r\n return result;\r\n });\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of `collection` thru `iteratee`. The corresponding value of\r\n * each key is the last element responsible for generating the key. The\r\n * iteratee is invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * var array = [\r\n * { 'dir': 'left', 'code': 97 },\r\n * { 'dir': 'right', 'code': 100 }\r\n * ];\r\n *\r\n * _.keyBy(array, function(o) {\r\n * return String.fromCharCode(o.code);\r\n * });\r\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n *\r\n * _.keyBy(array, 'dir');\r\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n */\r\n var keyBy = createAggregator(function(result, value, key) {\r\n baseAssignValue(result, key, value);\r\n });\r\n\r\n /**\r\n * Creates an array of values by running each element in `collection` thru\r\n * `iteratee`. The iteratee is invoked with three arguments:\r\n * (value, index|key, collection).\r\n *\r\n * Many lodash methods are guarded to work as iteratees for methods like\r\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\r\n *\r\n * The guarded methods are:\r\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\r\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\r\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\r\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new mapped array.\r\n * @example\r\n *\r\n * function square(n) {\r\n * return n * n;\r\n * }\r\n *\r\n * _.map([4, 8], square);\r\n * // => [16, 64]\r\n *\r\n * _.map({ 'a': 4, 'b': 8 }, square);\r\n * // => [16, 64] (iteration order is not guaranteed)\r\n *\r\n * var users = [\r\n * { 'user': 'barney' },\r\n * { 'user': 'fred' }\r\n * ];\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.map(users, 'user');\r\n * // => ['barney', 'fred']\r\n */\r\n function map(collection, iteratee) {\r\n var func = isArray(collection) ? arrayMap : baseMap;\r\n return func(collection, getIteratee(iteratee, 3));\r\n }\r\n\r\n /**\r\n * This method is like `_.sortBy` except that it allows specifying the sort\r\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\r\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\r\n * descending or \"asc\" for ascending sort order of corresponding values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\r\n * The iteratees to sort by.\r\n * @param {string[]} [orders] The sort orders of `iteratees`.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\r\n * @returns {Array} Returns the new sorted array.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'fred', 'age': 48 },\r\n * { 'user': 'barney', 'age': 34 },\r\n * { 'user': 'fred', 'age': 40 },\r\n * { 'user': 'barney', 'age': 36 }\r\n * ];\r\n *\r\n * // Sort by `user` in ascending order and by `age` in descending order.\r\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\r\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\r\n */\r\n function orderBy(collection, iteratees, orders, guard) {\r\n if (collection == null) {\r\n return [];\r\n }\r\n if (!isArray(iteratees)) {\r\n iteratees = iteratees == null ? [] : [iteratees];\r\n }\r\n orders = guard ? undefined : orders;\r\n if (!isArray(orders)) {\r\n orders = orders == null ? [] : [orders];\r\n }\r\n return baseOrderBy(collection, iteratees, orders);\r\n }\r\n\r\n /**\r\n * Creates an array of elements split into two groups, the first of which\r\n * contains elements `predicate` returns truthy for, the second of which\r\n * contains elements `predicate` returns falsey for. The predicate is\r\n * invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the array of grouped elements.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36, 'active': false },\r\n * { 'user': 'fred', 'age': 40, 'active': true },\r\n * { 'user': 'pebbles', 'age': 1, 'active': false }\r\n * ];\r\n *\r\n * _.partition(users, function(o) { return o.active; });\r\n * // => objects for [['fred'], ['barney', 'pebbles']]\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.partition(users, { 'age': 1, 'active': false });\r\n * // => objects for [['pebbles'], ['barney', 'fred']]\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.partition(users, ['active', false]);\r\n * // => objects for [['barney', 'pebbles'], ['fred']]\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.partition(users, 'active');\r\n * // => objects for [['fred'], ['barney', 'pebbles']]\r\n */\r\n var partition = createAggregator(function(result, value, key) {\r\n result[key ? 0 : 1].push(value);\r\n }, function() { return [[], []]; });\r\n\r\n /**\r\n * Reduces `collection` to a value which is the accumulated result of running\r\n * each element in `collection` thru `iteratee`, where each successive\r\n * invocation is supplied the return value of the previous. If `accumulator`\r\n * is not given, the first element of `collection` is used as the initial\r\n * value. The iteratee is invoked with four arguments:\r\n * (accumulator, value, index|key, collection).\r\n *\r\n * Many lodash methods are guarded to work as iteratees for methods like\r\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\r\n *\r\n * The guarded methods are:\r\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\r\n * and `sortBy`\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @param {*} [accumulator] The initial value.\r\n * @returns {*} Returns the accumulated value.\r\n * @see _.reduceRight\r\n * @example\r\n *\r\n * _.reduce([1, 2], function(sum, n) {\r\n * return sum + n;\r\n * }, 0);\r\n * // => 3\r\n *\r\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\r\n * (result[value] || (result[value] = [])).push(key);\r\n * return result;\r\n * }, {});\r\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\r\n */\r\n function reduce(collection, iteratee, accumulator) {\r\n var func = isArray(collection) ? arrayReduce : baseReduce,\r\n initAccum = arguments.length < 3;\r\n\r\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\r\n }\r\n\r\n /**\r\n * This method is like `_.reduce` except that it iterates over elements of\r\n * `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @param {*} [accumulator] The initial value.\r\n * @returns {*} Returns the accumulated value.\r\n * @see _.reduce\r\n * @example\r\n *\r\n * var array = [[0, 1], [2, 3], [4, 5]];\r\n *\r\n * _.reduceRight(array, function(flattened, other) {\r\n * return flattened.concat(other);\r\n * }, []);\r\n * // => [4, 5, 2, 3, 0, 1]\r\n */\r\n function reduceRight(collection, iteratee, accumulator) {\r\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\r\n initAccum = arguments.length < 3;\r\n\r\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\r\n }\r\n\r\n /**\r\n * The opposite of `_.filter`; this method returns the elements of `collection`\r\n * that `predicate` does **not** return truthy for.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {Array} Returns the new filtered array.\r\n * @see _.filter\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'age': 36, 'active': false },\r\n * { 'user': 'fred', 'age': 40, 'active': true }\r\n * ];\r\n *\r\n * _.reject(users, function(o) { return !o.active; });\r\n * // => objects for ['fred']\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.reject(users, { 'age': 40, 'active': true });\r\n * // => objects for ['barney']\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.reject(users, ['active', false]);\r\n * // => objects for ['fred']\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.reject(users, 'active');\r\n * // => objects for ['barney']\r\n */\r\n function reject(collection, predicate) {\r\n var func = isArray(collection) ? arrayFilter : baseFilter;\r\n return func(collection, negate(getIteratee(predicate, 3)));\r\n }\r\n\r\n /**\r\n * Gets a random element from `collection`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to sample.\r\n * @returns {*} Returns the random element.\r\n * @example\r\n *\r\n * _.sample([1, 2, 3, 4]);\r\n * // => 2\r\n */\r\n function sample(collection) {\r\n var func = isArray(collection) ? arraySample : baseSample;\r\n return func(collection);\r\n }\r\n\r\n /**\r\n * Gets `n` random elements at unique keys from `collection` up to the\r\n * size of `collection`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to sample.\r\n * @param {number} [n=1] The number of elements to sample.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Array} Returns the random elements.\r\n * @example\r\n *\r\n * _.sampleSize([1, 2, 3], 2);\r\n * // => [3, 1]\r\n *\r\n * _.sampleSize([1, 2, 3], 4);\r\n * // => [2, 3, 1]\r\n */\r\n function sampleSize(collection, n, guard) {\r\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\r\n n = 1;\r\n } else {\r\n n = toInteger(n);\r\n }\r\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\r\n return func(collection, n);\r\n }\r\n\r\n /**\r\n * Creates an array of shuffled values, using a version of the\r\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to shuffle.\r\n * @returns {Array} Returns the new shuffled array.\r\n * @example\r\n *\r\n * _.shuffle([1, 2, 3, 4]);\r\n * // => [4, 1, 3, 2]\r\n */\r\n function shuffle(collection) {\r\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\r\n return func(collection);\r\n }\r\n\r\n /**\r\n * Gets the size of `collection` by returning its length for array-like\r\n * values or the number of own enumerable string keyed properties for objects.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object|string} collection The collection to inspect.\r\n * @returns {number} Returns the collection size.\r\n * @example\r\n *\r\n * _.size([1, 2, 3]);\r\n * // => 3\r\n *\r\n * _.size({ 'a': 1, 'b': 2 });\r\n * // => 2\r\n *\r\n * _.size('pebbles');\r\n * // => 7\r\n */\r\n function size(collection) {\r\n if (collection == null) {\r\n return 0;\r\n }\r\n if (isArrayLike(collection)) {\r\n return isString(collection) ? stringSize(collection) : collection.length;\r\n }\r\n var tag = getTag(collection);\r\n if (tag == mapTag || tag == setTag) {\r\n return collection.size;\r\n }\r\n return baseKeys(collection).length;\r\n }\r\n\r\n /**\r\n * Checks if `predicate` returns truthy for **any** element of `collection`.\r\n * Iteration is stopped once `predicate` returns truthy. The predicate is\r\n * invoked with three arguments: (value, index|key, collection).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {boolean} Returns `true` if any element passes the predicate check,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.some([null, 0, 'yes', false], Boolean);\r\n * // => true\r\n *\r\n * var users = [\r\n * { 'user': 'barney', 'active': true },\r\n * { 'user': 'fred', 'active': false }\r\n * ];\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.some(users, { 'user': 'barney', 'active': false });\r\n * // => false\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.some(users, ['active', false]);\r\n * // => true\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.some(users, 'active');\r\n * // => true\r\n */\r\n function some(collection, predicate, guard) {\r\n var func = isArray(collection) ? arraySome : baseSome;\r\n if (guard && isIterateeCall(collection, predicate, guard)) {\r\n predicate = undefined;\r\n }\r\n return func(collection, getIteratee(predicate, 3));\r\n }\r\n\r\n /**\r\n * Creates an array of elements, sorted in ascending order by the results of\r\n * running each element in a collection thru each iteratee. This method\r\n * performs a stable sort, that is, it preserves the original sort order of\r\n * equal elements. The iteratees are invoked with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Collection\r\n * @param {Array|Object} collection The collection to iterate over.\r\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\r\n * The iteratees to sort by.\r\n * @returns {Array} Returns the new sorted array.\r\n * @example\r\n *\r\n * var users = [\r\n * { 'user': 'fred', 'age': 48 },\r\n * { 'user': 'barney', 'age': 36 },\r\n * { 'user': 'fred', 'age': 30 },\r\n * { 'user': 'barney', 'age': 34 }\r\n * ];\r\n *\r\n * _.sortBy(users, [function(o) { return o.user; }]);\r\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\r\n *\r\n * _.sortBy(users, ['user', 'age']);\r\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\r\n */\r\n var sortBy = baseRest(function(collection, iteratees) {\r\n if (collection == null) {\r\n return [];\r\n }\r\n var length = iteratees.length;\r\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\r\n iteratees = [];\r\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\r\n iteratees = [iteratees[0]];\r\n }\r\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\r\n });\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Gets the timestamp of the number of milliseconds that have elapsed since\r\n * the Unix epoch (1 January 1970 00:00:00 UTC).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.4.0\r\n * @category Date\r\n * @returns {number} Returns the timestamp.\r\n * @example\r\n *\r\n * _.defer(function(stamp) {\r\n * console.log(_.now() - stamp);\r\n * }, _.now());\r\n * // => Logs the number of milliseconds it took for the deferred invocation.\r\n */\r\n var now = ctxNow || function() {\r\n return root.Date.now();\r\n };\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * The opposite of `_.before`; this method creates a function that invokes\r\n * `func` once it's called `n` or more times.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {number} n The number of calls before `func` is invoked.\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new restricted function.\r\n * @example\r\n *\r\n * var saves = ['profile', 'settings'];\r\n *\r\n * var done = _.after(saves.length, function() {\r\n * console.log('done saving!');\r\n * });\r\n *\r\n * _.forEach(saves, function(type) {\r\n * asyncSave({ 'type': type, 'complete': done });\r\n * });\r\n * // => Logs 'done saving!' after the two async saves have completed.\r\n */\r\n function after(n, func) {\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n n = toInteger(n);\r\n return function() {\r\n if (--n < 1) {\r\n return func.apply(this, arguments);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that invokes `func`, with up to `n` arguments,\r\n * ignoring any additional arguments.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Function\r\n * @param {Function} func The function to cap arguments for.\r\n * @param {number} [n=func.length] The arity cap.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Function} Returns the new capped function.\r\n * @example\r\n *\r\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\r\n * // => [6, 8, 10]\r\n */\r\n function ary(func, n, guard) {\r\n n = guard ? undefined : n;\r\n n = (func && n == null) ? func.length : n;\r\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\r\n }\r\n\r\n /**\r\n * Creates a function that invokes `func`, with the `this` binding and arguments\r\n * of the created function, while it's called less than `n` times. Subsequent\r\n * calls to the created function return the result of the last `func` invocation.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Function\r\n * @param {number} n The number of calls at which `func` is no longer invoked.\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new restricted function.\r\n * @example\r\n *\r\n * jQuery(element).on('click', _.before(5, addContactToList));\r\n * // => Allows adding up to 4 contacts to the list.\r\n */\r\n function before(n, func) {\r\n var result;\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n n = toInteger(n);\r\n return function() {\r\n if (--n > 0) {\r\n result = func.apply(this, arguments);\r\n }\r\n if (n <= 1) {\r\n func = undefined;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\r\n * and `partials` prepended to the arguments it receives.\r\n *\r\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\r\n * may be used as a placeholder for partially applied arguments.\r\n *\r\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\r\n * property of bound functions.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to bind.\r\n * @param {*} thisArg The `this` binding of `func`.\r\n * @param {...*} [partials] The arguments to be partially applied.\r\n * @returns {Function} Returns the new bound function.\r\n * @example\r\n *\r\n * function greet(greeting, punctuation) {\r\n * return greeting + ' ' + this.user + punctuation;\r\n * }\r\n *\r\n * var object = { 'user': 'fred' };\r\n *\r\n * var bound = _.bind(greet, object, 'hi');\r\n * bound('!');\r\n * // => 'hi fred!'\r\n *\r\n * // Bound with placeholders.\r\n * var bound = _.bind(greet, object, _, '!');\r\n * bound('hi');\r\n * // => 'hi fred!'\r\n */\r\n var bind = baseRest(function(func, thisArg, partials) {\r\n var bitmask = WRAP_BIND_FLAG;\r\n if (partials.length) {\r\n var holders = replaceHolders(partials, getHolder(bind));\r\n bitmask |= WRAP_PARTIAL_FLAG;\r\n }\r\n return createWrap(func, bitmask, thisArg, partials, holders);\r\n });\r\n\r\n /**\r\n * Creates a function that invokes the method at `object[key]` with `partials`\r\n * prepended to the arguments it receives.\r\n *\r\n * This method differs from `_.bind` by allowing bound functions to reference\r\n * methods that may be redefined or don't yet exist. See\r\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\r\n * for more details.\r\n *\r\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\r\n * builds, may be used as a placeholder for partially applied arguments.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.10.0\r\n * @category Function\r\n * @param {Object} object The object to invoke the method on.\r\n * @param {string} key The key of the method.\r\n * @param {...*} [partials] The arguments to be partially applied.\r\n * @returns {Function} Returns the new bound function.\r\n * @example\r\n *\r\n * var object = {\r\n * 'user': 'fred',\r\n * 'greet': function(greeting, punctuation) {\r\n * return greeting + ' ' + this.user + punctuation;\r\n * }\r\n * };\r\n *\r\n * var bound = _.bindKey(object, 'greet', 'hi');\r\n * bound('!');\r\n * // => 'hi fred!'\r\n *\r\n * object.greet = function(greeting, punctuation) {\r\n * return greeting + 'ya ' + this.user + punctuation;\r\n * };\r\n *\r\n * bound('!');\r\n * // => 'hiya fred!'\r\n *\r\n * // Bound with placeholders.\r\n * var bound = _.bindKey(object, 'greet', _, '!');\r\n * bound('hi');\r\n * // => 'hiya fred!'\r\n */\r\n var bindKey = baseRest(function(object, key, partials) {\r\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\r\n if (partials.length) {\r\n var holders = replaceHolders(partials, getHolder(bindKey));\r\n bitmask |= WRAP_PARTIAL_FLAG;\r\n }\r\n return createWrap(key, bitmask, object, partials, holders);\r\n });\r\n\r\n /**\r\n * Creates a function that accepts arguments of `func` and either invokes\r\n * `func` returning its result, if at least `arity` number of arguments have\r\n * been provided, or returns a function that accepts the remaining `func`\r\n * arguments, and so on. The arity of `func` may be specified if `func.length`\r\n * is not sufficient.\r\n *\r\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\r\n * may be used as a placeholder for provided arguments.\r\n *\r\n * **Note:** This method doesn't set the \"length\" property of curried functions.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Function\r\n * @param {Function} func The function to curry.\r\n * @param {number} [arity=func.length] The arity of `func`.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Function} Returns the new curried function.\r\n * @example\r\n *\r\n * var abc = function(a, b, c) {\r\n * return [a, b, c];\r\n * };\r\n *\r\n * var curried = _.curry(abc);\r\n *\r\n * curried(1)(2)(3);\r\n * // => [1, 2, 3]\r\n *\r\n * curried(1, 2)(3);\r\n * // => [1, 2, 3]\r\n *\r\n * curried(1, 2, 3);\r\n * // => [1, 2, 3]\r\n *\r\n * // Curried with placeholders.\r\n * curried(1)(_, 3)(2);\r\n * // => [1, 2, 3]\r\n */\r\n function curry(func, arity, guard) {\r\n arity = guard ? undefined : arity;\r\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\r\n result.placeholder = curry.placeholder;\r\n return result;\r\n }\r\n\r\n /**\r\n * This method is like `_.curry` except that arguments are applied to `func`\r\n * in the manner of `_.partialRight` instead of `_.partial`.\r\n *\r\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\r\n * builds, may be used as a placeholder for provided arguments.\r\n *\r\n * **Note:** This method doesn't set the \"length\" property of curried functions.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Function\r\n * @param {Function} func The function to curry.\r\n * @param {number} [arity=func.length] The arity of `func`.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Function} Returns the new curried function.\r\n * @example\r\n *\r\n * var abc = function(a, b, c) {\r\n * return [a, b, c];\r\n * };\r\n *\r\n * var curried = _.curryRight(abc);\r\n *\r\n * curried(3)(2)(1);\r\n * // => [1, 2, 3]\r\n *\r\n * curried(2, 3)(1);\r\n * // => [1, 2, 3]\r\n *\r\n * curried(1, 2, 3);\r\n * // => [1, 2, 3]\r\n *\r\n * // Curried with placeholders.\r\n * curried(3)(1, _)(2);\r\n * // => [1, 2, 3]\r\n */\r\n function curryRight(func, arity, guard) {\r\n arity = guard ? undefined : arity;\r\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\r\n result.placeholder = curryRight.placeholder;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a debounced function that delays invoking `func` until after `wait`\r\n * milliseconds have elapsed since the last time the debounced function was\r\n * invoked. The debounced function comes with a `cancel` method to cancel\r\n * delayed `func` invocations and a `flush` method to immediately invoke them.\r\n * Provide `options` to indicate whether `func` should be invoked on the\r\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\r\n * with the last arguments provided to the debounced function. Subsequent\r\n * calls to the debounced function return the result of the last `func`\r\n * invocation.\r\n *\r\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\r\n * invoked on the trailing edge of the timeout only if the debounced function\r\n * is invoked more than once during the `wait` timeout.\r\n *\r\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\r\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\r\n *\r\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\r\n * for details over the differences between `_.debounce` and `_.throttle`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to debounce.\r\n * @param {number} [wait=0] The number of milliseconds to delay.\r\n * @param {Object} [options={}] The options object.\r\n * @param {boolean} [options.leading=false]\r\n * Specify invoking on the leading edge of the timeout.\r\n * @param {number} [options.maxWait]\r\n * The maximum time `func` is allowed to be delayed before it's invoked.\r\n * @param {boolean} [options.trailing=true]\r\n * Specify invoking on the trailing edge of the timeout.\r\n * @returns {Function} Returns the new debounced function.\r\n * @example\r\n *\r\n * // Avoid costly calculations while the window size is in flux.\r\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\r\n *\r\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\r\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\r\n * 'leading': true,\r\n * 'trailing': false\r\n * }));\r\n *\r\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\r\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\r\n * var source = new EventSource('/stream');\r\n * jQuery(source).on('message', debounced);\r\n *\r\n * // Cancel the trailing debounced invocation.\r\n * jQuery(window).on('popstate', debounced.cancel);\r\n */\r\n function debounce(func, wait, options) {\r\n var lastArgs,\r\n lastThis,\r\n maxWait,\r\n result,\r\n timerId,\r\n lastCallTime,\r\n lastInvokeTime = 0,\r\n leading = false,\r\n maxing = false,\r\n trailing = true;\r\n\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n wait = toNumber(wait) || 0;\r\n if (isObject(options)) {\r\n leading = !!options.leading;\r\n maxing = 'maxWait' in options;\r\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\r\n trailing = 'trailing' in options ? !!options.trailing : trailing;\r\n }\r\n\r\n function invokeFunc(time) {\r\n var args = lastArgs,\r\n thisArg = lastThis;\r\n\r\n lastArgs = lastThis = undefined;\r\n lastInvokeTime = time;\r\n result = func.apply(thisArg, args);\r\n return result;\r\n }\r\n\r\n function leadingEdge(time) {\r\n // Reset any `maxWait` timer.\r\n lastInvokeTime = time;\r\n // Start the timer for the trailing edge.\r\n timerId = setTimeout(timerExpired, wait);\r\n // Invoke the leading edge.\r\n return leading ? invokeFunc(time) : result;\r\n }\r\n\r\n function remainingWait(time) {\r\n var timeSinceLastCall = time - lastCallTime,\r\n timeSinceLastInvoke = time - lastInvokeTime,\r\n timeWaiting = wait - timeSinceLastCall;\r\n\r\n return maxing\r\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\r\n : timeWaiting;\r\n }\r\n\r\n function shouldInvoke(time) {\r\n var timeSinceLastCall = time - lastCallTime,\r\n timeSinceLastInvoke = time - lastInvokeTime;\r\n\r\n // Either this is the first call, activity has stopped and we're at the\r\n // trailing edge, the system time has gone backwards and we're treating\r\n // it as the trailing edge, or we've hit the `maxWait` limit.\r\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\r\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\r\n }\r\n\r\n function timerExpired() {\r\n var time = now();\r\n if (shouldInvoke(time)) {\r\n return trailingEdge(time);\r\n }\r\n // Restart the timer.\r\n timerId = setTimeout(timerExpired, remainingWait(time));\r\n }\r\n\r\n function trailingEdge(time) {\r\n timerId = undefined;\r\n\r\n // Only invoke if we have `lastArgs` which means `func` has been\r\n // debounced at least once.\r\n if (trailing && lastArgs) {\r\n return invokeFunc(time);\r\n }\r\n lastArgs = lastThis = undefined;\r\n return result;\r\n }\r\n\r\n function cancel() {\r\n if (timerId !== undefined) {\r\n clearTimeout(timerId);\r\n }\r\n lastInvokeTime = 0;\r\n lastArgs = lastCallTime = lastThis = timerId = undefined;\r\n }\r\n\r\n function flush() {\r\n return timerId === undefined ? result : trailingEdge(now());\r\n }\r\n\r\n function debounced() {\r\n var time = now(),\r\n isInvoking = shouldInvoke(time);\r\n\r\n lastArgs = arguments;\r\n lastThis = this;\r\n lastCallTime = time;\r\n\r\n if (isInvoking) {\r\n if (timerId === undefined) {\r\n return leadingEdge(lastCallTime);\r\n }\r\n if (maxing) {\r\n // Handle invocations in a tight loop.\r\n clearTimeout(timerId);\r\n timerId = setTimeout(timerExpired, wait);\r\n return invokeFunc(lastCallTime);\r\n }\r\n }\r\n if (timerId === undefined) {\r\n timerId = setTimeout(timerExpired, wait);\r\n }\r\n return result;\r\n }\r\n debounced.cancel = cancel;\r\n debounced.flush = flush;\r\n return debounced;\r\n }\r\n\r\n /**\r\n * Defers invoking the `func` until the current call stack has cleared. Any\r\n * additional arguments are provided to `func` when it's invoked.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to defer.\r\n * @param {...*} [args] The arguments to invoke `func` with.\r\n * @returns {number} Returns the timer id.\r\n * @example\r\n *\r\n * _.defer(function(text) {\r\n * console.log(text);\r\n * }, 'deferred');\r\n * // => Logs 'deferred' after one millisecond.\r\n */\r\n var defer = baseRest(function(func, args) {\r\n return baseDelay(func, 1, args);\r\n });\r\n\r\n /**\r\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\r\n * provided to `func` when it's invoked.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to delay.\r\n * @param {number} wait The number of milliseconds to delay invocation.\r\n * @param {...*} [args] The arguments to invoke `func` with.\r\n * @returns {number} Returns the timer id.\r\n * @example\r\n *\r\n * _.delay(function(text) {\r\n * console.log(text);\r\n * }, 1000, 'later');\r\n * // => Logs 'later' after one second.\r\n */\r\n var delay = baseRest(function(func, wait, args) {\r\n return baseDelay(func, toNumber(wait) || 0, args);\r\n });\r\n\r\n /**\r\n * Creates a function that invokes `func` with arguments reversed.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Function\r\n * @param {Function} func The function to flip arguments for.\r\n * @returns {Function} Returns the new flipped function.\r\n * @example\r\n *\r\n * var flipped = _.flip(function() {\r\n * return _.toArray(arguments);\r\n * });\r\n *\r\n * flipped('a', 'b', 'c', 'd');\r\n * // => ['d', 'c', 'b', 'a']\r\n */\r\n function flip(func) {\r\n return createWrap(func, WRAP_FLIP_FLAG);\r\n }\r\n\r\n /**\r\n * Creates a function that memoizes the result of `func`. If `resolver` is\r\n * provided, it determines the cache key for storing the result based on the\r\n * arguments provided to the memoized function. By default, the first argument\r\n * provided to the memoized function is used as the map cache key. The `func`\r\n * is invoked with the `this` binding of the memoized function.\r\n *\r\n * **Note:** The cache is exposed as the `cache` property on the memoized\r\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\r\n * constructor with one whose instances implement the\r\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\r\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to have its output memoized.\r\n * @param {Function} [resolver] The function to resolve the cache key.\r\n * @returns {Function} Returns the new memoized function.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': 2 };\r\n * var other = { 'c': 3, 'd': 4 };\r\n *\r\n * var values = _.memoize(_.values);\r\n * values(object);\r\n * // => [1, 2]\r\n *\r\n * values(other);\r\n * // => [3, 4]\r\n *\r\n * object.a = 2;\r\n * values(object);\r\n * // => [1, 2]\r\n *\r\n * // Modify the result cache.\r\n * values.cache.set(object, ['a', 'b']);\r\n * values(object);\r\n * // => ['a', 'b']\r\n *\r\n * // Replace `_.memoize.Cache`.\r\n * _.memoize.Cache = WeakMap;\r\n */\r\n function memoize(func, resolver) {\r\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n var memoized = function() {\r\n var args = arguments,\r\n key = resolver ? resolver.apply(this, args) : args[0],\r\n cache = memoized.cache;\r\n\r\n if (cache.has(key)) {\r\n return cache.get(key);\r\n }\r\n var result = func.apply(this, args);\r\n memoized.cache = cache.set(key, result) || cache;\r\n return result;\r\n };\r\n memoized.cache = new (memoize.Cache || MapCache);\r\n return memoized;\r\n }\r\n\r\n // Expose `MapCache`.\r\n memoize.Cache = MapCache;\r\n\r\n /**\r\n * Creates a function that negates the result of the predicate `func`. The\r\n * `func` predicate is invoked with the `this` binding and arguments of the\r\n * created function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Function\r\n * @param {Function} predicate The predicate to negate.\r\n * @returns {Function} Returns the new negated function.\r\n * @example\r\n *\r\n * function isEven(n) {\r\n * return n % 2 == 0;\r\n * }\r\n *\r\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\r\n * // => [1, 3, 5]\r\n */\r\n function negate(predicate) {\r\n if (typeof predicate != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n return function() {\r\n var args = arguments;\r\n switch (args.length) {\r\n case 0: return !predicate.call(this);\r\n case 1: return !predicate.call(this, args[0]);\r\n case 2: return !predicate.call(this, args[0], args[1]);\r\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\r\n }\r\n return !predicate.apply(this, args);\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that is restricted to invoking `func` once. Repeat calls\r\n * to the function return the value of the first invocation. The `func` is\r\n * invoked with the `this` binding and arguments of the created function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new restricted function.\r\n * @example\r\n *\r\n * var initialize = _.once(createApplication);\r\n * initialize();\r\n * initialize();\r\n * // => `createApplication` is invoked once\r\n */\r\n function once(func) {\r\n return before(2, func);\r\n }\r\n\r\n /**\r\n * Creates a function that invokes `func` with its arguments transformed.\r\n *\r\n * @static\r\n * @since 4.0.0\r\n * @memberOf _\r\n * @category Function\r\n * @param {Function} func The function to wrap.\r\n * @param {...(Function|Function[])} [transforms=[_.identity]]\r\n * The argument transforms.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * function doubled(n) {\r\n * return n * 2;\r\n * }\r\n *\r\n * function square(n) {\r\n * return n * n;\r\n * }\r\n *\r\n * var func = _.overArgs(function(x, y) {\r\n * return [x, y];\r\n * }, [square, doubled]);\r\n *\r\n * func(9, 3);\r\n * // => [81, 6]\r\n *\r\n * func(10, 5);\r\n * // => [100, 10]\r\n */\r\n var overArgs = castRest(function(func, transforms) {\r\n transforms = (transforms.length == 1 && isArray(transforms[0]))\r\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\r\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\r\n\r\n var funcsLength = transforms.length;\r\n return baseRest(function(args) {\r\n var index = -1,\r\n length = nativeMin(args.length, funcsLength);\r\n\r\n while (++index < length) {\r\n args[index] = transforms[index].call(this, args[index]);\r\n }\r\n return apply(func, this, args);\r\n });\r\n });\r\n\r\n /**\r\n * Creates a function that invokes `func` with `partials` prepended to the\r\n * arguments it receives. This method is like `_.bind` except it does **not**\r\n * alter the `this` binding.\r\n *\r\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\r\n * builds, may be used as a placeholder for partially applied arguments.\r\n *\r\n * **Note:** This method doesn't set the \"length\" property of partially\r\n * applied functions.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.2.0\r\n * @category Function\r\n * @param {Function} func The function to partially apply arguments to.\r\n * @param {...*} [partials] The arguments to be partially applied.\r\n * @returns {Function} Returns the new partially applied function.\r\n * @example\r\n *\r\n * function greet(greeting, name) {\r\n * return greeting + ' ' + name;\r\n * }\r\n *\r\n * var sayHelloTo = _.partial(greet, 'hello');\r\n * sayHelloTo('fred');\r\n * // => 'hello fred'\r\n *\r\n * // Partially applied with placeholders.\r\n * var greetFred = _.partial(greet, _, 'fred');\r\n * greetFred('hi');\r\n * // => 'hi fred'\r\n */\r\n var partial = baseRest(function(func, partials) {\r\n var holders = replaceHolders(partials, getHolder(partial));\r\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\r\n });\r\n\r\n /**\r\n * This method is like `_.partial` except that partially applied arguments\r\n * are appended to the arguments it receives.\r\n *\r\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\r\n * builds, may be used as a placeholder for partially applied arguments.\r\n *\r\n * **Note:** This method doesn't set the \"length\" property of partially\r\n * applied functions.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.0.0\r\n * @category Function\r\n * @param {Function} func The function to partially apply arguments to.\r\n * @param {...*} [partials] The arguments to be partially applied.\r\n * @returns {Function} Returns the new partially applied function.\r\n * @example\r\n *\r\n * function greet(greeting, name) {\r\n * return greeting + ' ' + name;\r\n * }\r\n *\r\n * var greetFred = _.partialRight(greet, 'fred');\r\n * greetFred('hi');\r\n * // => 'hi fred'\r\n *\r\n * // Partially applied with placeholders.\r\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\r\n * sayHelloTo('fred');\r\n * // => 'hello fred'\r\n */\r\n var partialRight = baseRest(function(func, partials) {\r\n var holders = replaceHolders(partials, getHolder(partialRight));\r\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\r\n });\r\n\r\n /**\r\n * Creates a function that invokes `func` with arguments arranged according\r\n * to the specified `indexes` where the argument value at the first index is\r\n * provided as the first argument, the argument value at the second index is\r\n * provided as the second argument, and so on.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Function\r\n * @param {Function} func The function to rearrange arguments for.\r\n * @param {...(number|number[])} indexes The arranged argument indexes.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var rearged = _.rearg(function(a, b, c) {\r\n * return [a, b, c];\r\n * }, [2, 0, 1]);\r\n *\r\n * rearged('b', 'c', 'a')\r\n * // => ['a', 'b', 'c']\r\n */\r\n var rearg = flatRest(function(func, indexes) {\r\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\r\n });\r\n\r\n /**\r\n * Creates a function that invokes `func` with the `this` binding of the\r\n * created function and arguments from `start` and beyond provided as\r\n * an array.\r\n *\r\n * **Note:** This method is based on the\r\n * [rest parameter](https://mdn.io/rest_parameters).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Function\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @param {number} [start=func.length-1] The start position of the rest parameter.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var say = _.rest(function(what, names) {\r\n * return what + ' ' + _.initial(names).join(', ') +\r\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\r\n * });\r\n *\r\n * say('hello', 'fred', 'barney', 'pebbles');\r\n * // => 'hello fred, barney, & pebbles'\r\n */\r\n function rest(func, start) {\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n start = start === undefined ? start : toInteger(start);\r\n return baseRest(func, start);\r\n }\r\n\r\n /**\r\n * Creates a function that invokes `func` with the `this` binding of the\r\n * create function and an array of arguments much like\r\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\r\n *\r\n * **Note:** This method is based on the\r\n * [spread operator](https://mdn.io/spread_operator).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.2.0\r\n * @category Function\r\n * @param {Function} func The function to spread arguments over.\r\n * @param {number} [start=0] The start position of the spread.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var say = _.spread(function(who, what) {\r\n * return who + ' says ' + what;\r\n * });\r\n *\r\n * say(['fred', 'hello']);\r\n * // => 'fred says hello'\r\n *\r\n * var numbers = Promise.all([\r\n * Promise.resolve(40),\r\n * Promise.resolve(36)\r\n * ]);\r\n *\r\n * numbers.then(_.spread(function(x, y) {\r\n * return x + y;\r\n * }));\r\n * // => a Promise of 76\r\n */\r\n function spread(func, start) {\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\r\n return baseRest(function(args) {\r\n var array = args[start],\r\n otherArgs = castSlice(args, 0, start);\r\n\r\n if (array) {\r\n arrayPush(otherArgs, array);\r\n }\r\n return apply(func, this, otherArgs);\r\n });\r\n }\r\n\r\n /**\r\n * Creates a throttled function that only invokes `func` at most once per\r\n * every `wait` milliseconds. The throttled function comes with a `cancel`\r\n * method to cancel delayed `func` invocations and a `flush` method to\r\n * immediately invoke them. Provide `options` to indicate whether `func`\r\n * should be invoked on the leading and/or trailing edge of the `wait`\r\n * timeout. The `func` is invoked with the last arguments provided to the\r\n * throttled function. Subsequent calls to the throttled function return the\r\n * result of the last `func` invocation.\r\n *\r\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\r\n * invoked on the trailing edge of the timeout only if the throttled function\r\n * is invoked more than once during the `wait` timeout.\r\n *\r\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\r\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\r\n *\r\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\r\n * for details over the differences between `_.throttle` and `_.debounce`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {Function} func The function to throttle.\r\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\r\n * @param {Object} [options={}] The options object.\r\n * @param {boolean} [options.leading=true]\r\n * Specify invoking on the leading edge of the timeout.\r\n * @param {boolean} [options.trailing=true]\r\n * Specify invoking on the trailing edge of the timeout.\r\n * @returns {Function} Returns the new throttled function.\r\n * @example\r\n *\r\n * // Avoid excessively updating the position while scrolling.\r\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\r\n *\r\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\r\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\r\n * jQuery(element).on('click', throttled);\r\n *\r\n * // Cancel the trailing throttled invocation.\r\n * jQuery(window).on('popstate', throttled.cancel);\r\n */\r\n function throttle(func, wait, options) {\r\n var leading = true,\r\n trailing = true;\r\n\r\n if (typeof func != 'function') {\r\n throw new TypeError(FUNC_ERROR_TEXT);\r\n }\r\n if (isObject(options)) {\r\n leading = 'leading' in options ? !!options.leading : leading;\r\n trailing = 'trailing' in options ? !!options.trailing : trailing;\r\n }\r\n return debounce(func, wait, {\r\n 'leading': leading,\r\n 'maxWait': wait,\r\n 'trailing': trailing\r\n });\r\n }\r\n\r\n /**\r\n * Creates a function that accepts up to one argument, ignoring any\r\n * additional arguments.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Function\r\n * @param {Function} func The function to cap arguments for.\r\n * @returns {Function} Returns the new capped function.\r\n * @example\r\n *\r\n * _.map(['6', '8', '10'], _.unary(parseInt));\r\n * // => [6, 8, 10]\r\n */\r\n function unary(func) {\r\n return ary(func, 1);\r\n }\r\n\r\n /**\r\n * Creates a function that provides `value` to `wrapper` as its first\r\n * argument. Any additional arguments provided to the function are appended\r\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\r\n * binding of the created function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Function\r\n * @param {*} value The value to wrap.\r\n * @param {Function} [wrapper=identity] The wrapper function.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var p = _.wrap(_.escape, function(func, text) {\r\n * return '

' + func(text) + '

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

fred, barney, & pebbles

'\r\n */\r\n function wrap(value, wrapper) {\r\n return partial(castFunction(wrapper), value);\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Casts `value` as an array if it's not one.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.4.0\r\n * @category Lang\r\n * @param {*} value The value to inspect.\r\n * @returns {Array} Returns the cast array.\r\n * @example\r\n *\r\n * _.castArray(1);\r\n * // => [1]\r\n *\r\n * _.castArray({ 'a': 1 });\r\n * // => [{ 'a': 1 }]\r\n *\r\n * _.castArray('abc');\r\n * // => ['abc']\r\n *\r\n * _.castArray(null);\r\n * // => [null]\r\n *\r\n * _.castArray(undefined);\r\n * // => [undefined]\r\n *\r\n * _.castArray();\r\n * // => []\r\n *\r\n * var array = [1, 2, 3];\r\n * console.log(_.castArray(array) === array);\r\n * // => true\r\n */\r\n function castArray() {\r\n if (!arguments.length) {\r\n return [];\r\n }\r\n var value = arguments[0];\r\n return isArray(value) ? value : [value];\r\n }\r\n\r\n /**\r\n * Creates a shallow clone of `value`.\r\n *\r\n * **Note:** This method is loosely based on the\r\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\r\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\r\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\r\n * arrays. The own enumerable properties of `arguments` objects are cloned\r\n * as plain objects. An empty object is returned for uncloneable values such\r\n * as error objects, functions, DOM nodes, and WeakMaps.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to clone.\r\n * @returns {*} Returns the cloned value.\r\n * @see _.cloneDeep\r\n * @example\r\n *\r\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\r\n *\r\n * var shallow = _.clone(objects);\r\n * console.log(shallow[0] === objects[0]);\r\n * // => true\r\n */\r\n function clone(value) {\r\n return baseClone(value, CLONE_SYMBOLS_FLAG);\r\n }\r\n\r\n /**\r\n * This method is like `_.clone` except that it accepts `customizer` which\r\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\r\n * cloning is handled by the method instead. The `customizer` is invoked with\r\n * up to four arguments; (value [, index|key, object, stack]).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to clone.\r\n * @param {Function} [customizer] The function to customize cloning.\r\n * @returns {*} Returns the cloned value.\r\n * @see _.cloneDeepWith\r\n * @example\r\n *\r\n * function customizer(value) {\r\n * if (_.isElement(value)) {\r\n * return value.cloneNode(false);\r\n * }\r\n * }\r\n *\r\n * var el = _.cloneWith(document.body, customizer);\r\n *\r\n * console.log(el === document.body);\r\n * // => false\r\n * console.log(el.nodeName);\r\n * // => 'BODY'\r\n * console.log(el.childNodes.length);\r\n * // => 0\r\n */\r\n function cloneWith(value, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\r\n }\r\n\r\n /**\r\n * This method is like `_.clone` except that it recursively clones `value`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.0.0\r\n * @category Lang\r\n * @param {*} value The value to recursively clone.\r\n * @returns {*} Returns the deep cloned value.\r\n * @see _.clone\r\n * @example\r\n *\r\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\r\n *\r\n * var deep = _.cloneDeep(objects);\r\n * console.log(deep[0] === objects[0]);\r\n * // => false\r\n */\r\n function cloneDeep(value) {\r\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\r\n }\r\n\r\n /**\r\n * This method is like `_.cloneWith` except that it recursively clones `value`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to recursively clone.\r\n * @param {Function} [customizer] The function to customize cloning.\r\n * @returns {*} Returns the deep cloned value.\r\n * @see _.cloneWith\r\n * @example\r\n *\r\n * function customizer(value) {\r\n * if (_.isElement(value)) {\r\n * return value.cloneNode(true);\r\n * }\r\n * }\r\n *\r\n * var el = _.cloneDeepWith(document.body, customizer);\r\n *\r\n * console.log(el === document.body);\r\n * // => false\r\n * console.log(el.nodeName);\r\n * // => 'BODY'\r\n * console.log(el.childNodes.length);\r\n * // => 20\r\n */\r\n function cloneDeepWith(value, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\r\n }\r\n\r\n /**\r\n * Checks if `object` conforms to `source` by invoking the predicate\r\n * properties of `source` with the corresponding property values of `object`.\r\n *\r\n * **Note:** This method is equivalent to `_.conforms` when `source` is\r\n * partially applied.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.14.0\r\n * @category Lang\r\n * @param {Object} object The object to inspect.\r\n * @param {Object} source The object of property predicates to conform to.\r\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': 2 };\r\n *\r\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\r\n * // => true\r\n *\r\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\r\n * // => false\r\n */\r\n function conformsTo(object, source) {\r\n return source == null || baseConformsTo(object, source, keys(source));\r\n }\r\n\r\n /**\r\n * Performs a\r\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * comparison between two values to determine if they are equivalent.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': 1 };\r\n * var other = { 'a': 1 };\r\n *\r\n * _.eq(object, object);\r\n * // => true\r\n *\r\n * _.eq(object, other);\r\n * // => false\r\n *\r\n * _.eq('a', 'a');\r\n * // => true\r\n *\r\n * _.eq('a', Object('a'));\r\n * // => false\r\n *\r\n * _.eq(NaN, NaN);\r\n * // => true\r\n */\r\n function eq(value, other) {\r\n return value === other || (value !== value && other !== other);\r\n }\r\n\r\n /**\r\n * Checks if `value` is greater than `other`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.9.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\r\n * else `false`.\r\n * @see _.lt\r\n * @example\r\n *\r\n * _.gt(3, 1);\r\n * // => true\r\n *\r\n * _.gt(3, 3);\r\n * // => false\r\n *\r\n * _.gt(1, 3);\r\n * // => false\r\n */\r\n var gt = createRelationalOperation(baseGt);\r\n\r\n /**\r\n * Checks if `value` is greater than or equal to `other`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.9.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\r\n * `other`, else `false`.\r\n * @see _.lte\r\n * @example\r\n *\r\n * _.gte(3, 1);\r\n * // => true\r\n *\r\n * _.gte(3, 3);\r\n * // => true\r\n *\r\n * _.gte(1, 3);\r\n * // => false\r\n */\r\n var gte = createRelationalOperation(function(value, other) {\r\n return value >= other;\r\n });\r\n\r\n /**\r\n * Checks if `value` is likely an `arguments` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.isArguments(function() { return arguments; }());\r\n * // => true\r\n *\r\n * _.isArguments([1, 2, 3]);\r\n * // => false\r\n */\r\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\r\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\r\n !propertyIsEnumerable.call(value, 'callee');\r\n };\r\n\r\n /**\r\n * Checks if `value` is classified as an `Array` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\r\n * @example\r\n *\r\n * _.isArray([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isArray(document.body.children);\r\n * // => false\r\n *\r\n * _.isArray('abc');\r\n * // => false\r\n *\r\n * _.isArray(_.noop);\r\n * // => false\r\n */\r\n var isArray = Array.isArray;\r\n\r\n /**\r\n * Checks if `value` is classified as an `ArrayBuffer` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\r\n * @example\r\n *\r\n * _.isArrayBuffer(new ArrayBuffer(2));\r\n * // => true\r\n *\r\n * _.isArrayBuffer(new Array(2));\r\n * // => false\r\n */\r\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\r\n\r\n /**\r\n * Checks if `value` is array-like. A value is considered array-like if it's\r\n * not a function and has a `value.length` that's an integer greater than or\r\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\r\n * @example\r\n *\r\n * _.isArrayLike([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isArrayLike(document.body.children);\r\n * // => true\r\n *\r\n * _.isArrayLike('abc');\r\n * // => true\r\n *\r\n * _.isArrayLike(_.noop);\r\n * // => false\r\n */\r\n function isArrayLike(value) {\r\n return value != null && isLength(value.length) && !isFunction(value);\r\n }\r\n\r\n /**\r\n * This method is like `_.isArrayLike` except that it also checks if `value`\r\n * is an object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an array-like object,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.isArrayLikeObject([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isArrayLikeObject(document.body.children);\r\n * // => true\r\n *\r\n * _.isArrayLikeObject('abc');\r\n * // => false\r\n *\r\n * _.isArrayLikeObject(_.noop);\r\n * // => false\r\n */\r\n function isArrayLikeObject(value) {\r\n return isObjectLike(value) && isArrayLike(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a boolean primitive or object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\r\n * @example\r\n *\r\n * _.isBoolean(false);\r\n * // => true\r\n *\r\n * _.isBoolean(null);\r\n * // => false\r\n */\r\n function isBoolean(value) {\r\n return value === true || value === false ||\r\n (isObjectLike(value) && baseGetTag(value) == boolTag);\r\n }\r\n\r\n /**\r\n * Checks if `value` is a buffer.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\r\n * @example\r\n *\r\n * _.isBuffer(new Buffer(2));\r\n * // => true\r\n *\r\n * _.isBuffer(new Uint8Array(2));\r\n * // => false\r\n */\r\n var isBuffer = nativeIsBuffer || stubFalse;\r\n\r\n /**\r\n * Checks if `value` is classified as a `Date` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\r\n * @example\r\n *\r\n * _.isDate(new Date);\r\n * // => true\r\n *\r\n * _.isDate('Mon April 23 2012');\r\n * // => false\r\n */\r\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\r\n\r\n /**\r\n * Checks if `value` is likely a DOM element.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\r\n * @example\r\n *\r\n * _.isElement(document.body);\r\n * // => true\r\n *\r\n * _.isElement('');\r\n * // => false\r\n */\r\n function isElement(value) {\r\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is an empty object, collection, map, or set.\r\n *\r\n * Objects are considered empty if they have no own enumerable string keyed\r\n * properties.\r\n *\r\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\r\n * jQuery-like collections are considered empty if they have a `length` of `0`.\r\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\r\n * @example\r\n *\r\n * _.isEmpty(null);\r\n * // => true\r\n *\r\n * _.isEmpty(true);\r\n * // => true\r\n *\r\n * _.isEmpty(1);\r\n * // => true\r\n *\r\n * _.isEmpty([1, 2, 3]);\r\n * // => false\r\n *\r\n * _.isEmpty({ 'a': 1 });\r\n * // => false\r\n */\r\n function isEmpty(value) {\r\n if (value == null) {\r\n return true;\r\n }\r\n if (isArrayLike(value) &&\r\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\r\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\r\n return !value.length;\r\n }\r\n var tag = getTag(value);\r\n if (tag == mapTag || tag == setTag) {\r\n return !value.size;\r\n }\r\n if (isPrototype(value)) {\r\n return !baseKeys(value).length;\r\n }\r\n for (var key in value) {\r\n if (hasOwnProperty.call(value, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Performs a deep comparison between two values to determine if they are\r\n * equivalent.\r\n *\r\n * **Note:** This method supports comparing arrays, array buffers, booleans,\r\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\r\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\r\n * by their own, not inherited, enumerable properties. Functions and DOM\r\n * nodes are compared by strict equality, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': 1 };\r\n * var other = { 'a': 1 };\r\n *\r\n * _.isEqual(object, other);\r\n * // => true\r\n *\r\n * object === other;\r\n * // => false\r\n */\r\n function isEqual(value, other) {\r\n return baseIsEqual(value, other);\r\n }\r\n\r\n /**\r\n * This method is like `_.isEqual` except that it accepts `customizer` which\r\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\r\n * are handled by the method instead. The `customizer` is invoked with up to\r\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @param {Function} [customizer] The function to customize comparisons.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n * @example\r\n *\r\n * function isGreeting(value) {\r\n * return /^h(?:i|ello)$/.test(value);\r\n * }\r\n *\r\n * function customizer(objValue, othValue) {\r\n * if (isGreeting(objValue) && isGreeting(othValue)) {\r\n * return true;\r\n * }\r\n * }\r\n *\r\n * var array = ['hello', 'goodbye'];\r\n * var other = ['hi', 'goodbye'];\r\n *\r\n * _.isEqualWith(array, other, customizer);\r\n * // => true\r\n */\r\n function isEqualWith(value, other, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n var result = customizer ? customizer(value, other) : undefined;\r\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\r\n }\r\n\r\n /**\r\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\r\n * `SyntaxError`, `TypeError`, or `URIError` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\r\n * @example\r\n *\r\n * _.isError(new Error);\r\n * // => true\r\n *\r\n * _.isError(Error);\r\n * // => false\r\n */\r\n function isError(value) {\r\n if (!isObjectLike(value)) {\r\n return false;\r\n }\r\n var tag = baseGetTag(value);\r\n return tag == errorTag || tag == domExcTag ||\r\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\r\n }\r\n\r\n /**\r\n * Checks if `value` is a finite primitive number.\r\n *\r\n * **Note:** This method is based on\r\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\r\n * @example\r\n *\r\n * _.isFinite(3);\r\n * // => true\r\n *\r\n * _.isFinite(Number.MIN_VALUE);\r\n * // => true\r\n *\r\n * _.isFinite(Infinity);\r\n * // => false\r\n *\r\n * _.isFinite('3');\r\n * // => false\r\n */\r\n function isFinite(value) {\r\n return typeof value == 'number' && nativeIsFinite(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `Function` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\r\n * @example\r\n *\r\n * _.isFunction(_);\r\n * // => true\r\n *\r\n * _.isFunction(/abc/);\r\n * // => false\r\n */\r\n function isFunction(value) {\r\n if (!isObject(value)) {\r\n return false;\r\n }\r\n // The use of `Object#toString` avoids issues with the `typeof` operator\r\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\r\n var tag = baseGetTag(value);\r\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\r\n }\r\n\r\n /**\r\n * Checks if `value` is an integer.\r\n *\r\n * **Note:** This method is based on\r\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\r\n * @example\r\n *\r\n * _.isInteger(3);\r\n * // => true\r\n *\r\n * _.isInteger(Number.MIN_VALUE);\r\n * // => false\r\n *\r\n * _.isInteger(Infinity);\r\n * // => false\r\n *\r\n * _.isInteger('3');\r\n * // => false\r\n */\r\n function isInteger(value) {\r\n return typeof value == 'number' && value == toInteger(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is a valid array-like length.\r\n *\r\n * **Note:** This method is loosely based on\r\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\r\n * @example\r\n *\r\n * _.isLength(3);\r\n * // => true\r\n *\r\n * _.isLength(Number.MIN_VALUE);\r\n * // => false\r\n *\r\n * _.isLength(Infinity);\r\n * // => false\r\n *\r\n * _.isLength('3');\r\n * // => false\r\n */\r\n function isLength(value) {\r\n return typeof value == 'number' &&\r\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\r\n }\r\n\r\n /**\r\n * Checks if `value` is the\r\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\r\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\r\n * @example\r\n *\r\n * _.isObject({});\r\n * // => true\r\n *\r\n * _.isObject([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isObject(_.noop);\r\n * // => true\r\n *\r\n * _.isObject(null);\r\n * // => false\r\n */\r\n function isObject(value) {\r\n var type = typeof value;\r\n return value != null && (type == 'object' || type == 'function');\r\n }\r\n\r\n /**\r\n * Checks if `value` is object-like. A value is object-like if it's not `null`\r\n * and has a `typeof` result of \"object\".\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\r\n * @example\r\n *\r\n * _.isObjectLike({});\r\n * // => true\r\n *\r\n * _.isObjectLike([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isObjectLike(_.noop);\r\n * // => false\r\n *\r\n * _.isObjectLike(null);\r\n * // => false\r\n */\r\n function isObjectLike(value) {\r\n return value != null && typeof value == 'object';\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `Map` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\r\n * @example\r\n *\r\n * _.isMap(new Map);\r\n * // => true\r\n *\r\n * _.isMap(new WeakMap);\r\n * // => false\r\n */\r\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\r\n\r\n /**\r\n * Performs a partial deep comparison between `object` and `source` to\r\n * determine if `object` contains equivalent property values.\r\n *\r\n * **Note:** This method is equivalent to `_.matches` when `source` is\r\n * partially applied.\r\n *\r\n * Partial comparisons will match empty array and empty object `source`\r\n * values against any array or object value, respectively. See `_.isEqual`\r\n * for a list of supported value comparisons.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {Object} object The object to inspect.\r\n * @param {Object} source The object of property values to match.\r\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': 2 };\r\n *\r\n * _.isMatch(object, { 'b': 2 });\r\n * // => true\r\n *\r\n * _.isMatch(object, { 'b': 1 });\r\n * // => false\r\n */\r\n function isMatch(object, source) {\r\n return object === source || baseIsMatch(object, source, getMatchData(source));\r\n }\r\n\r\n /**\r\n * This method is like `_.isMatch` except that it accepts `customizer` which\r\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\r\n * are handled by the method instead. The `customizer` is invoked with five\r\n * arguments: (objValue, srcValue, index|key, object, source).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {Object} object The object to inspect.\r\n * @param {Object} source The object of property values to match.\r\n * @param {Function} [customizer] The function to customize comparisons.\r\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\r\n * @example\r\n *\r\n * function isGreeting(value) {\r\n * return /^h(?:i|ello)$/.test(value);\r\n * }\r\n *\r\n * function customizer(objValue, srcValue) {\r\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\r\n * return true;\r\n * }\r\n * }\r\n *\r\n * var object = { 'greeting': 'hello' };\r\n * var source = { 'greeting': 'hi' };\r\n *\r\n * _.isMatchWith(object, source, customizer);\r\n * // => true\r\n */\r\n function isMatchWith(object, source, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n return baseIsMatch(object, source, getMatchData(source), customizer);\r\n }\r\n\r\n /**\r\n * Checks if `value` is `NaN`.\r\n *\r\n * **Note:** This method is based on\r\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\r\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\r\n * `undefined` and other non-number values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\r\n * @example\r\n *\r\n * _.isNaN(NaN);\r\n * // => true\r\n *\r\n * _.isNaN(new Number(NaN));\r\n * // => true\r\n *\r\n * isNaN(undefined);\r\n * // => true\r\n *\r\n * _.isNaN(undefined);\r\n * // => false\r\n */\r\n function isNaN(value) {\r\n // An `NaN` primitive is the only value that is not equal to itself.\r\n // Perform the `toStringTag` check first to avoid errors with some\r\n // ActiveX objects in IE.\r\n return isNumber(value) && value != +value;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a pristine native function.\r\n *\r\n * **Note:** This method can't reliably detect native functions in the presence\r\n * of the core-js package because core-js circumvents this kind of detection.\r\n * Despite multiple requests, the core-js maintainer has made it clear: any\r\n * attempt to fix the detection will be obstructed. As a result, we're left\r\n * with little choice but to throw an error. Unfortunately, this also affects\r\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\r\n * which rely on core-js.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a native function,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.isNative(Array.prototype.push);\r\n * // => true\r\n *\r\n * _.isNative(_);\r\n * // => false\r\n */\r\n function isNative(value) {\r\n if (isMaskable(value)) {\r\n throw new Error(CORE_ERROR_TEXT);\r\n }\r\n return baseIsNative(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is `null`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\r\n * @example\r\n *\r\n * _.isNull(null);\r\n * // => true\r\n *\r\n * _.isNull(void 0);\r\n * // => false\r\n */\r\n function isNull(value) {\r\n return value === null;\r\n }\r\n\r\n /**\r\n * Checks if `value` is `null` or `undefined`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\r\n * @example\r\n *\r\n * _.isNil(null);\r\n * // => true\r\n *\r\n * _.isNil(void 0);\r\n * // => true\r\n *\r\n * _.isNil(NaN);\r\n * // => false\r\n */\r\n function isNil(value) {\r\n return value == null;\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `Number` primitive or object.\r\n *\r\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\r\n * classified as numbers, use the `_.isFinite` method.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\r\n * @example\r\n *\r\n * _.isNumber(3);\r\n * // => true\r\n *\r\n * _.isNumber(Number.MIN_VALUE);\r\n * // => true\r\n *\r\n * _.isNumber(Infinity);\r\n * // => true\r\n *\r\n * _.isNumber('3');\r\n * // => false\r\n */\r\n function isNumber(value) {\r\n return typeof value == 'number' ||\r\n (isObjectLike(value) && baseGetTag(value) == numberTag);\r\n }\r\n\r\n /**\r\n * Checks if `value` is a plain object, that is, an object created by the\r\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.8.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * }\r\n *\r\n * _.isPlainObject(new Foo);\r\n * // => false\r\n *\r\n * _.isPlainObject([1, 2, 3]);\r\n * // => false\r\n *\r\n * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n * // => true\r\n *\r\n * _.isPlainObject(Object.create(null));\r\n * // => true\r\n */\r\n function isPlainObject(value) {\r\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\r\n return false;\r\n }\r\n var proto = getPrototype(value);\r\n if (proto === null) {\r\n return true;\r\n }\r\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\r\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\r\n funcToString.call(Ctor) == objectCtorString;\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `RegExp` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\r\n * @example\r\n *\r\n * _.isRegExp(/abc/);\r\n * // => true\r\n *\r\n * _.isRegExp('/abc/');\r\n * // => false\r\n */\r\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\r\n\r\n /**\r\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\r\n * double precision number which isn't the result of a rounded unsafe integer.\r\n *\r\n * **Note:** This method is based on\r\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\r\n * @example\r\n *\r\n * _.isSafeInteger(3);\r\n * // => true\r\n *\r\n * _.isSafeInteger(Number.MIN_VALUE);\r\n * // => false\r\n *\r\n * _.isSafeInteger(Infinity);\r\n * // => false\r\n *\r\n * _.isSafeInteger('3');\r\n * // => false\r\n */\r\n function isSafeInteger(value) {\r\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `Set` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\r\n * @example\r\n *\r\n * _.isSet(new Set);\r\n * // => true\r\n *\r\n * _.isSet(new WeakSet);\r\n * // => false\r\n */\r\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\r\n\r\n /**\r\n * Checks if `value` is classified as a `String` primitive or object.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\r\n * @example\r\n *\r\n * _.isString('abc');\r\n * // => true\r\n *\r\n * _.isString(1);\r\n * // => false\r\n */\r\n function isString(value) {\r\n return typeof value == 'string' ||\r\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `Symbol` primitive or object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\r\n * @example\r\n *\r\n * _.isSymbol(Symbol.iterator);\r\n * // => true\r\n *\r\n * _.isSymbol('abc');\r\n * // => false\r\n */\r\n function isSymbol(value) {\r\n return typeof value == 'symbol' ||\r\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a typed array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\r\n * @example\r\n *\r\n * _.isTypedArray(new Uint8Array);\r\n * // => true\r\n *\r\n * _.isTypedArray([]);\r\n * // => false\r\n */\r\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\r\n\r\n /**\r\n * Checks if `value` is `undefined`.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\r\n * @example\r\n *\r\n * _.isUndefined(void 0);\r\n * // => true\r\n *\r\n * _.isUndefined(null);\r\n * // => false\r\n */\r\n function isUndefined(value) {\r\n return value === undefined;\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `WeakMap` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\r\n * @example\r\n *\r\n * _.isWeakMap(new WeakMap);\r\n * // => true\r\n *\r\n * _.isWeakMap(new Map);\r\n * // => false\r\n */\r\n function isWeakMap(value) {\r\n return isObjectLike(value) && getTag(value) == weakMapTag;\r\n }\r\n\r\n /**\r\n * Checks if `value` is classified as a `WeakSet` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\r\n * @example\r\n *\r\n * _.isWeakSet(new WeakSet);\r\n * // => true\r\n *\r\n * _.isWeakSet(new Set);\r\n * // => false\r\n */\r\n function isWeakSet(value) {\r\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\r\n }\r\n\r\n /**\r\n * Checks if `value` is less than `other`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.9.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is less than `other`,\r\n * else `false`.\r\n * @see _.gt\r\n * @example\r\n *\r\n * _.lt(1, 3);\r\n * // => true\r\n *\r\n * _.lt(3, 3);\r\n * // => false\r\n *\r\n * _.lt(3, 1);\r\n * // => false\r\n */\r\n var lt = createRelationalOperation(baseLt);\r\n\r\n /**\r\n * Checks if `value` is less than or equal to `other`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.9.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns `true` if `value` is less than or equal to\r\n * `other`, else `false`.\r\n * @see _.gte\r\n * @example\r\n *\r\n * _.lte(1, 3);\r\n * // => true\r\n *\r\n * _.lte(3, 3);\r\n * // => true\r\n *\r\n * _.lte(3, 1);\r\n * // => false\r\n */\r\n var lte = createRelationalOperation(function(value, other) {\r\n return value <= other;\r\n });\r\n\r\n /**\r\n * Converts `value` to an array.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {Array} Returns the converted array.\r\n * @example\r\n *\r\n * _.toArray({ 'a': 1, 'b': 2 });\r\n * // => [1, 2]\r\n *\r\n * _.toArray('abc');\r\n * // => ['a', 'b', 'c']\r\n *\r\n * _.toArray(1);\r\n * // => []\r\n *\r\n * _.toArray(null);\r\n * // => []\r\n */\r\n function toArray(value) {\r\n if (!value) {\r\n return [];\r\n }\r\n if (isArrayLike(value)) {\r\n return isString(value) ? stringToArray(value) : copyArray(value);\r\n }\r\n if (symIterator && value[symIterator]) {\r\n return iteratorToArray(value[symIterator]());\r\n }\r\n var tag = getTag(value),\r\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\r\n\r\n return func(value);\r\n }\r\n\r\n /**\r\n * Converts `value` to a finite number.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.12.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {number} Returns the converted number.\r\n * @example\r\n *\r\n * _.toFinite(3.2);\r\n * // => 3.2\r\n *\r\n * _.toFinite(Number.MIN_VALUE);\r\n * // => 5e-324\r\n *\r\n * _.toFinite(Infinity);\r\n * // => 1.7976931348623157e+308\r\n *\r\n * _.toFinite('3.2');\r\n * // => 3.2\r\n */\r\n function toFinite(value) {\r\n if (!value) {\r\n return value === 0 ? value : 0;\r\n }\r\n value = toNumber(value);\r\n if (value === INFINITY || value === -INFINITY) {\r\n var sign = (value < 0 ? -1 : 1);\r\n return sign * MAX_INTEGER;\r\n }\r\n return value === value ? value : 0;\r\n }\r\n\r\n /**\r\n * Converts `value` to an integer.\r\n *\r\n * **Note:** This method is loosely based on\r\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {number} Returns the converted integer.\r\n * @example\r\n *\r\n * _.toInteger(3.2);\r\n * // => 3\r\n *\r\n * _.toInteger(Number.MIN_VALUE);\r\n * // => 0\r\n *\r\n * _.toInteger(Infinity);\r\n * // => 1.7976931348623157e+308\r\n *\r\n * _.toInteger('3.2');\r\n * // => 3\r\n */\r\n function toInteger(value) {\r\n var result = toFinite(value),\r\n remainder = result % 1;\r\n\r\n return result === result ? (remainder ? result - remainder : result) : 0;\r\n }\r\n\r\n /**\r\n * Converts `value` to an integer suitable for use as the length of an\r\n * array-like object.\r\n *\r\n * **Note:** This method is based on\r\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {number} Returns the converted integer.\r\n * @example\r\n *\r\n * _.toLength(3.2);\r\n * // => 3\r\n *\r\n * _.toLength(Number.MIN_VALUE);\r\n * // => 0\r\n *\r\n * _.toLength(Infinity);\r\n * // => 4294967295\r\n *\r\n * _.toLength('3.2');\r\n * // => 3\r\n */\r\n function toLength(value) {\r\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\r\n }\r\n\r\n /**\r\n * Converts `value` to a number.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to process.\r\n * @returns {number} Returns the number.\r\n * @example\r\n *\r\n * _.toNumber(3.2);\r\n * // => 3.2\r\n *\r\n * _.toNumber(Number.MIN_VALUE);\r\n * // => 5e-324\r\n *\r\n * _.toNumber(Infinity);\r\n * // => Infinity\r\n *\r\n * _.toNumber('3.2');\r\n * // => 3.2\r\n */\r\n function toNumber(value) {\r\n if (typeof value == 'number') {\r\n return value;\r\n }\r\n if (isSymbol(value)) {\r\n return NAN;\r\n }\r\n if (isObject(value)) {\r\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\r\n value = isObject(other) ? (other + '') : other;\r\n }\r\n if (typeof value != 'string') {\r\n return value === 0 ? value : +value;\r\n }\r\n value = baseTrim(value);\r\n var isBinary = reIsBinary.test(value);\r\n return (isBinary || reIsOctal.test(value))\r\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\r\n : (reIsBadHex.test(value) ? NAN : +value);\r\n }\r\n\r\n /**\r\n * Converts `value` to a plain object flattening inherited enumerable string\r\n * keyed properties of `value` to own properties of the plain object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {Object} Returns the converted plain object.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.assign({ 'a': 1 }, new Foo);\r\n * // => { 'a': 1, 'b': 2 }\r\n *\r\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\r\n * // => { 'a': 1, 'b': 2, 'c': 3 }\r\n */\r\n function toPlainObject(value) {\r\n return copyObject(value, keysIn(value));\r\n }\r\n\r\n /**\r\n * Converts `value` to a safe integer. A safe integer can be compared and\r\n * represented correctly.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {number} Returns the converted integer.\r\n * @example\r\n *\r\n * _.toSafeInteger(3.2);\r\n * // => 3\r\n *\r\n * _.toSafeInteger(Number.MIN_VALUE);\r\n * // => 0\r\n *\r\n * _.toSafeInteger(Infinity);\r\n * // => 9007199254740991\r\n *\r\n * _.toSafeInteger('3.2');\r\n * // => 3\r\n */\r\n function toSafeInteger(value) {\r\n return value\r\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\r\n : (value === 0 ? value : 0);\r\n }\r\n\r\n /**\r\n * Converts `value` to a string. An empty string is returned for `null`\r\n * and `undefined` values. The sign of `-0` is preserved.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {string} Returns the converted string.\r\n * @example\r\n *\r\n * _.toString(null);\r\n * // => ''\r\n *\r\n * _.toString(-0);\r\n * // => '-0'\r\n *\r\n * _.toString([1, 2, 3]);\r\n * // => '1,2,3'\r\n */\r\n function toString(value) {\r\n return value == null ? '' : baseToString(value);\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Assigns own enumerable string keyed properties of source objects to the\r\n * destination object. Source objects are applied from left to right.\r\n * Subsequent sources overwrite property assignments of previous sources.\r\n *\r\n * **Note:** This method mutates `object` and is loosely based on\r\n * [`Object.assign`](https://mdn.io/Object/assign).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.10.0\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [sources] The source objects.\r\n * @returns {Object} Returns `object`.\r\n * @see _.assignIn\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * }\r\n *\r\n * function Bar() {\r\n * this.c = 3;\r\n * }\r\n *\r\n * Foo.prototype.b = 2;\r\n * Bar.prototype.d = 4;\r\n *\r\n * _.assign({ 'a': 0 }, new Foo, new Bar);\r\n * // => { 'a': 1, 'c': 3 }\r\n */\r\n var assign = createAssigner(function(object, source) {\r\n if (isPrototype(source) || isArrayLike(source)) {\r\n copyObject(source, keys(source), object);\r\n return;\r\n }\r\n for (var key in source) {\r\n if (hasOwnProperty.call(source, key)) {\r\n assignValue(object, key, source[key]);\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * This method is like `_.assign` except that it iterates over own and\r\n * inherited source properties.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @alias extend\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [sources] The source objects.\r\n * @returns {Object} Returns `object`.\r\n * @see _.assign\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * }\r\n *\r\n * function Bar() {\r\n * this.c = 3;\r\n * }\r\n *\r\n * Foo.prototype.b = 2;\r\n * Bar.prototype.d = 4;\r\n *\r\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\r\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\r\n */\r\n var assignIn = createAssigner(function(object, source) {\r\n copyObject(source, keysIn(source), object);\r\n });\r\n\r\n /**\r\n * This method is like `_.assignIn` except that it accepts `customizer`\r\n * which is invoked to produce the assigned values. If `customizer` returns\r\n * `undefined`, assignment is handled by the method instead. The `customizer`\r\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @alias extendWith\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} sources The source objects.\r\n * @param {Function} [customizer] The function to customize assigned values.\r\n * @returns {Object} Returns `object`.\r\n * @see _.assignWith\r\n * @example\r\n *\r\n * function customizer(objValue, srcValue) {\r\n * return _.isUndefined(objValue) ? srcValue : objValue;\r\n * }\r\n *\r\n * var defaults = _.partialRight(_.assignInWith, customizer);\r\n *\r\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\r\n * // => { 'a': 1, 'b': 2 }\r\n */\r\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\r\n copyObject(source, keysIn(source), object, customizer);\r\n });\r\n\r\n /**\r\n * This method is like `_.assign` except that it accepts `customizer`\r\n * which is invoked to produce the assigned values. If `customizer` returns\r\n * `undefined`, assignment is handled by the method instead. The `customizer`\r\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} sources The source objects.\r\n * @param {Function} [customizer] The function to customize assigned values.\r\n * @returns {Object} Returns `object`.\r\n * @see _.assignInWith\r\n * @example\r\n *\r\n * function customizer(objValue, srcValue) {\r\n * return _.isUndefined(objValue) ? srcValue : objValue;\r\n * }\r\n *\r\n * var defaults = _.partialRight(_.assignWith, customizer);\r\n *\r\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\r\n * // => { 'a': 1, 'b': 2 }\r\n */\r\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\r\n copyObject(source, keys(source), object, customizer);\r\n });\r\n\r\n /**\r\n * Creates an array of values corresponding to `paths` of `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.0.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {...(string|string[])} [paths] The property paths to pick.\r\n * @returns {Array} Returns the picked values.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\r\n *\r\n * _.at(object, ['a[0].b.c', 'a[1]']);\r\n * // => [3, 4]\r\n */\r\n var at = flatRest(baseAt);\r\n\r\n /**\r\n * Creates an object that inherits from the `prototype` object. If a\r\n * `properties` object is given, its own enumerable string keyed properties\r\n * are assigned to the created object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.3.0\r\n * @category Object\r\n * @param {Object} prototype The object to inherit from.\r\n * @param {Object} [properties] The properties to assign to the object.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * function Shape() {\r\n * this.x = 0;\r\n * this.y = 0;\r\n * }\r\n *\r\n * function Circle() {\r\n * Shape.call(this);\r\n * }\r\n *\r\n * Circle.prototype = _.create(Shape.prototype, {\r\n * 'constructor': Circle\r\n * });\r\n *\r\n * var circle = new Circle;\r\n * circle instanceof Circle;\r\n * // => true\r\n *\r\n * circle instanceof Shape;\r\n * // => true\r\n */\r\n function create(prototype, properties) {\r\n var result = baseCreate(prototype);\r\n return properties == null ? result : baseAssign(result, properties);\r\n }\r\n\r\n /**\r\n * Assigns own and inherited enumerable string keyed properties of source\r\n * objects to the destination object for all destination properties that\r\n * resolve to `undefined`. Source objects are applied from left to right.\r\n * Once a property is set, additional values of the same property are ignored.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [sources] The source objects.\r\n * @returns {Object} Returns `object`.\r\n * @see _.defaultsDeep\r\n * @example\r\n *\r\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\r\n * // => { 'a': 1, 'b': 2 }\r\n */\r\n var defaults = baseRest(function(object, sources) {\r\n object = Object(object);\r\n\r\n var index = -1;\r\n var length = sources.length;\r\n var guard = length > 2 ? sources[2] : undefined;\r\n\r\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\r\n length = 1;\r\n }\r\n\r\n while (++index < length) {\r\n var source = sources[index];\r\n var props = keysIn(source);\r\n var propsIndex = -1;\r\n var propsLength = props.length;\r\n\r\n while (++propsIndex < propsLength) {\r\n var key = props[propsIndex];\r\n var value = object[key];\r\n\r\n if (value === undefined ||\r\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\r\n object[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n });\r\n\r\n /**\r\n * This method is like `_.defaults` except that it recursively assigns\r\n * default properties.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.10.0\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [sources] The source objects.\r\n * @returns {Object} Returns `object`.\r\n * @see _.defaults\r\n * @example\r\n *\r\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\r\n * // => { 'a': { 'b': 2, 'c': 3 } }\r\n */\r\n var defaultsDeep = baseRest(function(args) {\r\n args.push(undefined, customDefaultsMerge);\r\n return apply(mergeWith, undefined, args);\r\n });\r\n\r\n /**\r\n * This method is like `_.find` except that it returns the key of the first\r\n * element `predicate` returns truthy for instead of the element itself.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.1.0\r\n * @category Object\r\n * @param {Object} object The object to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {string|undefined} Returns the key of the matched element,\r\n * else `undefined`.\r\n * @example\r\n *\r\n * var users = {\r\n * 'barney': { 'age': 36, 'active': true },\r\n * 'fred': { 'age': 40, 'active': false },\r\n * 'pebbles': { 'age': 1, 'active': true }\r\n * };\r\n *\r\n * _.findKey(users, function(o) { return o.age < 40; });\r\n * // => 'barney' (iteration order is not guaranteed)\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.findKey(users, { 'age': 1, 'active': true });\r\n * // => 'pebbles'\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.findKey(users, ['active', false]);\r\n * // => 'fred'\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.findKey(users, 'active');\r\n * // => 'barney'\r\n */\r\n function findKey(object, predicate) {\r\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\r\n }\r\n\r\n /**\r\n * This method is like `_.findKey` except that it iterates over elements of\r\n * a collection in the opposite order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Object\r\n * @param {Object} object The object to inspect.\r\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\r\n * @returns {string|undefined} Returns the key of the matched element,\r\n * else `undefined`.\r\n * @example\r\n *\r\n * var users = {\r\n * 'barney': { 'age': 36, 'active': true },\r\n * 'fred': { 'age': 40, 'active': false },\r\n * 'pebbles': { 'age': 1, 'active': true }\r\n * };\r\n *\r\n * _.findLastKey(users, function(o) { return o.age < 40; });\r\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\r\n *\r\n * // The `_.matches` iteratee shorthand.\r\n * _.findLastKey(users, { 'age': 36, 'active': true });\r\n * // => 'barney'\r\n *\r\n * // The `_.matchesProperty` iteratee shorthand.\r\n * _.findLastKey(users, ['active', false]);\r\n * // => 'fred'\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.findLastKey(users, 'active');\r\n * // => 'pebbles'\r\n */\r\n function findLastKey(object, predicate) {\r\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\r\n }\r\n\r\n /**\r\n * Iterates over own and inherited enumerable string keyed properties of an\r\n * object and invokes `iteratee` for each property. The iteratee is invoked\r\n * with three arguments: (value, key, object). Iteratee functions may exit\r\n * iteration early by explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.3.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n * @see _.forInRight\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.forIn(new Foo, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\r\n */\r\n function forIn(object, iteratee) {\r\n return object == null\r\n ? object\r\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\r\n }\r\n\r\n /**\r\n * This method is like `_.forIn` except that it iterates over properties of\r\n * `object` in the opposite order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n * @see _.forIn\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.forInRight(new Foo, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\r\n */\r\n function forInRight(object, iteratee) {\r\n return object == null\r\n ? object\r\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\r\n }\r\n\r\n /**\r\n * Iterates over own enumerable string keyed properties of an object and\r\n * invokes `iteratee` for each property. The iteratee is invoked with three\r\n * arguments: (value, key, object). Iteratee functions may exit iteration\r\n * early by explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.3.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n * @see _.forOwnRight\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.forOwn(new Foo, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\r\n */\r\n function forOwn(object, iteratee) {\r\n return object && baseForOwn(object, getIteratee(iteratee, 3));\r\n }\r\n\r\n /**\r\n * This method is like `_.forOwn` except that it iterates over properties of\r\n * `object` in the opposite order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.0.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n * @see _.forOwn\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.forOwnRight(new Foo, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\r\n */\r\n function forOwnRight(object, iteratee) {\r\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\r\n }\r\n\r\n /**\r\n * Creates an array of function property names from own enumerable properties\r\n * of `object`.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns the function names.\r\n * @see _.functionsIn\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = _.constant('a');\r\n * this.b = _.constant('b');\r\n * }\r\n *\r\n * Foo.prototype.c = _.constant('c');\r\n *\r\n * _.functions(new Foo);\r\n * // => ['a', 'b']\r\n */\r\n function functions(object) {\r\n return object == null ? [] : baseFunctions(object, keys(object));\r\n }\r\n\r\n /**\r\n * Creates an array of function property names from own and inherited\r\n * enumerable properties of `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns the function names.\r\n * @see _.functions\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = _.constant('a');\r\n * this.b = _.constant('b');\r\n * }\r\n *\r\n * Foo.prototype.c = _.constant('c');\r\n *\r\n * _.functionsIn(new Foo);\r\n * // => ['a', 'b', 'c']\r\n */\r\n function functionsIn(object) {\r\n return object == null ? [] : baseFunctions(object, keysIn(object));\r\n }\r\n\r\n /**\r\n * Gets the value at `path` of `object`. If the resolved value is\r\n * `undefined`, the `defaultValue` is returned in its place.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.7.0\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path of the property to get.\r\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\r\n * @returns {*} Returns the resolved value.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\r\n *\r\n * _.get(object, 'a[0].b.c');\r\n * // => 3\r\n *\r\n * _.get(object, ['a', '0', 'b', 'c']);\r\n * // => 3\r\n *\r\n * _.get(object, 'a.b.c', 'default');\r\n * // => 'default'\r\n */\r\n function get(object, path, defaultValue) {\r\n var result = object == null ? undefined : baseGet(object, path);\r\n return result === undefined ? defaultValue : result;\r\n }\r\n\r\n /**\r\n * Checks if `path` is a direct property of `object`.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path to check.\r\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': { 'b': 2 } };\r\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\r\n *\r\n * _.has(object, 'a');\r\n * // => true\r\n *\r\n * _.has(object, 'a.b');\r\n * // => true\r\n *\r\n * _.has(object, ['a', 'b']);\r\n * // => true\r\n *\r\n * _.has(other, 'a');\r\n * // => false\r\n */\r\n function has(object, path) {\r\n return object != null && hasPath(object, path, baseHas);\r\n }\r\n\r\n /**\r\n * Checks if `path` is a direct or inherited property of `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path to check.\r\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\r\n * @example\r\n *\r\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\r\n *\r\n * _.hasIn(object, 'a');\r\n * // => true\r\n *\r\n * _.hasIn(object, 'a.b');\r\n * // => true\r\n *\r\n * _.hasIn(object, ['a', 'b']);\r\n * // => true\r\n *\r\n * _.hasIn(object, 'b');\r\n * // => false\r\n */\r\n function hasIn(object, path) {\r\n return object != null && hasPath(object, path, baseHasIn);\r\n }\r\n\r\n /**\r\n * Creates an object composed of the inverted keys and values of `object`.\r\n * If `object` contains duplicate values, subsequent values overwrite\r\n * property assignments of previous values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.7.0\r\n * @category Object\r\n * @param {Object} object The object to invert.\r\n * @returns {Object} Returns the new inverted object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\r\n *\r\n * _.invert(object);\r\n * // => { '1': 'c', '2': 'b' }\r\n */\r\n var invert = createInverter(function(result, value, key) {\r\n if (value != null &&\r\n typeof value.toString != 'function') {\r\n value = nativeObjectToString.call(value);\r\n }\r\n\r\n result[value] = key;\r\n }, constant(identity));\r\n\r\n /**\r\n * This method is like `_.invert` except that the inverted object is generated\r\n * from the results of running each element of `object` thru `iteratee`. The\r\n * corresponding inverted value of each inverted key is an array of keys\r\n * responsible for generating the inverted value. The iteratee is invoked\r\n * with one argument: (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.1.0\r\n * @category Object\r\n * @param {Object} object The object to invert.\r\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\r\n * @returns {Object} Returns the new inverted object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\r\n *\r\n * _.invertBy(object);\r\n * // => { '1': ['a', 'c'], '2': ['b'] }\r\n *\r\n * _.invertBy(object, function(value) {\r\n * return 'group' + value;\r\n * });\r\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\r\n */\r\n var invertBy = createInverter(function(result, value, key) {\r\n if (value != null &&\r\n typeof value.toString != 'function') {\r\n value = nativeObjectToString.call(value);\r\n }\r\n\r\n if (hasOwnProperty.call(result, value)) {\r\n result[value].push(key);\r\n } else {\r\n result[value] = [key];\r\n }\r\n }, getIteratee);\r\n\r\n /**\r\n * Invokes the method at `path` of `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path of the method to invoke.\r\n * @param {...*} [args] The arguments to invoke the method with.\r\n * @returns {*} Returns the result of the invoked method.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\r\n *\r\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\r\n * // => [2, 3]\r\n */\r\n var invoke = baseRest(baseInvoke);\r\n\r\n /**\r\n * Creates an array of the own enumerable property names of `object`.\r\n *\r\n * **Note:** Non-object values are coerced to objects. See the\r\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\r\n * for more details.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.keys(new Foo);\r\n * // => ['a', 'b'] (iteration order is not guaranteed)\r\n *\r\n * _.keys('hi');\r\n * // => ['0', '1']\r\n */\r\n function keys(object) {\r\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\r\n }\r\n\r\n /**\r\n * Creates an array of the own and inherited enumerable property names of `object`.\r\n *\r\n * **Note:** Non-object values are coerced to objects.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.keysIn(new Foo);\r\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\r\n */\r\n function keysIn(object) {\r\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\r\n }\r\n\r\n /**\r\n * The opposite of `_.mapValues`; this method creates an object with the\r\n * same values as `object` and keys generated by running each own enumerable\r\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\r\n * with three arguments: (value, key, object).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.8.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns the new mapped object.\r\n * @see _.mapValues\r\n * @example\r\n *\r\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\r\n * return key + value;\r\n * });\r\n * // => { 'a1': 1, 'b2': 2 }\r\n */\r\n function mapKeys(object, iteratee) {\r\n var result = {};\r\n iteratee = getIteratee(iteratee, 3);\r\n\r\n baseForOwn(object, function(value, key, object) {\r\n baseAssignValue(result, iteratee(value, key, object), value);\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an object with the same keys as `object` and values generated\r\n * by running each own enumerable string keyed property of `object` thru\r\n * `iteratee`. The iteratee is invoked with three arguments:\r\n * (value, key, object).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.4.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @returns {Object} Returns the new mapped object.\r\n * @see _.mapKeys\r\n * @example\r\n *\r\n * var users = {\r\n * 'fred': { 'user': 'fred', 'age': 40 },\r\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\r\n * };\r\n *\r\n * _.mapValues(users, function(o) { return o.age; });\r\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\r\n *\r\n * // The `_.property` iteratee shorthand.\r\n * _.mapValues(users, 'age');\r\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\r\n */\r\n function mapValues(object, iteratee) {\r\n var result = {};\r\n iteratee = getIteratee(iteratee, 3);\r\n\r\n baseForOwn(object, function(value, key, object) {\r\n baseAssignValue(result, key, iteratee(value, key, object));\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * This method is like `_.assign` except that it recursively merges own and\r\n * inherited enumerable string keyed properties of source objects into the\r\n * destination object. Source properties that resolve to `undefined` are\r\n * skipped if a destination value exists. Array and plain object properties\r\n * are merged recursively. Other objects and value types are overridden by\r\n * assignment. Source objects are applied from left to right. Subsequent\r\n * sources overwrite property assignments of previous sources.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.5.0\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [sources] The source objects.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var object = {\r\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\r\n * };\r\n *\r\n * var other = {\r\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\r\n * };\r\n *\r\n * _.merge(object, other);\r\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\r\n */\r\n var merge = createAssigner(function(object, source, srcIndex) {\r\n baseMerge(object, source, srcIndex);\r\n });\r\n\r\n /**\r\n * This method is like `_.merge` except that it accepts `customizer` which\r\n * is invoked to produce the merged values of the destination and source\r\n * properties. If `customizer` returns `undefined`, merging is handled by the\r\n * method instead. The `customizer` is invoked with six arguments:\r\n * (objValue, srcValue, key, object, source, stack).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The destination object.\r\n * @param {...Object} sources The source objects.\r\n * @param {Function} customizer The function to customize assigned values.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * function customizer(objValue, srcValue) {\r\n * if (_.isArray(objValue)) {\r\n * return objValue.concat(srcValue);\r\n * }\r\n * }\r\n *\r\n * var object = { 'a': [1], 'b': [2] };\r\n * var other = { 'a': [3], 'b': [4] };\r\n *\r\n * _.mergeWith(object, other, customizer);\r\n * // => { 'a': [1, 3], 'b': [2, 4] }\r\n */\r\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\r\n baseMerge(object, source, srcIndex, customizer);\r\n });\r\n\r\n /**\r\n * The opposite of `_.pick`; this method creates an object composed of the\r\n * own and inherited enumerable property paths of `object` that are not omitted.\r\n *\r\n * **Note:** This method is considerably slower than `_.pick`.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The source object.\r\n * @param {...(string|string[])} [paths] The property paths to omit.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\r\n *\r\n * _.omit(object, ['a', 'c']);\r\n * // => { 'b': '2' }\r\n */\r\n var omit = flatRest(function(object, paths) {\r\n var result = {};\r\n if (object == null) {\r\n return result;\r\n }\r\n var isDeep = false;\r\n paths = arrayMap(paths, function(path) {\r\n path = castPath(path, object);\r\n isDeep || (isDeep = path.length > 1);\r\n return path;\r\n });\r\n copyObject(object, getAllKeysIn(object), result);\r\n if (isDeep) {\r\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\r\n }\r\n var length = paths.length;\r\n while (length--) {\r\n baseUnset(result, paths[length]);\r\n }\r\n return result;\r\n });\r\n\r\n /**\r\n * The opposite of `_.pickBy`; this method creates an object composed of\r\n * the own and inherited enumerable string keyed properties of `object` that\r\n * `predicate` doesn't return truthy for. The predicate is invoked with two\r\n * arguments: (value, key).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The source object.\r\n * @param {Function} [predicate=_.identity] The function invoked per property.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\r\n *\r\n * _.omitBy(object, _.isNumber);\r\n * // => { 'b': '2' }\r\n */\r\n function omitBy(object, predicate) {\r\n return pickBy(object, negate(getIteratee(predicate)));\r\n }\r\n\r\n /**\r\n * Creates an object composed of the picked `object` properties.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The source object.\r\n * @param {...(string|string[])} [paths] The property paths to pick.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\r\n *\r\n * _.pick(object, ['a', 'c']);\r\n * // => { 'a': 1, 'c': 3 }\r\n */\r\n var pick = flatRest(function(object, paths) {\r\n return object == null ? {} : basePick(object, paths);\r\n });\r\n\r\n /**\r\n * Creates an object composed of the `object` properties `predicate` returns\r\n * truthy for. The predicate is invoked with two arguments: (value, key).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The source object.\r\n * @param {Function} [predicate=_.identity] The function invoked per property.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\r\n *\r\n * _.pickBy(object, _.isNumber);\r\n * // => { 'a': 1, 'c': 3 }\r\n */\r\n function pickBy(object, predicate) {\r\n if (object == null) {\r\n return {};\r\n }\r\n var props = arrayMap(getAllKeysIn(object), function(prop) {\r\n return [prop];\r\n });\r\n predicate = getIteratee(predicate);\r\n return basePickBy(object, props, function(value, path) {\r\n return predicate(value, path[0]);\r\n });\r\n }\r\n\r\n /**\r\n * This method is like `_.get` except that if the resolved value is a\r\n * function it's invoked with the `this` binding of its parent object and\r\n * its result is returned.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @param {Array|string} path The path of the property to resolve.\r\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\r\n * @returns {*} Returns the resolved value.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\r\n *\r\n * _.result(object, 'a[0].b.c1');\r\n * // => 3\r\n *\r\n * _.result(object, 'a[0].b.c2');\r\n * // => 4\r\n *\r\n * _.result(object, 'a[0].b.c3', 'default');\r\n * // => 'default'\r\n *\r\n * _.result(object, 'a[0].b.c3', _.constant('default'));\r\n * // => 'default'\r\n */\r\n function result(object, path, defaultValue) {\r\n path = castPath(path, object);\r\n\r\n var index = -1,\r\n length = path.length;\r\n\r\n // Ensure the loop is entered when path is empty.\r\n if (!length) {\r\n length = 1;\r\n object = undefined;\r\n }\r\n while (++index < length) {\r\n var value = object == null ? undefined : object[toKey(path[index])];\r\n if (value === undefined) {\r\n index = length;\r\n value = defaultValue;\r\n }\r\n object = isFunction(value) ? value.call(object) : value;\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\r\n * it's created. Arrays are created for missing index properties while objects\r\n * are created for all other missing properties. Use `_.setWith` to customize\r\n * `path` creation.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.7.0\r\n * @category Object\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\r\n *\r\n * _.set(object, 'a[0].b.c', 4);\r\n * console.log(object.a[0].b.c);\r\n * // => 4\r\n *\r\n * _.set(object, ['x', '0', 'y', 'z'], 5);\r\n * console.log(object.x[0].y.z);\r\n * // => 5\r\n */\r\n function set(object, path, value) {\r\n return object == null ? object : baseSet(object, path, value);\r\n }\r\n\r\n /**\r\n * This method is like `_.set` except that it accepts `customizer` which is\r\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\r\n * path creation is handled by the method instead. The `customizer` is invoked\r\n * with three arguments: (nsValue, key, nsObject).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to set.\r\n * @param {*} value The value to set.\r\n * @param {Function} [customizer] The function to customize assigned values.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var object = {};\r\n *\r\n * _.setWith(object, '[0][1]', 'a', Object);\r\n * // => { '0': { '1': 'a' } }\r\n */\r\n function setWith(object, path, value, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n return object == null ? object : baseSet(object, path, value, customizer);\r\n }\r\n\r\n /**\r\n * Creates an array of own enumerable string keyed-value pairs for `object`\r\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\r\n * entries are returned.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @alias entries\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the key-value pairs.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.toPairs(new Foo);\r\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\r\n */\r\n var toPairs = createToPairs(keys);\r\n\r\n /**\r\n * Creates an array of own and inherited enumerable string keyed-value pairs\r\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\r\n * or set, its entries are returned.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @alias entriesIn\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the key-value pairs.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.toPairsIn(new Foo);\r\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\r\n */\r\n var toPairsIn = createToPairs(keysIn);\r\n\r\n /**\r\n * An alternative to `_.reduce`; this method transforms `object` to a new\r\n * `accumulator` object which is the result of running each of its own\r\n * enumerable string keyed properties thru `iteratee`, with each invocation\r\n * potentially mutating the `accumulator` object. If `accumulator` is not\r\n * provided, a new object with the same `[[Prototype]]` will be used. The\r\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\r\n * Iteratee functions may exit iteration early by explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.3.0\r\n * @category Object\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\r\n * @param {*} [accumulator] The custom accumulator value.\r\n * @returns {*} Returns the accumulated value.\r\n * @example\r\n *\r\n * _.transform([2, 3, 4], function(result, n) {\r\n * result.push(n *= n);\r\n * return n % 2 == 0;\r\n * }, []);\r\n * // => [4, 9]\r\n *\r\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\r\n * (result[value] || (result[value] = [])).push(key);\r\n * }, {});\r\n * // => { '1': ['a', 'c'], '2': ['b'] }\r\n */\r\n function transform(object, iteratee, accumulator) {\r\n var isArr = isArray(object),\r\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\r\n\r\n iteratee = getIteratee(iteratee, 4);\r\n if (accumulator == null) {\r\n var Ctor = object && object.constructor;\r\n if (isArrLike) {\r\n accumulator = isArr ? new Ctor : [];\r\n }\r\n else if (isObject(object)) {\r\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\r\n }\r\n else {\r\n accumulator = {};\r\n }\r\n }\r\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\r\n return iteratee(accumulator, value, index, object);\r\n });\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * Removes the property at `path` of `object`.\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Object\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to unset.\r\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\r\n * _.unset(object, 'a[0].b.c');\r\n * // => true\r\n *\r\n * console.log(object);\r\n * // => { 'a': [{ 'b': {} }] };\r\n *\r\n * _.unset(object, ['a', '0', 'b', 'c']);\r\n * // => true\r\n *\r\n * console.log(object);\r\n * // => { 'a': [{ 'b': {} }] };\r\n */\r\n function unset(object, path) {\r\n return object == null ? true : baseUnset(object, path);\r\n }\r\n\r\n /**\r\n * This method is like `_.set` except that accepts `updater` to produce the\r\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\r\n * is invoked with one argument: (value).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.6.0\r\n * @category Object\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to set.\r\n * @param {Function} updater The function to produce the updated value.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\r\n *\r\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\r\n * console.log(object.a[0].b.c);\r\n * // => 9\r\n *\r\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\r\n * console.log(object.x[0].y.z);\r\n * // => 0\r\n */\r\n function update(object, path, updater) {\r\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\r\n }\r\n\r\n /**\r\n * This method is like `_.update` except that it accepts `customizer` which is\r\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\r\n * path creation is handled by the method instead. The `customizer` is invoked\r\n * with three arguments: (nsValue, key, nsObject).\r\n *\r\n * **Note:** This method mutates `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.6.0\r\n * @category Object\r\n * @param {Object} object The object to modify.\r\n * @param {Array|string} path The path of the property to set.\r\n * @param {Function} updater The function to produce the updated value.\r\n * @param {Function} [customizer] The function to customize assigned values.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var object = {};\r\n *\r\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\r\n * // => { '0': { '1': 'a' } }\r\n */\r\n function updateWith(object, path, updater, customizer) {\r\n customizer = typeof customizer == 'function' ? customizer : undefined;\r\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\r\n }\r\n\r\n /**\r\n * Creates an array of the own enumerable string keyed property values of `object`.\r\n *\r\n * **Note:** Non-object values are coerced to objects.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property values.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.values(new Foo);\r\n * // => [1, 2] (iteration order is not guaranteed)\r\n *\r\n * _.values('hi');\r\n * // => ['h', 'i']\r\n */\r\n function values(object) {\r\n return object == null ? [] : baseValues(object, keys(object));\r\n }\r\n\r\n /**\r\n * Creates an array of the own and inherited enumerable string keyed property\r\n * values of `object`.\r\n *\r\n * **Note:** Non-object values are coerced to objects.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property values.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.valuesIn(new Foo);\r\n * // => [1, 2, 3] (iteration order is not guaranteed)\r\n */\r\n function valuesIn(object) {\r\n return object == null ? [] : baseValues(object, keysIn(object));\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Number\r\n * @param {number} number The number to clamp.\r\n * @param {number} [lower] The lower bound.\r\n * @param {number} upper The upper bound.\r\n * @returns {number} Returns the clamped number.\r\n * @example\r\n *\r\n * _.clamp(-10, -5, 5);\r\n * // => -5\r\n *\r\n * _.clamp(10, -5, 5);\r\n * // => 5\r\n */\r\n function clamp(number, lower, upper) {\r\n if (upper === undefined) {\r\n upper = lower;\r\n lower = undefined;\r\n }\r\n if (upper !== undefined) {\r\n upper = toNumber(upper);\r\n upper = upper === upper ? upper : 0;\r\n }\r\n if (lower !== undefined) {\r\n lower = toNumber(lower);\r\n lower = lower === lower ? lower : 0;\r\n }\r\n return baseClamp(toNumber(number), lower, upper);\r\n }\r\n\r\n /**\r\n * Checks if `n` is between `start` and up to, but not including, `end`. If\r\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\r\n * If `start` is greater than `end` the params are swapped to support\r\n * negative ranges.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.3.0\r\n * @category Number\r\n * @param {number} number The number to check.\r\n * @param {number} [start=0] The start of the range.\r\n * @param {number} end The end of the range.\r\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\r\n * @see _.range, _.rangeRight\r\n * @example\r\n *\r\n * _.inRange(3, 2, 4);\r\n * // => true\r\n *\r\n * _.inRange(4, 8);\r\n * // => true\r\n *\r\n * _.inRange(4, 2);\r\n * // => false\r\n *\r\n * _.inRange(2, 2);\r\n * // => false\r\n *\r\n * _.inRange(1.2, 2);\r\n * // => true\r\n *\r\n * _.inRange(5.2, 4);\r\n * // => false\r\n *\r\n * _.inRange(-3, -2, -6);\r\n * // => true\r\n */\r\n function inRange(number, start, end) {\r\n start = toFinite(start);\r\n if (end === undefined) {\r\n end = start;\r\n start = 0;\r\n } else {\r\n end = toFinite(end);\r\n }\r\n number = toNumber(number);\r\n return baseInRange(number, start, end);\r\n }\r\n\r\n /**\r\n * Produces a random number between the inclusive `lower` and `upper` bounds.\r\n * If only one argument is provided a number between `0` and the given number\r\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\r\n * floats, a floating-point number is returned instead of an integer.\r\n *\r\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\r\n * floating-point values which can produce unexpected results.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.7.0\r\n * @category Number\r\n * @param {number} [lower=0] The lower bound.\r\n * @param {number} [upper=1] The upper bound.\r\n * @param {boolean} [floating] Specify returning a floating-point number.\r\n * @returns {number} Returns the random number.\r\n * @example\r\n *\r\n * _.random(0, 5);\r\n * // => an integer between 0 and 5\r\n *\r\n * _.random(5);\r\n * // => also an integer between 0 and 5\r\n *\r\n * _.random(5, true);\r\n * // => a floating-point number between 0 and 5\r\n *\r\n * _.random(1.2, 5.2);\r\n * // => a floating-point number between 1.2 and 5.2\r\n */\r\n function random(lower, upper, floating) {\r\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\r\n upper = floating = undefined;\r\n }\r\n if (floating === undefined) {\r\n if (typeof upper == 'boolean') {\r\n floating = upper;\r\n upper = undefined;\r\n }\r\n else if (typeof lower == 'boolean') {\r\n floating = lower;\r\n lower = undefined;\r\n }\r\n }\r\n if (lower === undefined && upper === undefined) {\r\n lower = 0;\r\n upper = 1;\r\n }\r\n else {\r\n lower = toFinite(lower);\r\n if (upper === undefined) {\r\n upper = lower;\r\n lower = 0;\r\n } else {\r\n upper = toFinite(upper);\r\n }\r\n }\r\n if (lower > upper) {\r\n var temp = lower;\r\n lower = upper;\r\n upper = temp;\r\n }\r\n if (floating || lower % 1 || upper % 1) {\r\n var rand = nativeRandom();\r\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\r\n }\r\n return baseRandom(lower, upper);\r\n }\r\n\r\n /*------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the camel cased string.\r\n * @example\r\n *\r\n * _.camelCase('Foo Bar');\r\n * // => 'fooBar'\r\n *\r\n * _.camelCase('--foo-bar--');\r\n * // => 'fooBar'\r\n *\r\n * _.camelCase('__FOO_BAR__');\r\n * // => 'fooBar'\r\n */\r\n var camelCase = createCompounder(function(result, word, index) {\r\n word = word.toLowerCase();\r\n return result + (index ? capitalize(word) : word);\r\n });\r\n\r\n /**\r\n * Converts the first character of `string` to upper case and the remaining\r\n * to lower case.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to capitalize.\r\n * @returns {string} Returns the capitalized string.\r\n * @example\r\n *\r\n * _.capitalize('FRED');\r\n * // => 'Fred'\r\n */\r\n function capitalize(string) {\r\n return upperFirst(toString(string).toLowerCase());\r\n }\r\n\r\n /**\r\n * Deburrs `string` by converting\r\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\r\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\r\n * letters to basic Latin letters and removing\r\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to deburr.\r\n * @returns {string} Returns the deburred string.\r\n * @example\r\n *\r\n * _.deburr('déjà vu');\r\n * // => 'deja vu'\r\n */\r\n function deburr(string) {\r\n string = toString(string);\r\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\r\n }\r\n\r\n /**\r\n * Checks if `string` ends with the given target string.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to inspect.\r\n * @param {string} [target] The string to search for.\r\n * @param {number} [position=string.length] The position to search up to.\r\n * @returns {boolean} Returns `true` if `string` ends with `target`,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.endsWith('abc', 'c');\r\n * // => true\r\n *\r\n * _.endsWith('abc', 'b');\r\n * // => false\r\n *\r\n * _.endsWith('abc', 'b', 2);\r\n * // => true\r\n */\r\n function endsWith(string, target, position) {\r\n string = toString(string);\r\n target = baseToString(target);\r\n\r\n var length = string.length;\r\n position = position === undefined\r\n ? length\r\n : baseClamp(toInteger(position), 0, length);\r\n\r\n var end = position;\r\n position -= target.length;\r\n return position >= 0 && string.slice(position, end) == target;\r\n }\r\n\r\n /**\r\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\r\n * corresponding HTML entities.\r\n *\r\n * **Note:** No other characters are escaped. To escape additional\r\n * characters use a third-party library like [_he_](https://mths.be/he).\r\n *\r\n * Though the \">\" character is escaped for symmetry, characters like\r\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\r\n * unless they're part of a tag or unquoted attribute value. See\r\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\r\n * (under \"semi-related fun fact\") for more details.\r\n *\r\n * When working with HTML you should always\r\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\r\n * XSS vectors.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category String\r\n * @param {string} [string=''] The string to escape.\r\n * @returns {string} Returns the escaped string.\r\n * @example\r\n *\r\n * _.escape('fred, barney, & pebbles');\r\n * // => 'fred, barney, & pebbles'\r\n */\r\n function escape(string) {\r\n string = toString(string);\r\n return (string && reHasUnescapedHtml.test(string))\r\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\r\n : string;\r\n }\r\n\r\n /**\r\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\r\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to escape.\r\n * @returns {string} Returns the escaped string.\r\n * @example\r\n *\r\n * _.escapeRegExp('[lodash](https://lodash.com/)');\r\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\r\n */\r\n function escapeRegExp(string) {\r\n string = toString(string);\r\n return (string && reHasRegExpChar.test(string))\r\n ? string.replace(reRegExpChar, '\\\\$&')\r\n : string;\r\n }\r\n\r\n /**\r\n * Converts `string` to\r\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the kebab cased string.\r\n * @example\r\n *\r\n * _.kebabCase('Foo Bar');\r\n * // => 'foo-bar'\r\n *\r\n * _.kebabCase('fooBar');\r\n * // => 'foo-bar'\r\n *\r\n * _.kebabCase('__FOO_BAR__');\r\n * // => 'foo-bar'\r\n */\r\n var kebabCase = createCompounder(function(result, word, index) {\r\n return result + (index ? '-' : '') + word.toLowerCase();\r\n });\r\n\r\n /**\r\n * Converts `string`, as space separated words, to lower case.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the lower cased string.\r\n * @example\r\n *\r\n * _.lowerCase('--Foo-Bar--');\r\n * // => 'foo bar'\r\n *\r\n * _.lowerCase('fooBar');\r\n * // => 'foo bar'\r\n *\r\n * _.lowerCase('__FOO_BAR__');\r\n * // => 'foo bar'\r\n */\r\n var lowerCase = createCompounder(function(result, word, index) {\r\n return result + (index ? ' ' : '') + word.toLowerCase();\r\n });\r\n\r\n /**\r\n * Converts the first character of `string` to lower case.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the converted string.\r\n * @example\r\n *\r\n * _.lowerFirst('Fred');\r\n * // => 'fred'\r\n *\r\n * _.lowerFirst('FRED');\r\n * // => 'fRED'\r\n */\r\n var lowerFirst = createCaseFirst('toLowerCase');\r\n\r\n /**\r\n * Pads `string` on the left and right sides if it's shorter than `length`.\r\n * Padding characters are truncated if they can't be evenly divided by `length`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to pad.\r\n * @param {number} [length=0] The padding length.\r\n * @param {string} [chars=' '] The string used as padding.\r\n * @returns {string} Returns the padded string.\r\n * @example\r\n *\r\n * _.pad('abc', 8);\r\n * // => ' abc '\r\n *\r\n * _.pad('abc', 8, '_-');\r\n * // => '_-abc_-_'\r\n *\r\n * _.pad('abc', 3);\r\n * // => 'abc'\r\n */\r\n function pad(string, length, chars) {\r\n string = toString(string);\r\n length = toInteger(length);\r\n\r\n var strLength = length ? stringSize(string) : 0;\r\n if (!length || strLength >= length) {\r\n return string;\r\n }\r\n var mid = (length - strLength) / 2;\r\n return (\r\n createPadding(nativeFloor(mid), chars) +\r\n string +\r\n createPadding(nativeCeil(mid), chars)\r\n );\r\n }\r\n\r\n /**\r\n * Pads `string` on the right side if it's shorter than `length`. Padding\r\n * characters are truncated if they exceed `length`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to pad.\r\n * @param {number} [length=0] The padding length.\r\n * @param {string} [chars=' '] The string used as padding.\r\n * @returns {string} Returns the padded string.\r\n * @example\r\n *\r\n * _.padEnd('abc', 6);\r\n * // => 'abc '\r\n *\r\n * _.padEnd('abc', 6, '_-');\r\n * // => 'abc_-_'\r\n *\r\n * _.padEnd('abc', 3);\r\n * // => 'abc'\r\n */\r\n function padEnd(string, length, chars) {\r\n string = toString(string);\r\n length = toInteger(length);\r\n\r\n var strLength = length ? stringSize(string) : 0;\r\n return (length && strLength < length)\r\n ? (string + createPadding(length - strLength, chars))\r\n : string;\r\n }\r\n\r\n /**\r\n * Pads `string` on the left side if it's shorter than `length`. Padding\r\n * characters are truncated if they exceed `length`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to pad.\r\n * @param {number} [length=0] The padding length.\r\n * @param {string} [chars=' '] The string used as padding.\r\n * @returns {string} Returns the padded string.\r\n * @example\r\n *\r\n * _.padStart('abc', 6);\r\n * // => ' abc'\r\n *\r\n * _.padStart('abc', 6, '_-');\r\n * // => '_-_abc'\r\n *\r\n * _.padStart('abc', 3);\r\n * // => 'abc'\r\n */\r\n function padStart(string, length, chars) {\r\n string = toString(string);\r\n length = toInteger(length);\r\n\r\n var strLength = length ? stringSize(string) : 0;\r\n return (length && strLength < length)\r\n ? (createPadding(length - strLength, chars) + string)\r\n : string;\r\n }\r\n\r\n /**\r\n * Converts `string` to an integer of the specified radix. If `radix` is\r\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\r\n * hexadecimal, in which case a `radix` of `16` is used.\r\n *\r\n * **Note:** This method aligns with the\r\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 1.1.0\r\n * @category String\r\n * @param {string} string The string to convert.\r\n * @param {number} [radix=10] The radix to interpret `value` by.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {number} Returns the converted integer.\r\n * @example\r\n *\r\n * _.parseInt('08');\r\n * // => 8\r\n *\r\n * _.map(['6', '08', '10'], _.parseInt);\r\n * // => [6, 8, 10]\r\n */\r\n function parseInt(string, radix, guard) {\r\n if (guard || radix == null) {\r\n radix = 0;\r\n } else if (radix) {\r\n radix = +radix;\r\n }\r\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\r\n }\r\n\r\n /**\r\n * Repeats the given string `n` times.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to repeat.\r\n * @param {number} [n=1] The number of times to repeat the string.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {string} Returns the repeated string.\r\n * @example\r\n *\r\n * _.repeat('*', 3);\r\n * // => '***'\r\n *\r\n * _.repeat('abc', 2);\r\n * // => 'abcabc'\r\n *\r\n * _.repeat('abc', 0);\r\n * // => ''\r\n */\r\n function repeat(string, n, guard) {\r\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\r\n n = 1;\r\n } else {\r\n n = toInteger(n);\r\n }\r\n return baseRepeat(toString(string), n);\r\n }\r\n\r\n /**\r\n * Replaces matches for `pattern` in `string` with `replacement`.\r\n *\r\n * **Note:** This method is based on\r\n * [`String#replace`](https://mdn.io/String/replace).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to modify.\r\n * @param {RegExp|string} pattern The pattern to replace.\r\n * @param {Function|string} replacement The match replacement.\r\n * @returns {string} Returns the modified string.\r\n * @example\r\n *\r\n * _.replace('Hi Fred', 'Fred', 'Barney');\r\n * // => 'Hi Barney'\r\n */\r\n function replace() {\r\n var args = arguments,\r\n string = toString(args[0]);\r\n\r\n return args.length < 3 ? string : string.replace(args[1], args[2]);\r\n }\r\n\r\n /**\r\n * Converts `string` to\r\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the snake cased string.\r\n * @example\r\n *\r\n * _.snakeCase('Foo Bar');\r\n * // => 'foo_bar'\r\n *\r\n * _.snakeCase('fooBar');\r\n * // => 'foo_bar'\r\n *\r\n * _.snakeCase('--FOO-BAR--');\r\n * // => 'foo_bar'\r\n */\r\n var snakeCase = createCompounder(function(result, word, index) {\r\n return result + (index ? '_' : '') + word.toLowerCase();\r\n });\r\n\r\n /**\r\n * Splits `string` by `separator`.\r\n *\r\n * **Note:** This method is based on\r\n * [`String#split`](https://mdn.io/String/split).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to split.\r\n * @param {RegExp|string} separator The separator pattern to split by.\r\n * @param {number} [limit] The length to truncate results to.\r\n * @returns {Array} Returns the string segments.\r\n * @example\r\n *\r\n * _.split('a-b-c', '-', 2);\r\n * // => ['a', 'b']\r\n */\r\n function split(string, separator, limit) {\r\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\r\n separator = limit = undefined;\r\n }\r\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\r\n if (!limit) {\r\n return [];\r\n }\r\n string = toString(string);\r\n if (string && (\r\n typeof separator == 'string' ||\r\n (separator != null && !isRegExp(separator))\r\n )) {\r\n separator = baseToString(separator);\r\n if (!separator && hasUnicode(string)) {\r\n return castSlice(stringToArray(string), 0, limit);\r\n }\r\n }\r\n return string.split(separator, limit);\r\n }\r\n\r\n /**\r\n * Converts `string` to\r\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.1.0\r\n * @category String\r\n * @param {string} [string=''] The string to convert.\r\n * @returns {string} Returns the start cased string.\r\n * @example\r\n *\r\n * _.startCase('--foo-bar--');\r\n * // => 'Foo Bar'\r\n *\r\n * _.startCase('fooBar');\r\n * // => 'Foo Bar'\r\n *\r\n * _.startCase('__FOO_BAR__');\r\n * // => 'FOO BAR'\r\n */\r\n var startCase = createCompounder(function(result, word, index) {\r\n return result + (index ? ' ' : '') + upperFirst(word);\r\n });\r\n\r\n /**\r\n * Checks if `string` starts with the given target string.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to inspect.\r\n * @param {string} [target] The string to search for.\r\n * @param {number} [position=0] The position to search from.\r\n * @returns {boolean} Returns `true` if `string` starts with `target`,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.startsWith('abc', 'a');\r\n * // => true\r\n *\r\n * _.startsWith('abc', 'b');\r\n * // => false\r\n *\r\n * _.startsWith('abc', 'b', 1);\r\n * // => true\r\n */\r\n function startsWith(string, target, position) {\r\n string = toString(string);\r\n position = position == null\r\n ? 0\r\n : baseClamp(toInteger(position), 0, string.length);\r\n\r\n target = baseToString(target);\r\n return string.slice(position, position + target.length) == target;\r\n }\r\n\r\n /**\r\n * Creates a compiled template function that can interpolate data properties\r\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\r\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\r\n * properties may be accessed as free variables in the template. If a setting\r\n * object is given, it takes precedence over `_.templateSettings` values.\r\n *\r\n * **Note:** In the development build `_.template` utilizes\r\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\r\n * for easier debugging.\r\n *\r\n * For more information on precompiling templates see\r\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\r\n *\r\n * For more information on Chrome extension sandboxes see\r\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category String\r\n * @param {string} [string=''] The template string.\r\n * @param {Object} [options={}] The options object.\r\n * @param {RegExp} [options.escape=_.templateSettings.escape]\r\n * The HTML \"escape\" delimiter.\r\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\r\n * The \"evaluate\" delimiter.\r\n * @param {Object} [options.imports=_.templateSettings.imports]\r\n * An object to import into the template as free variables.\r\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\r\n * The \"interpolate\" delimiter.\r\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\r\n * The sourceURL of the compiled template.\r\n * @param {string} [options.variable='obj']\r\n * The data object variable name.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {Function} Returns the compiled template function.\r\n * @example\r\n *\r\n * // Use the \"interpolate\" delimiter to create a compiled template.\r\n * var compiled = _.template('hello <%= user %>!');\r\n * compiled({ 'user': 'fred' });\r\n * // => 'hello fred!'\r\n *\r\n * // Use the HTML \"escape\" delimiter to escape data property values.\r\n * var compiled = _.template('<%- value %>');\r\n * compiled({ 'value': '