Projekt

Obecné

Profil

Stáhnout (112 KB) Statistiky
| Větev: | Revize:
1
/**
2
 * @license
3
 * Lodash (Custom Build) <https://lodash.com/>
4
 * Build: `lodash core -o ./dist/lodash.core.js`
5
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
6
 * Released under MIT license <https://lodash.com/license>
7
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
8
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
9
 */
10
;(function() {
11

    
12
  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
13
  var undefined;
14

    
15
  /** Used as the semantic version number. */
16
  var VERSION = '4.17.15';
17

    
18
  /** Error message constants. */
19
  var FUNC_ERROR_TEXT = 'Expected a function';
20

    
21
  /** Used to compose bitmasks for value comparisons. */
22
  var COMPARE_PARTIAL_FLAG = 1,
23
      COMPARE_UNORDERED_FLAG = 2;
24

    
25
  /** Used to compose bitmasks for function metadata. */
26
  var WRAP_BIND_FLAG = 1,
27
      WRAP_PARTIAL_FLAG = 32;
28

    
29
  /** Used as references for various `Number` constants. */
30
  var INFINITY = 1 / 0,
31
      MAX_SAFE_INTEGER = 9007199254740991;
32

    
33
  /** `Object#toString` result references. */
34
  var argsTag = '[object Arguments]',
35
      arrayTag = '[object Array]',
36
      asyncTag = '[object AsyncFunction]',
37
      boolTag = '[object Boolean]',
38
      dateTag = '[object Date]',
39
      errorTag = '[object Error]',
40
      funcTag = '[object Function]',
41
      genTag = '[object GeneratorFunction]',
42
      numberTag = '[object Number]',
43
      objectTag = '[object Object]',
44
      proxyTag = '[object Proxy]',
45
      regexpTag = '[object RegExp]',
46
      stringTag = '[object String]';
47

    
48
  /** Used to match HTML entities and HTML characters. */
49
  var reUnescapedHtml = /[&<>"']/g,
50
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
51

    
52
  /** Used to detect unsigned integer values. */
53
  var reIsUint = /^(?:0|[1-9]\d*)$/;
54

    
55
  /** Used to map characters to HTML entities. */
56
  var htmlEscapes = {
57
    '&': '&amp;',
58
    '<': '&lt;',
59
    '>': '&gt;',
60
    '"': '&quot;',
61
    "'": '&#39;'
62
  };
63

    
64
  /** Detect free variable `global` from Node.js. */
65
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
66

    
67
  /** Detect free variable `self`. */
68
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
69

    
70
  /** Used as a reference to the global object. */
71
  var root = freeGlobal || freeSelf || Function('return this')();
72

    
73
  /** Detect free variable `exports`. */
74
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
75

    
76
  /** Detect free variable `module`. */
77
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
78

    
79
  /*--------------------------------------------------------------------------*/
80

    
81
  /**
82
   * Appends the elements of `values` to `array`.
83
   *
84
   * @private
85
   * @param {Array} array The array to modify.
86
   * @param {Array} values The values to append.
87
   * @returns {Array} Returns `array`.
88
   */
89
  function arrayPush(array, values) {
90
    array.push.apply(array, values);
91
    return array;
92
  }
93

    
94
  /**
95
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
96
   * support for iteratee shorthands.
97
   *
98
   * @private
99
   * @param {Array} array The array to inspect.
100
   * @param {Function} predicate The function invoked per iteration.
101
   * @param {number} fromIndex The index to search from.
102
   * @param {boolean} [fromRight] Specify iterating from right to left.
103
   * @returns {number} Returns the index of the matched value, else `-1`.
104
   */
105
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
106
    var length = array.length,
107
        index = fromIndex + (fromRight ? 1 : -1);
108

    
109
    while ((fromRight ? index-- : ++index < length)) {
110
      if (predicate(array[index], index, array)) {
111
        return index;
112
      }
113
    }
114
    return -1;
115
  }
116

    
117
  /**
118
   * The base implementation of `_.property` without support for deep paths.
119
   *
120
   * @private
121
   * @param {string} key The key of the property to get.
122
   * @returns {Function} Returns the new accessor function.
123
   */
124
  function baseProperty(key) {
125
    return function(object) {
126
      return object == null ? undefined : object[key];
127
    };
128
  }
129

    
130
  /**
131
   * The base implementation of `_.propertyOf` without support for deep paths.
132
   *
133
   * @private
134
   * @param {Object} object The object to query.
135
   * @returns {Function} Returns the new accessor function.
136
   */
137
  function basePropertyOf(object) {
138
    return function(key) {
139
      return object == null ? undefined : object[key];
140
    };
141
  }
142

    
143
  /**
144
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
145
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
146
   *
147
   * @private
148
   * @param {Array|Object} collection The collection to iterate over.
149
   * @param {Function} iteratee The function invoked per iteration.
150
   * @param {*} accumulator The initial value.
151
   * @param {boolean} initAccum Specify using the first or last element of
152
   *  `collection` as the initial value.
153
   * @param {Function} eachFunc The function to iterate over `collection`.
154
   * @returns {*} Returns the accumulated value.
155
   */
156
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
157
    eachFunc(collection, function(value, index, collection) {
158
      accumulator = initAccum
159
        ? (initAccum = false, value)
160
        : iteratee(accumulator, value, index, collection);
161
    });
162
    return accumulator;
163
  }
164

    
165
  /**
166
   * The base implementation of `_.values` and `_.valuesIn` which creates an
167
   * array of `object` property values corresponding to the property names
168
   * of `props`.
169
   *
170
   * @private
171
   * @param {Object} object The object to query.
172
   * @param {Array} props The property names to get values for.
173
   * @returns {Object} Returns the array of property values.
174
   */
175
  function baseValues(object, props) {
176
    return baseMap(props, function(key) {
177
      return object[key];
178
    });
179
  }
180

    
181
  /**
182
   * Used by `_.escape` to convert characters to HTML entities.
183
   *
184
   * @private
185
   * @param {string} chr The matched character to escape.
186
   * @returns {string} Returns the escaped character.
187
   */
188
  var escapeHtmlChar = basePropertyOf(htmlEscapes);
189

    
190
  /**
191
   * Creates a unary function that invokes `func` with its argument transformed.
192
   *
193
   * @private
194
   * @param {Function} func The function to wrap.
195
   * @param {Function} transform The argument transform.
196
   * @returns {Function} Returns the new function.
197
   */
198
  function overArg(func, transform) {
199
    return function(arg) {
200
      return func(transform(arg));
201
    };
202
  }
203

    
204
  /*--------------------------------------------------------------------------*/
205

    
206
  /** Used for built-in method references. */
207
  var arrayProto = Array.prototype,
208
      objectProto = Object.prototype;
209

    
210
  /** Used to check objects for own properties. */
211
  var hasOwnProperty = objectProto.hasOwnProperty;
212

    
213
  /** Used to generate unique IDs. */
214
  var idCounter = 0;
215

    
216
  /**
217
   * Used to resolve the
218
   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
219
   * of values.
220
   */
221
  var nativeObjectToString = objectProto.toString;
222

    
223
  /** Used to restore the original `_` reference in `_.noConflict`. */
224
  var oldDash = root._;
225

    
226
  /** Built-in value references. */
227
  var objectCreate = Object.create,
228
      propertyIsEnumerable = objectProto.propertyIsEnumerable;
229

    
230
  /* Built-in method references for those with the same name as other `lodash` methods. */
231
  var nativeIsFinite = root.isFinite,
232
      nativeKeys = overArg(Object.keys, Object),
233
      nativeMax = Math.max;
234

    
235
  /*------------------------------------------------------------------------*/
236

    
237
  /**
238
   * Creates a `lodash` object which wraps `value` to enable implicit method
239
   * chain sequences. Methods that operate on and return arrays, collections,
240
   * and functions can be chained together. Methods that retrieve a single value
241
   * or may return a primitive value will automatically end the chain sequence
242
   * and return the unwrapped value. Otherwise, the value must be unwrapped
243
   * with `_#value`.
244
   *
245
   * Explicit chain sequences, which must be unwrapped with `_#value`, may be
246
   * enabled using `_.chain`.
247
   *
248
   * The execution of chained methods is lazy, that is, it's deferred until
249
   * `_#value` is implicitly or explicitly called.
250
   *
251
   * Lazy evaluation allows several methods to support shortcut fusion.
252
   * Shortcut fusion is an optimization to merge iteratee calls; this avoids
253
   * the creation of intermediate arrays and can greatly reduce the number of
254
   * iteratee executions. Sections of a chain sequence qualify for shortcut
255
   * fusion if the section is applied to an array and iteratees accept only
256
   * one argument. The heuristic for whether a section qualifies for shortcut
257
   * fusion is subject to change.
258
   *
259
   * Chaining is supported in custom builds as long as the `_#value` method is
260
   * directly or indirectly included in the build.
261
   *
262
   * In addition to lodash methods, wrappers have `Array` and `String` methods.
263
   *
264
   * The wrapper `Array` methods are:
265
   * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
266
   *
267
   * The wrapper `String` methods are:
268
   * `replace` and `split`
269
   *
270
   * The wrapper methods that support shortcut fusion are:
271
   * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
272
   * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
273
   * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
274
   *
275
   * The chainable wrapper methods are:
276
   * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
277
   * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
278
   * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
279
   * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
280
   * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
281
   * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
282
   * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
283
   * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
284
   * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
285
   * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
286
   * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
287
   * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
288
   * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
289
   * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
290
   * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
291
   * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
292
   * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
293
   * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
294
   * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
295
   * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
296
   * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
297
   * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
298
   * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
299
   * `zipObject`, `zipObjectDeep`, and `zipWith`
300
   *
301
   * The wrapper methods that are **not** chainable by default are:
302
   * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
303
   * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
304
   * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
305
   * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
306
   * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
307
   * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
308
   * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
309
   * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
310
   * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
311
   * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
312
   * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
313
   * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
314
   * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
315
   * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
316
   * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
317
   * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
318
   * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
319
   * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
320
   * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
321
   * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
322
   * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
323
   * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
324
   * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
325
   * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
326
   * `upperFirst`, `value`, and `words`
327
   *
328
   * @name _
329
   * @constructor
330
   * @category Seq
331
   * @param {*} value The value to wrap in a `lodash` instance.
332
   * @returns {Object} Returns the new `lodash` wrapper instance.
333
   * @example
334
   *
335
   * function square(n) {
336
   *   return n * n;
337
   * }
338
   *
339
   * var wrapped = _([1, 2, 3]);
340
   *
341
   * // Returns an unwrapped value.
342
   * wrapped.reduce(_.add);
343
   * // => 6
344
   *
345
   * // Returns a wrapped value.
346
   * var squares = wrapped.map(square);
347
   *
348
   * _.isArray(squares);
349
   * // => false
350
   *
351
   * _.isArray(squares.value());
352
   * // => true
353
   */
354
  function lodash(value) {
355
    return value instanceof LodashWrapper
356
      ? value
357
      : new LodashWrapper(value);
358
  }
359

    
360
  /**
361
   * The base implementation of `_.create` without support for assigning
362
   * properties to the created object.
363
   *
364
   * @private
365
   * @param {Object} proto The object to inherit from.
366
   * @returns {Object} Returns the new object.
367
   */
368
  var baseCreate = (function() {
369
    function object() {}
370
    return function(proto) {
371
      if (!isObject(proto)) {
372
        return {};
373
      }
374
      if (objectCreate) {
375
        return objectCreate(proto);
376
      }
377
      object.prototype = proto;
378
      var result = new object;
379
      object.prototype = undefined;
380
      return result;
381
    };
382
  }());
383

    
384
  /**
385
   * The base constructor for creating `lodash` wrapper objects.
386
   *
387
   * @private
388
   * @param {*} value The value to wrap.
389
   * @param {boolean} [chainAll] Enable explicit method chain sequences.
390
   */
391
  function LodashWrapper(value, chainAll) {
392
    this.__wrapped__ = value;
393
    this.__actions__ = [];
394
    this.__chain__ = !!chainAll;
395
  }
396

    
397
  LodashWrapper.prototype = baseCreate(lodash.prototype);
398
  LodashWrapper.prototype.constructor = LodashWrapper;
399

    
400
  /*------------------------------------------------------------------------*/
401

    
402
  /**
403
   * Assigns `value` to `key` of `object` if the existing value is not equivalent
404
   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
405
   * for equality comparisons.
406
   *
407
   * @private
408
   * @param {Object} object The object to modify.
409
   * @param {string} key The key of the property to assign.
410
   * @param {*} value The value to assign.
411
   */
412
  function assignValue(object, key, value) {
413
    var objValue = object[key];
414
    if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
415
        (value === undefined && !(key in object))) {
416
      baseAssignValue(object, key, value);
417
    }
418
  }
419

    
420
  /**
421
   * The base implementation of `assignValue` and `assignMergeValue` without
422
   * value checks.
423
   *
424
   * @private
425
   * @param {Object} object The object to modify.
426
   * @param {string} key The key of the property to assign.
427
   * @param {*} value The value to assign.
428
   */
429
  function baseAssignValue(object, key, value) {
430
    object[key] = value;
431
  }
432

    
433
  /**
434
   * The base implementation of `_.delay` and `_.defer` which accepts `args`
435
   * to provide to `func`.
436
   *
437
   * @private
438
   * @param {Function} func The function to delay.
439
   * @param {number} wait The number of milliseconds to delay invocation.
440
   * @param {Array} args The arguments to provide to `func`.
441
   * @returns {number|Object} Returns the timer id or timeout object.
442
   */
443
  function baseDelay(func, wait, args) {
444
    if (typeof func != 'function') {
445
      throw new TypeError(FUNC_ERROR_TEXT);
446
    }
447
    return setTimeout(function() { func.apply(undefined, args); }, wait);
448
  }
449

    
450
  /**
451
   * The base implementation of `_.forEach` without support for iteratee shorthands.
452
   *
453
   * @private
454
   * @param {Array|Object} collection The collection to iterate over.
455
   * @param {Function} iteratee The function invoked per iteration.
456
   * @returns {Array|Object} Returns `collection`.
457
   */
458
  var baseEach = createBaseEach(baseForOwn);
459

    
460
  /**
461
   * The base implementation of `_.every` without support for iteratee shorthands.
462
   *
463
   * @private
464
   * @param {Array|Object} collection The collection to iterate over.
465
   * @param {Function} predicate The function invoked per iteration.
466
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
467
   *  else `false`
468
   */
469
  function baseEvery(collection, predicate) {
470
    var result = true;
471
    baseEach(collection, function(value, index, collection) {
472
      result = !!predicate(value, index, collection);
473
      return result;
474
    });
475
    return result;
476
  }
477

    
478
  /**
479
   * The base implementation of methods like `_.max` and `_.min` which accepts a
480
   * `comparator` to determine the extremum value.
481
   *
482
   * @private
483
   * @param {Array} array The array to iterate over.
484
   * @param {Function} iteratee The iteratee invoked per iteration.
485
   * @param {Function} comparator The comparator used to compare values.
486
   * @returns {*} Returns the extremum value.
487
   */
488
  function baseExtremum(array, iteratee, comparator) {
489
    var index = -1,
490
        length = array.length;
491

    
492
    while (++index < length) {
493
      var value = array[index],
494
          current = iteratee(value);
495

    
496
      if (current != null && (computed === undefined
497
            ? (current === current && !false)
498
            : comparator(current, computed)
499
          )) {
500
        var computed = current,
501
            result = value;
502
      }
503
    }
504
    return result;
505
  }
506

    
507
  /**
508
   * The base implementation of `_.filter` without support for iteratee shorthands.
509
   *
510
   * @private
511
   * @param {Array|Object} collection The collection to iterate over.
512
   * @param {Function} predicate The function invoked per iteration.
513
   * @returns {Array} Returns the new filtered array.
514
   */
515
  function baseFilter(collection, predicate) {
516
    var result = [];
517
    baseEach(collection, function(value, index, collection) {
518
      if (predicate(value, index, collection)) {
519
        result.push(value);
520
      }
521
    });
522
    return result;
523
  }
524

    
525
  /**
526
   * The base implementation of `_.flatten` with support for restricting flattening.
527
   *
528
   * @private
529
   * @param {Array} array The array to flatten.
530
   * @param {number} depth The maximum recursion depth.
531
   * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
532
   * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
533
   * @param {Array} [result=[]] The initial result value.
534
   * @returns {Array} Returns the new flattened array.
535
   */
536
  function baseFlatten(array, depth, predicate, isStrict, result) {
537
    var index = -1,
538
        length = array.length;
539

    
540
    predicate || (predicate = isFlattenable);
541
    result || (result = []);
542

    
543
    while (++index < length) {
544
      var value = array[index];
545
      if (depth > 0 && predicate(value)) {
546
        if (depth > 1) {
547
          // Recursively flatten arrays (susceptible to call stack limits).
548
          baseFlatten(value, depth - 1, predicate, isStrict, result);
549
        } else {
550
          arrayPush(result, value);
551
        }
552
      } else if (!isStrict) {
553
        result[result.length] = value;
554
      }
555
    }
556
    return result;
557
  }
558

    
559
  /**
560
   * The base implementation of `baseForOwn` which iterates over `object`
561
   * properties returned by `keysFunc` and invokes `iteratee` for each property.
562
   * Iteratee functions may exit iteration early by explicitly returning `false`.
563
   *
564
   * @private
565
   * @param {Object} object The object to iterate over.
566
   * @param {Function} iteratee The function invoked per iteration.
567
   * @param {Function} keysFunc The function to get the keys of `object`.
568
   * @returns {Object} Returns `object`.
569
   */
570
  var baseFor = createBaseFor();
571

    
572
  /**
573
   * The base implementation of `_.forOwn` without support for iteratee shorthands.
574
   *
575
   * @private
576
   * @param {Object} object The object to iterate over.
577
   * @param {Function} iteratee The function invoked per iteration.
578
   * @returns {Object} Returns `object`.
579
   */
580
  function baseForOwn(object, iteratee) {
581
    return object && baseFor(object, iteratee, keys);
582
  }
583

    
584
  /**
585
   * The base implementation of `_.functions` which creates an array of
586
   * `object` function property names filtered from `props`.
587
   *
588
   * @private
589
   * @param {Object} object The object to inspect.
590
   * @param {Array} props The property names to filter.
591
   * @returns {Array} Returns the function names.
592
   */
593
  function baseFunctions(object, props) {
594
    return baseFilter(props, function(key) {
595
      return isFunction(object[key]);
596
    });
597
  }
598

    
599
  /**
600
   * The base implementation of `getTag` without fallbacks for buggy environments.
601
   *
602
   * @private
603
   * @param {*} value The value to query.
604
   * @returns {string} Returns the `toStringTag`.
605
   */
606
  function baseGetTag(value) {
607
    return objectToString(value);
608
  }
609

    
610
  /**
611
   * The base implementation of `_.gt` which doesn't coerce arguments.
612
   *
613
   * @private
614
   * @param {*} value The value to compare.
615
   * @param {*} other The other value to compare.
616
   * @returns {boolean} Returns `true` if `value` is greater than `other`,
617
   *  else `false`.
618
   */
619
  function baseGt(value, other) {
620
    return value > other;
621
  }
622

    
623
  /**
624
   * The base implementation of `_.isArguments`.
625
   *
626
   * @private
627
   * @param {*} value The value to check.
628
   * @returns {boolean} Returns `true` if `value` is an `arguments` object,
629
   */
630
  var baseIsArguments = noop;
631

    
632
  /**
633
   * The base implementation of `_.isDate` without Node.js optimizations.
634
   *
635
   * @private
636
   * @param {*} value The value to check.
637
   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
638
   */
639
  function baseIsDate(value) {
640
    return isObjectLike(value) && baseGetTag(value) == dateTag;
641
  }
642

    
643
  /**
644
   * The base implementation of `_.isEqual` which supports partial comparisons
645
   * and tracks traversed objects.
646
   *
647
   * @private
648
   * @param {*} value The value to compare.
649
   * @param {*} other The other value to compare.
650
   * @param {boolean} bitmask The bitmask flags.
651
   *  1 - Unordered comparison
652
   *  2 - Partial comparison
653
   * @param {Function} [customizer] The function to customize comparisons.
654
   * @param {Object} [stack] Tracks traversed `value` and `other` objects.
655
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
656
   */
657
  function baseIsEqual(value, other, bitmask, customizer, stack) {
658
    if (value === other) {
659
      return true;
660
    }
661
    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
662
      return value !== value && other !== other;
663
    }
664
    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
665
  }
666

    
667
  /**
668
   * A specialized version of `baseIsEqual` for arrays and objects which performs
669
   * deep comparisons and tracks traversed objects enabling objects with circular
670
   * references to be compared.
671
   *
672
   * @private
673
   * @param {Object} object The object to compare.
674
   * @param {Object} other The other object to compare.
675
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
676
   * @param {Function} customizer The function to customize comparisons.
677
   * @param {Function} equalFunc The function to determine equivalents of values.
678
   * @param {Object} [stack] Tracks traversed `object` and `other` objects.
679
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
680
   */
681
  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
682
    var objIsArr = isArray(object),
683
        othIsArr = isArray(other),
684
        objTag = objIsArr ? arrayTag : baseGetTag(object),
685
        othTag = othIsArr ? arrayTag : baseGetTag(other);
686

    
687
    objTag = objTag == argsTag ? objectTag : objTag;
688
    othTag = othTag == argsTag ? objectTag : othTag;
689

    
690
    var objIsObj = objTag == objectTag,
691
        othIsObj = othTag == objectTag,
692
        isSameTag = objTag == othTag;
693

    
694
    stack || (stack = []);
695
    var objStack = find(stack, function(entry) {
696
      return entry[0] == object;
697
    });
698
    var othStack = find(stack, function(entry) {
699
      return entry[0] == other;
700
    });
701
    if (objStack && othStack) {
702
      return objStack[1] == other;
703
    }
704
    stack.push([object, other]);
705
    stack.push([other, object]);
706
    if (isSameTag && !objIsObj) {
707
      var result = (objIsArr)
708
        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
709
        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
710
      stack.pop();
711
      return result;
712
    }
713
    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
714
      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
715
          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
716

    
717
      if (objIsWrapped || othIsWrapped) {
718
        var objUnwrapped = objIsWrapped ? object.value() : object,
719
            othUnwrapped = othIsWrapped ? other.value() : other;
720

    
721
        var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
722
        stack.pop();
723
        return result;
724
      }
725
    }
726
    if (!isSameTag) {
727
      return false;
728
    }
729
    var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
730
    stack.pop();
731
    return result;
732
  }
733

    
734
  /**
735
   * The base implementation of `_.isRegExp` without Node.js optimizations.
736
   *
737
   * @private
738
   * @param {*} value The value to check.
739
   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
740
   */
741
  function baseIsRegExp(value) {
742
    return isObjectLike(value) && baseGetTag(value) == regexpTag;
743
  }
744

    
745
  /**
746
   * The base implementation of `_.iteratee`.
747
   *
748
   * @private
749
   * @param {*} [value=_.identity] The value to convert to an iteratee.
750
   * @returns {Function} Returns the iteratee.
751
   */
752
  function baseIteratee(func) {
753
    if (typeof func == 'function') {
754
      return func;
755
    }
756
    if (func == null) {
757
      return identity;
758
    }
759
    return (typeof func == 'object' ? baseMatches : baseProperty)(func);
760
  }
761

    
762
  /**
763
   * The base implementation of `_.lt` which doesn't coerce arguments.
764
   *
765
   * @private
766
   * @param {*} value The value to compare.
767
   * @param {*} other The other value to compare.
768
   * @returns {boolean} Returns `true` if `value` is less than `other`,
769
   *  else `false`.
770
   */
771
  function baseLt(value, other) {
772
    return value < other;
773
  }
774

    
775
  /**
776
   * The base implementation of `_.map` without support for iteratee shorthands.
777
   *
778
   * @private
779
   * @param {Array|Object} collection The collection to iterate over.
780
   * @param {Function} iteratee The function invoked per iteration.
781
   * @returns {Array} Returns the new mapped array.
782
   */
783
  function baseMap(collection, iteratee) {
784
    var index = -1,
785
        result = isArrayLike(collection) ? Array(collection.length) : [];
786

    
787
    baseEach(collection, function(value, key, collection) {
788
      result[++index] = iteratee(value, key, collection);
789
    });
790
    return result;
791
  }
792

    
793
  /**
794
   * The base implementation of `_.matches` which doesn't clone `source`.
795
   *
796
   * @private
797
   * @param {Object} source The object of property values to match.
798
   * @returns {Function} Returns the new spec function.
799
   */
800
  function baseMatches(source) {
801
    var props = nativeKeys(source);
802
    return function(object) {
803
      var length = props.length;
804
      if (object == null) {
805
        return !length;
806
      }
807
      object = Object(object);
808
      while (length--) {
809
        var key = props[length];
810
        if (!(key in object &&
811
              baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
812
            )) {
813
          return false;
814
        }
815
      }
816
      return true;
817
    };
818
  }
819

    
820
  /**
821
   * The base implementation of `_.pick` without support for individual
822
   * property identifiers.
823
   *
824
   * @private
825
   * @param {Object} object The source object.
826
   * @param {string[]} paths The property paths to pick.
827
   * @returns {Object} Returns the new object.
828
   */
829
  function basePick(object, props) {
830
    object = Object(object);
831
    return reduce(props, function(result, key) {
832
      if (key in object) {
833
        result[key] = object[key];
834
      }
835
      return result;
836
    }, {});
837
  }
838

    
839
  /**
840
   * The base implementation of `_.rest` which doesn't validate or coerce arguments.
841
   *
842
   * @private
843
   * @param {Function} func The function to apply a rest parameter to.
844
   * @param {number} [start=func.length-1] The start position of the rest parameter.
845
   * @returns {Function} Returns the new function.
846
   */
847
  function baseRest(func, start) {
848
    return setToString(overRest(func, start, identity), func + '');
849
  }
850

    
851
  /**
852
   * The base implementation of `_.slice` without an iteratee call guard.
853
   *
854
   * @private
855
   * @param {Array} array The array to slice.
856
   * @param {number} [start=0] The start position.
857
   * @param {number} [end=array.length] The end position.
858
   * @returns {Array} Returns the slice of `array`.
859
   */
860
  function baseSlice(array, start, end) {
861
    var index = -1,
862
        length = array.length;
863

    
864
    if (start < 0) {
865
      start = -start > length ? 0 : (length + start);
866
    }
867
    end = end > length ? length : end;
868
    if (end < 0) {
869
      end += length;
870
    }
871
    length = start > end ? 0 : ((end - start) >>> 0);
872
    start >>>= 0;
873

    
874
    var result = Array(length);
875
    while (++index < length) {
876
      result[index] = array[index + start];
877
    }
878
    return result;
879
  }
880

    
881
  /**
882
   * Copies the values of `source` to `array`.
883
   *
884
   * @private
885
   * @param {Array} source The array to copy values from.
886
   * @param {Array} [array=[]] The array to copy values to.
887
   * @returns {Array} Returns `array`.
888
   */
889
  function copyArray(source) {
890
    return baseSlice(source, 0, source.length);
891
  }
892

    
893
  /**
894
   * The base implementation of `_.some` without support for iteratee shorthands.
895
   *
896
   * @private
897
   * @param {Array|Object} collection The collection to iterate over.
898
   * @param {Function} predicate The function invoked per iteration.
899
   * @returns {boolean} Returns `true` if any element passes the predicate check,
900
   *  else `false`.
901
   */
902
  function baseSome(collection, predicate) {
903
    var result;
904

    
905
    baseEach(collection, function(value, index, collection) {
906
      result = predicate(value, index, collection);
907
      return !result;
908
    });
909
    return !!result;
910
  }
911

    
912
  /**
913
   * The base implementation of `wrapperValue` which returns the result of
914
   * performing a sequence of actions on the unwrapped `value`, where each
915
   * successive action is supplied the return value of the previous.
916
   *
917
   * @private
918
   * @param {*} value The unwrapped value.
919
   * @param {Array} actions Actions to perform to resolve the unwrapped value.
920
   * @returns {*} Returns the resolved value.
921
   */
922
  function baseWrapperValue(value, actions) {
923
    var result = value;
924
    return reduce(actions, function(result, action) {
925
      return action.func.apply(action.thisArg, arrayPush([result], action.args));
926
    }, result);
927
  }
928

    
929
  /**
930
   * Compares values to sort them in ascending order.
931
   *
932
   * @private
933
   * @param {*} value The value to compare.
934
   * @param {*} other The other value to compare.
935
   * @returns {number} Returns the sort order indicator for `value`.
936
   */
937
  function compareAscending(value, other) {
938
    if (value !== other) {
939
      var valIsDefined = value !== undefined,
940
          valIsNull = value === null,
941
          valIsReflexive = value === value,
942
          valIsSymbol = false;
943

    
944
      var othIsDefined = other !== undefined,
945
          othIsNull = other === null,
946
          othIsReflexive = other === other,
947
          othIsSymbol = false;
948

    
949
      if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
950
          (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
951
          (valIsNull && othIsDefined && othIsReflexive) ||
952
          (!valIsDefined && othIsReflexive) ||
953
          !valIsReflexive) {
954
        return 1;
955
      }
956
      if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
957
          (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
958
          (othIsNull && valIsDefined && valIsReflexive) ||
959
          (!othIsDefined && valIsReflexive) ||
960
          !othIsReflexive) {
961
        return -1;
962
      }
963
    }
964
    return 0;
965
  }
966

    
967
  /**
968
   * Copies properties of `source` to `object`.
969
   *
970
   * @private
971
   * @param {Object} source The object to copy properties from.
972
   * @param {Array} props The property identifiers to copy.
973
   * @param {Object} [object={}] The object to copy properties to.
974
   * @param {Function} [customizer] The function to customize copied values.
975
   * @returns {Object} Returns `object`.
976
   */
977
  function copyObject(source, props, object, customizer) {
978
    var isNew = !object;
979
    object || (object = {});
980

    
981
    var index = -1,
982
        length = props.length;
983

    
984
    while (++index < length) {
985
      var key = props[index];
986

    
987
      var newValue = customizer
988
        ? customizer(object[key], source[key], key, object, source)
989
        : undefined;
990

    
991
      if (newValue === undefined) {
992
        newValue = source[key];
993
      }
994
      if (isNew) {
995
        baseAssignValue(object, key, newValue);
996
      } else {
997
        assignValue(object, key, newValue);
998
      }
999
    }
1000
    return object;
1001
  }
1002

    
1003
  /**
1004
   * Creates a function like `_.assign`.
1005
   *
1006
   * @private
1007
   * @param {Function} assigner The function to assign values.
1008
   * @returns {Function} Returns the new assigner function.
1009
   */
1010
  function createAssigner(assigner) {
1011
    return baseRest(function(object, sources) {
1012
      var index = -1,
1013
          length = sources.length,
1014
          customizer = length > 1 ? sources[length - 1] : undefined;
1015

    
1016
      customizer = (assigner.length > 3 && typeof customizer == 'function')
1017
        ? (length--, customizer)
1018
        : undefined;
1019

    
1020
      object = Object(object);
1021
      while (++index < length) {
1022
        var source = sources[index];
1023
        if (source) {
1024
          assigner(object, source, index, customizer);
1025
        }
1026
      }
1027
      return object;
1028
    });
1029
  }
1030

    
1031
  /**
1032
   * Creates a `baseEach` or `baseEachRight` function.
1033
   *
1034
   * @private
1035
   * @param {Function} eachFunc The function to iterate over a collection.
1036
   * @param {boolean} [fromRight] Specify iterating from right to left.
1037
   * @returns {Function} Returns the new base function.
1038
   */
1039
  function createBaseEach(eachFunc, fromRight) {
1040
    return function(collection, iteratee) {
1041
      if (collection == null) {
1042
        return collection;
1043
      }
1044
      if (!isArrayLike(collection)) {
1045
        return eachFunc(collection, iteratee);
1046
      }
1047
      var length = collection.length,
1048
          index = fromRight ? length : -1,
1049
          iterable = Object(collection);
1050

    
1051
      while ((fromRight ? index-- : ++index < length)) {
1052
        if (iteratee(iterable[index], index, iterable) === false) {
1053
          break;
1054
        }
1055
      }
1056
      return collection;
1057
    };
1058
  }
1059

    
1060
  /**
1061
   * Creates a base function for methods like `_.forIn` and `_.forOwn`.
1062
   *
1063
   * @private
1064
   * @param {boolean} [fromRight] Specify iterating from right to left.
1065
   * @returns {Function} Returns the new base function.
1066
   */
1067
  function createBaseFor(fromRight) {
1068
    return function(object, iteratee, keysFunc) {
1069
      var index = -1,
1070
          iterable = Object(object),
1071
          props = keysFunc(object),
1072
          length = props.length;
1073

    
1074
      while (length--) {
1075
        var key = props[fromRight ? length : ++index];
1076
        if (iteratee(iterable[key], key, iterable) === false) {
1077
          break;
1078
        }
1079
      }
1080
      return object;
1081
    };
1082
  }
1083

    
1084
  /**
1085
   * Creates a function that produces an instance of `Ctor` regardless of
1086
   * whether it was invoked as part of a `new` expression or by `call` or `apply`.
1087
   *
1088
   * @private
1089
   * @param {Function} Ctor The constructor to wrap.
1090
   * @returns {Function} Returns the new wrapped function.
1091
   */
1092
  function createCtor(Ctor) {
1093
    return function() {
1094
      // Use a `switch` statement to work with class constructors. See
1095
      // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
1096
      // for more details.
1097
      var args = arguments;
1098
      var thisBinding = baseCreate(Ctor.prototype),
1099
          result = Ctor.apply(thisBinding, args);
1100

    
1101
      // Mimic the constructor's `return` behavior.
1102
      // See https://es5.github.io/#x13.2.2 for more details.
1103
      return isObject(result) ? result : thisBinding;
1104
    };
1105
  }
1106

    
1107
  /**
1108
   * Creates a `_.find` or `_.findLast` function.
1109
   *
1110
   * @private
1111
   * @param {Function} findIndexFunc The function to find the collection index.
1112
   * @returns {Function} Returns the new find function.
1113
   */
1114
  function createFind(findIndexFunc) {
1115
    return function(collection, predicate, fromIndex) {
1116
      var iterable = Object(collection);
1117
      if (!isArrayLike(collection)) {
1118
        var iteratee = baseIteratee(predicate, 3);
1119
        collection = keys(collection);
1120
        predicate = function(key) { return iteratee(iterable[key], key, iterable); };
1121
      }
1122
      var index = findIndexFunc(collection, predicate, fromIndex);
1123
      return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
1124
    };
1125
  }
1126

    
1127
  /**
1128
   * Creates a function that wraps `func` to invoke it with the `this` binding
1129
   * of `thisArg` and `partials` prepended to the arguments it receives.
1130
   *
1131
   * @private
1132
   * @param {Function} func The function to wrap.
1133
   * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
1134
   * @param {*} thisArg The `this` binding of `func`.
1135
   * @param {Array} partials The arguments to prepend to those provided to
1136
   *  the new function.
1137
   * @returns {Function} Returns the new wrapped function.
1138
   */
1139
  function createPartial(func, bitmask, thisArg, partials) {
1140
    if (typeof func != 'function') {
1141
      throw new TypeError(FUNC_ERROR_TEXT);
1142
    }
1143
    var isBind = bitmask & WRAP_BIND_FLAG,
1144
        Ctor = createCtor(func);
1145

    
1146
    function wrapper() {
1147
      var argsIndex = -1,
1148
          argsLength = arguments.length,
1149
          leftIndex = -1,
1150
          leftLength = partials.length,
1151
          args = Array(leftLength + argsLength),
1152
          fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
1153

    
1154
      while (++leftIndex < leftLength) {
1155
        args[leftIndex] = partials[leftIndex];
1156
      }
1157
      while (argsLength--) {
1158
        args[leftIndex++] = arguments[++argsIndex];
1159
      }
1160
      return fn.apply(isBind ? thisArg : this, args);
1161
    }
1162
    return wrapper;
1163
  }
1164

    
1165
  /**
1166
   * A specialized version of `baseIsEqualDeep` for arrays with support for
1167
   * partial deep comparisons.
1168
   *
1169
   * @private
1170
   * @param {Array} array The array to compare.
1171
   * @param {Array} other The other array to compare.
1172
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1173
   * @param {Function} customizer The function to customize comparisons.
1174
   * @param {Function} equalFunc The function to determine equivalents of values.
1175
   * @param {Object} stack Tracks traversed `array` and `other` objects.
1176
   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
1177
   */
1178
  function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
1179
    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1180
        arrLength = array.length,
1181
        othLength = other.length;
1182

    
1183
    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
1184
      return false;
1185
    }
1186
    var index = -1,
1187
        result = true,
1188
        seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
1189

    
1190
    // Ignore non-index properties.
1191
    while (++index < arrLength) {
1192
      var arrValue = array[index],
1193
          othValue = other[index];
1194

    
1195
      var compared;
1196
      if (compared !== undefined) {
1197
        if (compared) {
1198
          continue;
1199
        }
1200
        result = false;
1201
        break;
1202
      }
1203
      // Recursively compare arrays (susceptible to call stack limits).
1204
      if (seen) {
1205
        if (!baseSome(other, function(othValue, othIndex) {
1206
              if (!indexOf(seen, othIndex) &&
1207
                  (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
1208
                return seen.push(othIndex);
1209
              }
1210
            })) {
1211
          result = false;
1212
          break;
1213
        }
1214
      } else if (!(
1215
            arrValue === othValue ||
1216
              equalFunc(arrValue, othValue, bitmask, customizer, stack)
1217
          )) {
1218
        result = false;
1219
        break;
1220
      }
1221
    }
1222
    return result;
1223
  }
1224

    
1225
  /**
1226
   * A specialized version of `baseIsEqualDeep` for comparing objects of
1227
   * the same `toStringTag`.
1228
   *
1229
   * **Note:** This function only supports comparing values with tags of
1230
   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
1231
   *
1232
   * @private
1233
   * @param {Object} object The object to compare.
1234
   * @param {Object} other The other object to compare.
1235
   * @param {string} tag The `toStringTag` of the objects to compare.
1236
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1237
   * @param {Function} customizer The function to customize comparisons.
1238
   * @param {Function} equalFunc The function to determine equivalents of values.
1239
   * @param {Object} stack Tracks traversed `object` and `other` objects.
1240
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1241
   */
1242
  function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1243
    switch (tag) {
1244

    
1245
      case boolTag:
1246
      case dateTag:
1247
      case numberTag:
1248
        // Coerce booleans to `1` or `0` and dates to milliseconds.
1249
        // Invalid dates are coerced to `NaN`.
1250
        return eq(+object, +other);
1251

    
1252
      case errorTag:
1253
        return object.name == other.name && object.message == other.message;
1254

    
1255
      case regexpTag:
1256
      case stringTag:
1257
        // Coerce regexes to strings and treat strings, primitives and objects,
1258
        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
1259
        // for more details.
1260
        return object == (other + '');
1261

    
1262
    }
1263
    return false;
1264
  }
1265

    
1266
  /**
1267
   * A specialized version of `baseIsEqualDeep` for objects with support for
1268
   * partial deep comparisons.
1269
   *
1270
   * @private
1271
   * @param {Object} object The object to compare.
1272
   * @param {Object} other The other object to compare.
1273
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1274
   * @param {Function} customizer The function to customize comparisons.
1275
   * @param {Function} equalFunc The function to determine equivalents of values.
1276
   * @param {Object} stack Tracks traversed `object` and `other` objects.
1277
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1278
   */
1279
  function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
1280
    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1281
        objProps = keys(object),
1282
        objLength = objProps.length,
1283
        othProps = keys(other),
1284
        othLength = othProps.length;
1285

    
1286
    if (objLength != othLength && !isPartial) {
1287
      return false;
1288
    }
1289
    var index = objLength;
1290
    while (index--) {
1291
      var key = objProps[index];
1292
      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
1293
        return false;
1294
      }
1295
    }
1296
    var result = true;
1297

    
1298
    var skipCtor = isPartial;
1299
    while (++index < objLength) {
1300
      key = objProps[index];
1301
      var objValue = object[key],
1302
          othValue = other[key];
1303

    
1304
      var compared;
1305
      // Recursively compare objects (susceptible to call stack limits).
1306
      if (!(compared === undefined
1307
            ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
1308
            : compared
1309
          )) {
1310
        result = false;
1311
        break;
1312
      }
1313
      skipCtor || (skipCtor = key == 'constructor');
1314
    }
1315
    if (result && !skipCtor) {
1316
      var objCtor = object.constructor,
1317
          othCtor = other.constructor;
1318

    
1319
      // Non `Object` object instances with different constructors are not equal.
1320
      if (objCtor != othCtor &&
1321
          ('constructor' in object && 'constructor' in other) &&
1322
          !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
1323
            typeof othCtor == 'function' && othCtor instanceof othCtor)) {
1324
        result = false;
1325
      }
1326
    }
1327
    return result;
1328
  }
1329

    
1330
  /**
1331
   * A specialized version of `baseRest` which flattens the rest array.
1332
   *
1333
   * @private
1334
   * @param {Function} func The function to apply a rest parameter to.
1335
   * @returns {Function} Returns the new function.
1336
   */
1337
  function flatRest(func) {
1338
    return setToString(overRest(func, undefined, flatten), func + '');
1339
  }
1340

    
1341
  /**
1342
   * Checks if `value` is a flattenable `arguments` object or array.
1343
   *
1344
   * @private
1345
   * @param {*} value The value to check.
1346
   * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
1347
   */
1348
  function isFlattenable(value) {
1349
    return isArray(value) || isArguments(value);
1350
  }
1351

    
1352
  /**
1353
   * Checks if `value` is a valid array-like index.
1354
   *
1355
   * @private
1356
   * @param {*} value The value to check.
1357
   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
1358
   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
1359
   */
1360
  function isIndex(value, length) {
1361
    var type = typeof value;
1362
    length = length == null ? MAX_SAFE_INTEGER : length;
1363

    
1364
    return !!length &&
1365
      (type == 'number' ||
1366
        (type != 'symbol' && reIsUint.test(value))) &&
1367
          (value > -1 && value % 1 == 0 && value < length);
1368
  }
1369

    
1370
  /**
1371
   * Checks if the given arguments are from an iteratee call.
1372
   *
1373
   * @private
1374
   * @param {*} value The potential iteratee value argument.
1375
   * @param {*} index The potential iteratee index or key argument.
1376
   * @param {*} object The potential iteratee object argument.
1377
   * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
1378
   *  else `false`.
1379
   */
1380
  function isIterateeCall(value, index, object) {
1381
    if (!isObject(object)) {
1382
      return false;
1383
    }
1384
    var type = typeof index;
1385
    if (type == 'number'
1386
          ? (isArrayLike(object) && isIndex(index, object.length))
1387
          : (type == 'string' && index in object)
1388
        ) {
1389
      return eq(object[index], value);
1390
    }
1391
    return false;
1392
  }
1393

    
1394
  /**
1395
   * This function is like
1396
   * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1397
   * except that it includes inherited enumerable properties.
1398
   *
1399
   * @private
1400
   * @param {Object} object The object to query.
1401
   * @returns {Array} Returns the array of property names.
1402
   */
1403
  function nativeKeysIn(object) {
1404
    var result = [];
1405
    if (object != null) {
1406
      for (var key in Object(object)) {
1407
        result.push(key);
1408
      }
1409
    }
1410
    return result;
1411
  }
1412

    
1413
  /**
1414
   * Converts `value` to a string using `Object.prototype.toString`.
1415
   *
1416
   * @private
1417
   * @param {*} value The value to convert.
1418
   * @returns {string} Returns the converted string.
1419
   */
1420
  function objectToString(value) {
1421
    return nativeObjectToString.call(value);
1422
  }
1423

    
1424
  /**
1425
   * A specialized version of `baseRest` which transforms the rest array.
1426
   *
1427
   * @private
1428
   * @param {Function} func The function to apply a rest parameter to.
1429
   * @param {number} [start=func.length-1] The start position of the rest parameter.
1430
   * @param {Function} transform The rest array transform.
1431
   * @returns {Function} Returns the new function.
1432
   */
1433
  function overRest(func, start, transform) {
1434
    start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1435
    return function() {
1436
      var args = arguments,
1437
          index = -1,
1438
          length = nativeMax(args.length - start, 0),
1439
          array = Array(length);
1440

    
1441
      while (++index < length) {
1442
        array[index] = args[start + index];
1443
      }
1444
      index = -1;
1445
      var otherArgs = Array(start + 1);
1446
      while (++index < start) {
1447
        otherArgs[index] = args[index];
1448
      }
1449
      otherArgs[start] = transform(array);
1450
      return func.apply(this, otherArgs);
1451
    };
1452
  }
1453

    
1454
  /**
1455
   * Sets the `toString` method of `func` to return `string`.
1456
   *
1457
   * @private
1458
   * @param {Function} func The function to modify.
1459
   * @param {Function} string The `toString` result.
1460
   * @returns {Function} Returns `func`.
1461
   */
1462
  var setToString = identity;
1463

    
1464
  /*------------------------------------------------------------------------*/
1465

    
1466
  /**
1467
   * Creates an array with all falsey values removed. The values `false`, `null`,
1468
   * `0`, `""`, `undefined`, and `NaN` are falsey.
1469
   *
1470
   * @static
1471
   * @memberOf _
1472
   * @since 0.1.0
1473
   * @category Array
1474
   * @param {Array} array The array to compact.
1475
   * @returns {Array} Returns the new array of filtered values.
1476
   * @example
1477
   *
1478
   * _.compact([0, 1, false, 2, '', 3]);
1479
   * // => [1, 2, 3]
1480
   */
1481
  function compact(array) {
1482
    return baseFilter(array, Boolean);
1483
  }
1484

    
1485
  /**
1486
   * Creates a new array concatenating `array` with any additional arrays
1487
   * and/or values.
1488
   *
1489
   * @static
1490
   * @memberOf _
1491
   * @since 4.0.0
1492
   * @category Array
1493
   * @param {Array} array The array to concatenate.
1494
   * @param {...*} [values] The values to concatenate.
1495
   * @returns {Array} Returns the new concatenated array.
1496
   * @example
1497
   *
1498
   * var array = [1];
1499
   * var other = _.concat(array, 2, [3], [[4]]);
1500
   *
1501
   * console.log(other);
1502
   * // => [1, 2, 3, [4]]
1503
   *
1504
   * console.log(array);
1505
   * // => [1]
1506
   */
1507
  function concat() {
1508
    var length = arguments.length;
1509
    if (!length) {
1510
      return [];
1511
    }
1512
    var args = Array(length - 1),
1513
        array = arguments[0],
1514
        index = length;
1515

    
1516
    while (index--) {
1517
      args[index - 1] = arguments[index];
1518
    }
1519
    return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
1520
  }
1521

    
1522
  /**
1523
   * This method is like `_.find` except that it returns the index of the first
1524
   * element `predicate` returns truthy for instead of the element itself.
1525
   *
1526
   * @static
1527
   * @memberOf _
1528
   * @since 1.1.0
1529
   * @category Array
1530
   * @param {Array} array The array to inspect.
1531
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
1532
   * @param {number} [fromIndex=0] The index to search from.
1533
   * @returns {number} Returns the index of the found element, else `-1`.
1534
   * @example
1535
   *
1536
   * var users = [
1537
   *   { 'user': 'barney',  'active': false },
1538
   *   { 'user': 'fred',    'active': false },
1539
   *   { 'user': 'pebbles', 'active': true }
1540
   * ];
1541
   *
1542
   * _.findIndex(users, function(o) { return o.user == 'barney'; });
1543
   * // => 0
1544
   *
1545
   * // The `_.matches` iteratee shorthand.
1546
   * _.findIndex(users, { 'user': 'fred', 'active': false });
1547
   * // => 1
1548
   *
1549
   * // The `_.matchesProperty` iteratee shorthand.
1550
   * _.findIndex(users, ['active', false]);
1551
   * // => 0
1552
   *
1553
   * // The `_.property` iteratee shorthand.
1554
   * _.findIndex(users, 'active');
1555
   * // => 2
1556
   */
1557
  function findIndex(array, predicate, fromIndex) {
1558
    var length = array == null ? 0 : array.length;
1559
    if (!length) {
1560
      return -1;
1561
    }
1562
    var index = fromIndex == null ? 0 : toInteger(fromIndex);
1563
    if (index < 0) {
1564
      index = nativeMax(length + index, 0);
1565
    }
1566
    return baseFindIndex(array, baseIteratee(predicate, 3), index);
1567
  }
1568

    
1569
  /**
1570
   * Flattens `array` a single level deep.
1571
   *
1572
   * @static
1573
   * @memberOf _
1574
   * @since 0.1.0
1575
   * @category Array
1576
   * @param {Array} array The array to flatten.
1577
   * @returns {Array} Returns the new flattened array.
1578
   * @example
1579
   *
1580
   * _.flatten([1, [2, [3, [4]], 5]]);
1581
   * // => [1, 2, [3, [4]], 5]
1582
   */
1583
  function flatten(array) {
1584
    var length = array == null ? 0 : array.length;
1585
    return length ? baseFlatten(array, 1) : [];
1586
  }
1587

    
1588
  /**
1589
   * Recursively flattens `array`.
1590
   *
1591
   * @static
1592
   * @memberOf _
1593
   * @since 3.0.0
1594
   * @category Array
1595
   * @param {Array} array The array to flatten.
1596
   * @returns {Array} Returns the new flattened array.
1597
   * @example
1598
   *
1599
   * _.flattenDeep([1, [2, [3, [4]], 5]]);
1600
   * // => [1, 2, 3, 4, 5]
1601
   */
1602
  function flattenDeep(array) {
1603
    var length = array == null ? 0 : array.length;
1604
    return length ? baseFlatten(array, INFINITY) : [];
1605
  }
1606

    
1607
  /**
1608
   * Gets the first element of `array`.
1609
   *
1610
   * @static
1611
   * @memberOf _
1612
   * @since 0.1.0
1613
   * @alias first
1614
   * @category Array
1615
   * @param {Array} array The array to query.
1616
   * @returns {*} Returns the first element of `array`.
1617
   * @example
1618
   *
1619
   * _.head([1, 2, 3]);
1620
   * // => 1
1621
   *
1622
   * _.head([]);
1623
   * // => undefined
1624
   */
1625
  function head(array) {
1626
    return (array && array.length) ? array[0] : undefined;
1627
  }
1628

    
1629
  /**
1630
   * Gets the index at which the first occurrence of `value` is found in `array`
1631
   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1632
   * for equality comparisons. If `fromIndex` is negative, it's used as the
1633
   * offset from the end of `array`.
1634
   *
1635
   * @static
1636
   * @memberOf _
1637
   * @since 0.1.0
1638
   * @category Array
1639
   * @param {Array} array The array to inspect.
1640
   * @param {*} value The value to search for.
1641
   * @param {number} [fromIndex=0] The index to search from.
1642
   * @returns {number} Returns the index of the matched value, else `-1`.
1643
   * @example
1644
   *
1645
   * _.indexOf([1, 2, 1, 2], 2);
1646
   * // => 1
1647
   *
1648
   * // Search from the `fromIndex`.
1649
   * _.indexOf([1, 2, 1, 2], 2, 2);
1650
   * // => 3
1651
   */
1652
  function indexOf(array, value, fromIndex) {
1653
    var length = array == null ? 0 : array.length;
1654
    if (typeof fromIndex == 'number') {
1655
      fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
1656
    } else {
1657
      fromIndex = 0;
1658
    }
1659
    var index = (fromIndex || 0) - 1,
1660
        isReflexive = value === value;
1661

    
1662
    while (++index < length) {
1663
      var other = array[index];
1664
      if ((isReflexive ? other === value : other !== other)) {
1665
        return index;
1666
      }
1667
    }
1668
    return -1;
1669
  }
1670

    
1671
  /**
1672
   * Gets the last element of `array`.
1673
   *
1674
   * @static
1675
   * @memberOf _
1676
   * @since 0.1.0
1677
   * @category Array
1678
   * @param {Array} array The array to query.
1679
   * @returns {*} Returns the last element of `array`.
1680
   * @example
1681
   *
1682
   * _.last([1, 2, 3]);
1683
   * // => 3
1684
   */
1685
  function last(array) {
1686
    var length = array == null ? 0 : array.length;
1687
    return length ? array[length - 1] : undefined;
1688
  }
1689

    
1690
  /**
1691
   * Creates a slice of `array` from `start` up to, but not including, `end`.
1692
   *
1693
   * **Note:** This method is used instead of
1694
   * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
1695
   * returned.
1696
   *
1697
   * @static
1698
   * @memberOf _
1699
   * @since 3.0.0
1700
   * @category Array
1701
   * @param {Array} array The array to slice.
1702
   * @param {number} [start=0] The start position.
1703
   * @param {number} [end=array.length] The end position.
1704
   * @returns {Array} Returns the slice of `array`.
1705
   */
1706
  function slice(array, start, end) {
1707
    var length = array == null ? 0 : array.length;
1708
    start = start == null ? 0 : +start;
1709
    end = end === undefined ? length : +end;
1710
    return length ? baseSlice(array, start, end) : [];
1711
  }
1712

    
1713
  /*------------------------------------------------------------------------*/
1714

    
1715
  /**
1716
   * Creates a `lodash` wrapper instance that wraps `value` with explicit method
1717
   * chain sequences enabled. The result of such sequences must be unwrapped
1718
   * with `_#value`.
1719
   *
1720
   * @static
1721
   * @memberOf _
1722
   * @since 1.3.0
1723
   * @category Seq
1724
   * @param {*} value The value to wrap.
1725
   * @returns {Object} Returns the new `lodash` wrapper instance.
1726
   * @example
1727
   *
1728
   * var users = [
1729
   *   { 'user': 'barney',  'age': 36 },
1730
   *   { 'user': 'fred',    'age': 40 },
1731
   *   { 'user': 'pebbles', 'age': 1 }
1732
   * ];
1733
   *
1734
   * var youngest = _
1735
   *   .chain(users)
1736
   *   .sortBy('age')
1737
   *   .map(function(o) {
1738
   *     return o.user + ' is ' + o.age;
1739
   *   })
1740
   *   .head()
1741
   *   .value();
1742
   * // => 'pebbles is 1'
1743
   */
1744
  function chain(value) {
1745
    var result = lodash(value);
1746
    result.__chain__ = true;
1747
    return result;
1748
  }
1749

    
1750
  /**
1751
   * This method invokes `interceptor` and returns `value`. The interceptor
1752
   * is invoked with one argument; (value). The purpose of this method is to
1753
   * "tap into" a method chain sequence in order to modify intermediate results.
1754
   *
1755
   * @static
1756
   * @memberOf _
1757
   * @since 0.1.0
1758
   * @category Seq
1759
   * @param {*} value The value to provide to `interceptor`.
1760
   * @param {Function} interceptor The function to invoke.
1761
   * @returns {*} Returns `value`.
1762
   * @example
1763
   *
1764
   * _([1, 2, 3])
1765
   *  .tap(function(array) {
1766
   *    // Mutate input array.
1767
   *    array.pop();
1768
   *  })
1769
   *  .reverse()
1770
   *  .value();
1771
   * // => [2, 1]
1772
   */
1773
  function tap(value, interceptor) {
1774
    interceptor(value);
1775
    return value;
1776
  }
1777

    
1778
  /**
1779
   * This method is like `_.tap` except that it returns the result of `interceptor`.
1780
   * The purpose of this method is to "pass thru" values replacing intermediate
1781
   * results in a method chain sequence.
1782
   *
1783
   * @static
1784
   * @memberOf _
1785
   * @since 3.0.0
1786
   * @category Seq
1787
   * @param {*} value The value to provide to `interceptor`.
1788
   * @param {Function} interceptor The function to invoke.
1789
   * @returns {*} Returns the result of `interceptor`.
1790
   * @example
1791
   *
1792
   * _('  abc  ')
1793
   *  .chain()
1794
   *  .trim()
1795
   *  .thru(function(value) {
1796
   *    return [value];
1797
   *  })
1798
   *  .value();
1799
   * // => ['abc']
1800
   */
1801
  function thru(value, interceptor) {
1802
    return interceptor(value);
1803
  }
1804

    
1805
  /**
1806
   * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
1807
   *
1808
   * @name chain
1809
   * @memberOf _
1810
   * @since 0.1.0
1811
   * @category Seq
1812
   * @returns {Object} Returns the new `lodash` wrapper instance.
1813
   * @example
1814
   *
1815
   * var users = [
1816
   *   { 'user': 'barney', 'age': 36 },
1817
   *   { 'user': 'fred',   'age': 40 }
1818
   * ];
1819
   *
1820
   * // A sequence without explicit chaining.
1821
   * _(users).head();
1822
   * // => { 'user': 'barney', 'age': 36 }
1823
   *
1824
   * // A sequence with explicit chaining.
1825
   * _(users)
1826
   *   .chain()
1827
   *   .head()
1828
   *   .pick('user')
1829
   *   .value();
1830
   * // => { 'user': 'barney' }
1831
   */
1832
  function wrapperChain() {
1833
    return chain(this);
1834
  }
1835

    
1836
  /**
1837
   * Executes the chain sequence to resolve the unwrapped value.
1838
   *
1839
   * @name value
1840
   * @memberOf _
1841
   * @since 0.1.0
1842
   * @alias toJSON, valueOf
1843
   * @category Seq
1844
   * @returns {*} Returns the resolved unwrapped value.
1845
   * @example
1846
   *
1847
   * _([1, 2, 3]).value();
1848
   * // => [1, 2, 3]
1849
   */
1850
  function wrapperValue() {
1851
    return baseWrapperValue(this.__wrapped__, this.__actions__);
1852
  }
1853

    
1854
  /*------------------------------------------------------------------------*/
1855

    
1856
  /**
1857
   * Checks if `predicate` returns truthy for **all** elements of `collection`.
1858
   * Iteration is stopped once `predicate` returns falsey. The predicate is
1859
   * invoked with three arguments: (value, index|key, collection).
1860
   *
1861
   * **Note:** This method returns `true` for
1862
   * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
1863
   * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
1864
   * elements of empty collections.
1865
   *
1866
   * @static
1867
   * @memberOf _
1868
   * @since 0.1.0
1869
   * @category Collection
1870
   * @param {Array|Object} collection The collection to iterate over.
1871
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
1872
   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
1873
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
1874
   *  else `false`.
1875
   * @example
1876
   *
1877
   * _.every([true, 1, null, 'yes'], Boolean);
1878
   * // => false
1879
   *
1880
   * var users = [
1881
   *   { 'user': 'barney', 'age': 36, 'active': false },
1882
   *   { 'user': 'fred',   'age': 40, 'active': false }
1883
   * ];
1884
   *
1885
   * // The `_.matches` iteratee shorthand.
1886
   * _.every(users, { 'user': 'barney', 'active': false });
1887
   * // => false
1888
   *
1889
   * // The `_.matchesProperty` iteratee shorthand.
1890
   * _.every(users, ['active', false]);
1891
   * // => true
1892
   *
1893
   * // The `_.property` iteratee shorthand.
1894
   * _.every(users, 'active');
1895
   * // => false
1896
   */
1897
  function every(collection, predicate, guard) {
1898
    predicate = guard ? undefined : predicate;
1899
    return baseEvery(collection, baseIteratee(predicate));
1900
  }
1901

    
1902
  /**
1903
   * Iterates over elements of `collection`, returning an array of all elements
1904
   * `predicate` returns truthy for. The predicate is invoked with three
1905
   * arguments: (value, index|key, collection).
1906
   *
1907
   * **Note:** Unlike `_.remove`, this method returns a new array.
1908
   *
1909
   * @static
1910
   * @memberOf _
1911
   * @since 0.1.0
1912
   * @category Collection
1913
   * @param {Array|Object} collection The collection to iterate over.
1914
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
1915
   * @returns {Array} Returns the new filtered array.
1916
   * @see _.reject
1917
   * @example
1918
   *
1919
   * var users = [
1920
   *   { 'user': 'barney', 'age': 36, 'active': true },
1921
   *   { 'user': 'fred',   'age': 40, 'active': false }
1922
   * ];
1923
   *
1924
   * _.filter(users, function(o) { return !o.active; });
1925
   * // => objects for ['fred']
1926
   *
1927
   * // The `_.matches` iteratee shorthand.
1928
   * _.filter(users, { 'age': 36, 'active': true });
1929
   * // => objects for ['barney']
1930
   *
1931
   * // The `_.matchesProperty` iteratee shorthand.
1932
   * _.filter(users, ['active', false]);
1933
   * // => objects for ['fred']
1934
   *
1935
   * // The `_.property` iteratee shorthand.
1936
   * _.filter(users, 'active');
1937
   * // => objects for ['barney']
1938
   */
1939
  function filter(collection, predicate) {
1940
    return baseFilter(collection, baseIteratee(predicate));
1941
  }
1942

    
1943
  /**
1944
   * Iterates over elements of `collection`, returning the first element
1945
   * `predicate` returns truthy for. The predicate is invoked with three
1946
   * arguments: (value, index|key, collection).
1947
   *
1948
   * @static
1949
   * @memberOf _
1950
   * @since 0.1.0
1951
   * @category Collection
1952
   * @param {Array|Object} collection The collection to inspect.
1953
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
1954
   * @param {number} [fromIndex=0] The index to search from.
1955
   * @returns {*} Returns the matched element, else `undefined`.
1956
   * @example
1957
   *
1958
   * var users = [
1959
   *   { 'user': 'barney',  'age': 36, 'active': true },
1960
   *   { 'user': 'fred',    'age': 40, 'active': false },
1961
   *   { 'user': 'pebbles', 'age': 1,  'active': true }
1962
   * ];
1963
   *
1964
   * _.find(users, function(o) { return o.age < 40; });
1965
   * // => object for 'barney'
1966
   *
1967
   * // The `_.matches` iteratee shorthand.
1968
   * _.find(users, { 'age': 1, 'active': true });
1969
   * // => object for 'pebbles'
1970
   *
1971
   * // The `_.matchesProperty` iteratee shorthand.
1972
   * _.find(users, ['active', false]);
1973
   * // => object for 'fred'
1974
   *
1975
   * // The `_.property` iteratee shorthand.
1976
   * _.find(users, 'active');
1977
   * // => object for 'barney'
1978
   */
1979
  var find = createFind(findIndex);
1980

    
1981
  /**
1982
   * Iterates over elements of `collection` and invokes `iteratee` for each element.
1983
   * The iteratee is invoked with three arguments: (value, index|key, collection).
1984
   * Iteratee functions may exit iteration early by explicitly returning `false`.
1985
   *
1986
   * **Note:** As with other "Collections" methods, objects with a "length"
1987
   * property are iterated like arrays. To avoid this behavior use `_.forIn`
1988
   * or `_.forOwn` for object iteration.
1989
   *
1990
   * @static
1991
   * @memberOf _
1992
   * @since 0.1.0
1993
   * @alias each
1994
   * @category Collection
1995
   * @param {Array|Object} collection The collection to iterate over.
1996
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
1997
   * @returns {Array|Object} Returns `collection`.
1998
   * @see _.forEachRight
1999
   * @example
2000
   *
2001
   * _.forEach([1, 2], function(value) {
2002
   *   console.log(value);
2003
   * });
2004
   * // => Logs `1` then `2`.
2005
   *
2006
   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
2007
   *   console.log(key);
2008
   * });
2009
   * // => Logs 'a' then 'b' (iteration order is not guaranteed).
2010
   */
2011
  function forEach(collection, iteratee) {
2012
    return baseEach(collection, baseIteratee(iteratee));
2013
  }
2014

    
2015
  /**
2016
   * Creates an array of values by running each element in `collection` thru
2017
   * `iteratee`. The iteratee is invoked with three arguments:
2018
   * (value, index|key, collection).
2019
   *
2020
   * Many lodash methods are guarded to work as iteratees for methods like
2021
   * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
2022
   *
2023
   * The guarded methods are:
2024
   * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
2025
   * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
2026
   * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
2027
   * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
2028
   *
2029
   * @static
2030
   * @memberOf _
2031
   * @since 0.1.0
2032
   * @category Collection
2033
   * @param {Array|Object} collection The collection to iterate over.
2034
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2035
   * @returns {Array} Returns the new mapped array.
2036
   * @example
2037
   *
2038
   * function square(n) {
2039
   *   return n * n;
2040
   * }
2041
   *
2042
   * _.map([4, 8], square);
2043
   * // => [16, 64]
2044
   *
2045
   * _.map({ 'a': 4, 'b': 8 }, square);
2046
   * // => [16, 64] (iteration order is not guaranteed)
2047
   *
2048
   * var users = [
2049
   *   { 'user': 'barney' },
2050
   *   { 'user': 'fred' }
2051
   * ];
2052
   *
2053
   * // The `_.property` iteratee shorthand.
2054
   * _.map(users, 'user');
2055
   * // => ['barney', 'fred']
2056
   */
2057
  function map(collection, iteratee) {
2058
    return baseMap(collection, baseIteratee(iteratee));
2059
  }
2060

    
2061
  /**
2062
   * Reduces `collection` to a value which is the accumulated result of running
2063
   * each element in `collection` thru `iteratee`, where each successive
2064
   * invocation is supplied the return value of the previous. If `accumulator`
2065
   * is not given, the first element of `collection` is used as the initial
2066
   * value. The iteratee is invoked with four arguments:
2067
   * (accumulator, value, index|key, collection).
2068
   *
2069
   * Many lodash methods are guarded to work as iteratees for methods like
2070
   * `_.reduce`, `_.reduceRight`, and `_.transform`.
2071
   *
2072
   * The guarded methods are:
2073
   * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
2074
   * and `sortBy`
2075
   *
2076
   * @static
2077
   * @memberOf _
2078
   * @since 0.1.0
2079
   * @category Collection
2080
   * @param {Array|Object} collection The collection to iterate over.
2081
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2082
   * @param {*} [accumulator] The initial value.
2083
   * @returns {*} Returns the accumulated value.
2084
   * @see _.reduceRight
2085
   * @example
2086
   *
2087
   * _.reduce([1, 2], function(sum, n) {
2088
   *   return sum + n;
2089
   * }, 0);
2090
   * // => 3
2091
   *
2092
   * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
2093
   *   (result[value] || (result[value] = [])).push(key);
2094
   *   return result;
2095
   * }, {});
2096
   * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
2097
   */
2098
  function reduce(collection, iteratee, accumulator) {
2099
    return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
2100
  }
2101

    
2102
  /**
2103
   * Gets the size of `collection` by returning its length for array-like
2104
   * values or the number of own enumerable string keyed properties for objects.
2105
   *
2106
   * @static
2107
   * @memberOf _
2108
   * @since 0.1.0
2109
   * @category Collection
2110
   * @param {Array|Object|string} collection The collection to inspect.
2111
   * @returns {number} Returns the collection size.
2112
   * @example
2113
   *
2114
   * _.size([1, 2, 3]);
2115
   * // => 3
2116
   *
2117
   * _.size({ 'a': 1, 'b': 2 });
2118
   * // => 2
2119
   *
2120
   * _.size('pebbles');
2121
   * // => 7
2122
   */
2123
  function size(collection) {
2124
    if (collection == null) {
2125
      return 0;
2126
    }
2127
    collection = isArrayLike(collection) ? collection : nativeKeys(collection);
2128
    return collection.length;
2129
  }
2130

    
2131
  /**
2132
   * Checks if `predicate` returns truthy for **any** element of `collection`.
2133
   * Iteration is stopped once `predicate` returns truthy. The predicate is
2134
   * invoked with three arguments: (value, index|key, collection).
2135
   *
2136
   * @static
2137
   * @memberOf _
2138
   * @since 0.1.0
2139
   * @category Collection
2140
   * @param {Array|Object} collection The collection to iterate over.
2141
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
2142
   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
2143
   * @returns {boolean} Returns `true` if any element passes the predicate check,
2144
   *  else `false`.
2145
   * @example
2146
   *
2147
   * _.some([null, 0, 'yes', false], Boolean);
2148
   * // => true
2149
   *
2150
   * var users = [
2151
   *   { 'user': 'barney', 'active': true },
2152
   *   { 'user': 'fred',   'active': false }
2153
   * ];
2154
   *
2155
   * // The `_.matches` iteratee shorthand.
2156
   * _.some(users, { 'user': 'barney', 'active': false });
2157
   * // => false
2158
   *
2159
   * // The `_.matchesProperty` iteratee shorthand.
2160
   * _.some(users, ['active', false]);
2161
   * // => true
2162
   *
2163
   * // The `_.property` iteratee shorthand.
2164
   * _.some(users, 'active');
2165
   * // => true
2166
   */
2167
  function some(collection, predicate, guard) {
2168
    predicate = guard ? undefined : predicate;
2169
    return baseSome(collection, baseIteratee(predicate));
2170
  }
2171

    
2172
  /**
2173
   * Creates an array of elements, sorted in ascending order by the results of
2174
   * running each element in a collection thru each iteratee. This method
2175
   * performs a stable sort, that is, it preserves the original sort order of
2176
   * equal elements. The iteratees are invoked with one argument: (value).
2177
   *
2178
   * @static
2179
   * @memberOf _
2180
   * @since 0.1.0
2181
   * @category Collection
2182
   * @param {Array|Object} collection The collection to iterate over.
2183
   * @param {...(Function|Function[])} [iteratees=[_.identity]]
2184
   *  The iteratees to sort by.
2185
   * @returns {Array} Returns the new sorted array.
2186
   * @example
2187
   *
2188
   * var users = [
2189
   *   { 'user': 'fred',   'age': 48 },
2190
   *   { 'user': 'barney', 'age': 36 },
2191
   *   { 'user': 'fred',   'age': 40 },
2192
   *   { 'user': 'barney', 'age': 34 }
2193
   * ];
2194
   *
2195
   * _.sortBy(users, [function(o) { return o.user; }]);
2196
   * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
2197
   *
2198
   * _.sortBy(users, ['user', 'age']);
2199
   * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
2200
   */
2201
  function sortBy(collection, iteratee) {
2202
    var index = 0;
2203
    iteratee = baseIteratee(iteratee);
2204

    
2205
    return baseMap(baseMap(collection, function(value, key, collection) {
2206
      return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
2207
    }).sort(function(object, other) {
2208
      return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
2209
    }), baseProperty('value'));
2210
  }
2211

    
2212
  /*------------------------------------------------------------------------*/
2213

    
2214
  /**
2215
   * Creates a function that invokes `func`, with the `this` binding and arguments
2216
   * of the created function, while it's called less than `n` times. Subsequent
2217
   * calls to the created function return the result of the last `func` invocation.
2218
   *
2219
   * @static
2220
   * @memberOf _
2221
   * @since 3.0.0
2222
   * @category Function
2223
   * @param {number} n The number of calls at which `func` is no longer invoked.
2224
   * @param {Function} func The function to restrict.
2225
   * @returns {Function} Returns the new restricted function.
2226
   * @example
2227
   *
2228
   * jQuery(element).on('click', _.before(5, addContactToList));
2229
   * // => Allows adding up to 4 contacts to the list.
2230
   */
2231
  function before(n, func) {
2232
    var result;
2233
    if (typeof func != 'function') {
2234
      throw new TypeError(FUNC_ERROR_TEXT);
2235
    }
2236
    n = toInteger(n);
2237
    return function() {
2238
      if (--n > 0) {
2239
        result = func.apply(this, arguments);
2240
      }
2241
      if (n <= 1) {
2242
        func = undefined;
2243
      }
2244
      return result;
2245
    };
2246
  }
2247

    
2248
  /**
2249
   * Creates a function that invokes `func` with the `this` binding of `thisArg`
2250
   * and `partials` prepended to the arguments it receives.
2251
   *
2252
   * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
2253
   * may be used as a placeholder for partially applied arguments.
2254
   *
2255
   * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
2256
   * property of bound functions.
2257
   *
2258
   * @static
2259
   * @memberOf _
2260
   * @since 0.1.0
2261
   * @category Function
2262
   * @param {Function} func The function to bind.
2263
   * @param {*} thisArg The `this` binding of `func`.
2264
   * @param {...*} [partials] The arguments to be partially applied.
2265
   * @returns {Function} Returns the new bound function.
2266
   * @example
2267
   *
2268
   * function greet(greeting, punctuation) {
2269
   *   return greeting + ' ' + this.user + punctuation;
2270
   * }
2271
   *
2272
   * var object = { 'user': 'fred' };
2273
   *
2274
   * var bound = _.bind(greet, object, 'hi');
2275
   * bound('!');
2276
   * // => 'hi fred!'
2277
   *
2278
   * // Bound with placeholders.
2279
   * var bound = _.bind(greet, object, _, '!');
2280
   * bound('hi');
2281
   * // => 'hi fred!'
2282
   */
2283
  var bind = baseRest(function(func, thisArg, partials) {
2284
    return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
2285
  });
2286

    
2287
  /**
2288
   * Defers invoking the `func` until the current call stack has cleared. Any
2289
   * additional arguments are provided to `func` when it's invoked.
2290
   *
2291
   * @static
2292
   * @memberOf _
2293
   * @since 0.1.0
2294
   * @category Function
2295
   * @param {Function} func The function to defer.
2296
   * @param {...*} [args] The arguments to invoke `func` with.
2297
   * @returns {number} Returns the timer id.
2298
   * @example
2299
   *
2300
   * _.defer(function(text) {
2301
   *   console.log(text);
2302
   * }, 'deferred');
2303
   * // => Logs 'deferred' after one millisecond.
2304
   */
2305
  var defer = baseRest(function(func, args) {
2306
    return baseDelay(func, 1, args);
2307
  });
2308

    
2309
  /**
2310
   * Invokes `func` after `wait` milliseconds. Any additional arguments are
2311
   * provided to `func` when it's invoked.
2312
   *
2313
   * @static
2314
   * @memberOf _
2315
   * @since 0.1.0
2316
   * @category Function
2317
   * @param {Function} func The function to delay.
2318
   * @param {number} wait The number of milliseconds to delay invocation.
2319
   * @param {...*} [args] The arguments to invoke `func` with.
2320
   * @returns {number} Returns the timer id.
2321
   * @example
2322
   *
2323
   * _.delay(function(text) {
2324
   *   console.log(text);
2325
   * }, 1000, 'later');
2326
   * // => Logs 'later' after one second.
2327
   */
2328
  var delay = baseRest(function(func, wait, args) {
2329
    return baseDelay(func, toNumber(wait) || 0, args);
2330
  });
2331

    
2332
  /**
2333
   * Creates a function that negates the result of the predicate `func`. The
2334
   * `func` predicate is invoked with the `this` binding and arguments of the
2335
   * created function.
2336
   *
2337
   * @static
2338
   * @memberOf _
2339
   * @since 3.0.0
2340
   * @category Function
2341
   * @param {Function} predicate The predicate to negate.
2342
   * @returns {Function} Returns the new negated function.
2343
   * @example
2344
   *
2345
   * function isEven(n) {
2346
   *   return n % 2 == 0;
2347
   * }
2348
   *
2349
   * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
2350
   * // => [1, 3, 5]
2351
   */
2352
  function negate(predicate) {
2353
    if (typeof predicate != 'function') {
2354
      throw new TypeError(FUNC_ERROR_TEXT);
2355
    }
2356
    return function() {
2357
      var args = arguments;
2358
      return !predicate.apply(this, args);
2359
    };
2360
  }
2361

    
2362
  /**
2363
   * Creates a function that is restricted to invoking `func` once. Repeat calls
2364
   * to the function return the value of the first invocation. The `func` is
2365
   * invoked with the `this` binding and arguments of the created function.
2366
   *
2367
   * @static
2368
   * @memberOf _
2369
   * @since 0.1.0
2370
   * @category Function
2371
   * @param {Function} func The function to restrict.
2372
   * @returns {Function} Returns the new restricted function.
2373
   * @example
2374
   *
2375
   * var initialize = _.once(createApplication);
2376
   * initialize();
2377
   * initialize();
2378
   * // => `createApplication` is invoked once
2379
   */
2380
  function once(func) {
2381
    return before(2, func);
2382
  }
2383

    
2384
  /*------------------------------------------------------------------------*/
2385

    
2386
  /**
2387
   * Creates a shallow clone of `value`.
2388
   *
2389
   * **Note:** This method is loosely based on the
2390
   * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
2391
   * and supports cloning arrays, array buffers, booleans, date objects, maps,
2392
   * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
2393
   * arrays. The own enumerable properties of `arguments` objects are cloned
2394
   * as plain objects. An empty object is returned for uncloneable values such
2395
   * as error objects, functions, DOM nodes, and WeakMaps.
2396
   *
2397
   * @static
2398
   * @memberOf _
2399
   * @since 0.1.0
2400
   * @category Lang
2401
   * @param {*} value The value to clone.
2402
   * @returns {*} Returns the cloned value.
2403
   * @see _.cloneDeep
2404
   * @example
2405
   *
2406
   * var objects = [{ 'a': 1 }, { 'b': 2 }];
2407
   *
2408
   * var shallow = _.clone(objects);
2409
   * console.log(shallow[0] === objects[0]);
2410
   * // => true
2411
   */
2412
  function clone(value) {
2413
    if (!isObject(value)) {
2414
      return value;
2415
    }
2416
    return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
2417
  }
2418

    
2419
  /**
2420
   * Performs a
2421
   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2422
   * comparison between two values to determine if they are equivalent.
2423
   *
2424
   * @static
2425
   * @memberOf _
2426
   * @since 4.0.0
2427
   * @category Lang
2428
   * @param {*} value The value to compare.
2429
   * @param {*} other The other value to compare.
2430
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2431
   * @example
2432
   *
2433
   * var object = { 'a': 1 };
2434
   * var other = { 'a': 1 };
2435
   *
2436
   * _.eq(object, object);
2437
   * // => true
2438
   *
2439
   * _.eq(object, other);
2440
   * // => false
2441
   *
2442
   * _.eq('a', 'a');
2443
   * // => true
2444
   *
2445
   * _.eq('a', Object('a'));
2446
   * // => false
2447
   *
2448
   * _.eq(NaN, NaN);
2449
   * // => true
2450
   */
2451
  function eq(value, other) {
2452
    return value === other || (value !== value && other !== other);
2453
  }
2454

    
2455
  /**
2456
   * Checks if `value` is likely an `arguments` object.
2457
   *
2458
   * @static
2459
   * @memberOf _
2460
   * @since 0.1.0
2461
   * @category Lang
2462
   * @param {*} value The value to check.
2463
   * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2464
   *  else `false`.
2465
   * @example
2466
   *
2467
   * _.isArguments(function() { return arguments; }());
2468
   * // => true
2469
   *
2470
   * _.isArguments([1, 2, 3]);
2471
   * // => false
2472
   */
2473
  var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2474
    return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2475
      !propertyIsEnumerable.call(value, 'callee');
2476
  };
2477

    
2478
  /**
2479
   * Checks if `value` is classified as an `Array` object.
2480
   *
2481
   * @static
2482
   * @memberOf _
2483
   * @since 0.1.0
2484
   * @category Lang
2485
   * @param {*} value The value to check.
2486
   * @returns {boolean} Returns `true` if `value` is an array, else `false`.
2487
   * @example
2488
   *
2489
   * _.isArray([1, 2, 3]);
2490
   * // => true
2491
   *
2492
   * _.isArray(document.body.children);
2493
   * // => false
2494
   *
2495
   * _.isArray('abc');
2496
   * // => false
2497
   *
2498
   * _.isArray(_.noop);
2499
   * // => false
2500
   */
2501
  var isArray = Array.isArray;
2502

    
2503
  /**
2504
   * Checks if `value` is array-like. A value is considered array-like if it's
2505
   * not a function and has a `value.length` that's an integer greater than or
2506
   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2507
   *
2508
   * @static
2509
   * @memberOf _
2510
   * @since 4.0.0
2511
   * @category Lang
2512
   * @param {*} value The value to check.
2513
   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2514
   * @example
2515
   *
2516
   * _.isArrayLike([1, 2, 3]);
2517
   * // => true
2518
   *
2519
   * _.isArrayLike(document.body.children);
2520
   * // => true
2521
   *
2522
   * _.isArrayLike('abc');
2523
   * // => true
2524
   *
2525
   * _.isArrayLike(_.noop);
2526
   * // => false
2527
   */
2528
  function isArrayLike(value) {
2529
    return value != null && isLength(value.length) && !isFunction(value);
2530
  }
2531

    
2532
  /**
2533
   * Checks if `value` is classified as a boolean primitive or object.
2534
   *
2535
   * @static
2536
   * @memberOf _
2537
   * @since 0.1.0
2538
   * @category Lang
2539
   * @param {*} value The value to check.
2540
   * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
2541
   * @example
2542
   *
2543
   * _.isBoolean(false);
2544
   * // => true
2545
   *
2546
   * _.isBoolean(null);
2547
   * // => false
2548
   */
2549
  function isBoolean(value) {
2550
    return value === true || value === false ||
2551
      (isObjectLike(value) && baseGetTag(value) == boolTag);
2552
  }
2553

    
2554
  /**
2555
   * Checks if `value` is classified as a `Date` object.
2556
   *
2557
   * @static
2558
   * @memberOf _
2559
   * @since 0.1.0
2560
   * @category Lang
2561
   * @param {*} value The value to check.
2562
   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
2563
   * @example
2564
   *
2565
   * _.isDate(new Date);
2566
   * // => true
2567
   *
2568
   * _.isDate('Mon April 23 2012');
2569
   * // => false
2570
   */
2571
  var isDate = baseIsDate;
2572

    
2573
  /**
2574
   * Checks if `value` is an empty object, collection, map, or set.
2575
   *
2576
   * Objects are considered empty if they have no own enumerable string keyed
2577
   * properties.
2578
   *
2579
   * Array-like values such as `arguments` objects, arrays, buffers, strings, or
2580
   * jQuery-like collections are considered empty if they have a `length` of `0`.
2581
   * Similarly, maps and sets are considered empty if they have a `size` of `0`.
2582
   *
2583
   * @static
2584
   * @memberOf _
2585
   * @since 0.1.0
2586
   * @category Lang
2587
   * @param {*} value The value to check.
2588
   * @returns {boolean} Returns `true` if `value` is empty, else `false`.
2589
   * @example
2590
   *
2591
   * _.isEmpty(null);
2592
   * // => true
2593
   *
2594
   * _.isEmpty(true);
2595
   * // => true
2596
   *
2597
   * _.isEmpty(1);
2598
   * // => true
2599
   *
2600
   * _.isEmpty([1, 2, 3]);
2601
   * // => false
2602
   *
2603
   * _.isEmpty({ 'a': 1 });
2604
   * // => false
2605
   */
2606
  function isEmpty(value) {
2607
    if (isArrayLike(value) &&
2608
        (isArray(value) || isString(value) ||
2609
          isFunction(value.splice) || isArguments(value))) {
2610
      return !value.length;
2611
    }
2612
    return !nativeKeys(value).length;
2613
  }
2614

    
2615
  /**
2616
   * Performs a deep comparison between two values to determine if they are
2617
   * equivalent.
2618
   *
2619
   * **Note:** This method supports comparing arrays, array buffers, booleans,
2620
   * date objects, error objects, maps, numbers, `Object` objects, regexes,
2621
   * sets, strings, symbols, and typed arrays. `Object` objects are compared
2622
   * by their own, not inherited, enumerable properties. Functions and DOM
2623
   * nodes are compared by strict equality, i.e. `===`.
2624
   *
2625
   * @static
2626
   * @memberOf _
2627
   * @since 0.1.0
2628
   * @category Lang
2629
   * @param {*} value The value to compare.
2630
   * @param {*} other The other value to compare.
2631
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2632
   * @example
2633
   *
2634
   * var object = { 'a': 1 };
2635
   * var other = { 'a': 1 };
2636
   *
2637
   * _.isEqual(object, other);
2638
   * // => true
2639
   *
2640
   * object === other;
2641
   * // => false
2642
   */
2643
  function isEqual(value, other) {
2644
    return baseIsEqual(value, other);
2645
  }
2646

    
2647
  /**
2648
   * Checks if `value` is a finite primitive number.
2649
   *
2650
   * **Note:** This method is based on
2651
   * [`Number.isFinite`](https://mdn.io/Number/isFinite).
2652
   *
2653
   * @static
2654
   * @memberOf _
2655
   * @since 0.1.0
2656
   * @category Lang
2657
   * @param {*} value The value to check.
2658
   * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
2659
   * @example
2660
   *
2661
   * _.isFinite(3);
2662
   * // => true
2663
   *
2664
   * _.isFinite(Number.MIN_VALUE);
2665
   * // => true
2666
   *
2667
   * _.isFinite(Infinity);
2668
   * // => false
2669
   *
2670
   * _.isFinite('3');
2671
   * // => false
2672
   */
2673
  function isFinite(value) {
2674
    return typeof value == 'number' && nativeIsFinite(value);
2675
  }
2676

    
2677
  /**
2678
   * Checks if `value` is classified as a `Function` object.
2679
   *
2680
   * @static
2681
   * @memberOf _
2682
   * @since 0.1.0
2683
   * @category Lang
2684
   * @param {*} value The value to check.
2685
   * @returns {boolean} Returns `true` if `value` is a function, else `false`.
2686
   * @example
2687
   *
2688
   * _.isFunction(_);
2689
   * // => true
2690
   *
2691
   * _.isFunction(/abc/);
2692
   * // => false
2693
   */
2694
  function isFunction(value) {
2695
    if (!isObject(value)) {
2696
      return false;
2697
    }
2698
    // The use of `Object#toString` avoids issues with the `typeof` operator
2699
    // in Safari 9 which returns 'object' for typed arrays and other constructors.
2700
    var tag = baseGetTag(value);
2701
    return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
2702
  }
2703

    
2704
  /**
2705
   * Checks if `value` is a valid array-like length.
2706
   *
2707
   * **Note:** This method is loosely based on
2708
   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
2709
   *
2710
   * @static
2711
   * @memberOf _
2712
   * @since 4.0.0
2713
   * @category Lang
2714
   * @param {*} value The value to check.
2715
   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
2716
   * @example
2717
   *
2718
   * _.isLength(3);
2719
   * // => true
2720
   *
2721
   * _.isLength(Number.MIN_VALUE);
2722
   * // => false
2723
   *
2724
   * _.isLength(Infinity);
2725
   * // => false
2726
   *
2727
   * _.isLength('3');
2728
   * // => false
2729
   */
2730
  function isLength(value) {
2731
    return typeof value == 'number' &&
2732
      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
2733
  }
2734

    
2735
  /**
2736
   * Checks if `value` is the
2737
   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
2738
   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
2739
   *
2740
   * @static
2741
   * @memberOf _
2742
   * @since 0.1.0
2743
   * @category Lang
2744
   * @param {*} value The value to check.
2745
   * @returns {boolean} Returns `true` if `value` is an object, else `false`.
2746
   * @example
2747
   *
2748
   * _.isObject({});
2749
   * // => true
2750
   *
2751
   * _.isObject([1, 2, 3]);
2752
   * // => true
2753
   *
2754
   * _.isObject(_.noop);
2755
   * // => true
2756
   *
2757
   * _.isObject(null);
2758
   * // => false
2759
   */
2760
  function isObject(value) {
2761
    var type = typeof value;
2762
    return value != null && (type == 'object' || type == 'function');
2763
  }
2764

    
2765
  /**
2766
   * Checks if `value` is object-like. A value is object-like if it's not `null`
2767
   * and has a `typeof` result of "object".
2768
   *
2769
   * @static
2770
   * @memberOf _
2771
   * @since 4.0.0
2772
   * @category Lang
2773
   * @param {*} value The value to check.
2774
   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2775
   * @example
2776
   *
2777
   * _.isObjectLike({});
2778
   * // => true
2779
   *
2780
   * _.isObjectLike([1, 2, 3]);
2781
   * // => true
2782
   *
2783
   * _.isObjectLike(_.noop);
2784
   * // => false
2785
   *
2786
   * _.isObjectLike(null);
2787
   * // => false
2788
   */
2789
  function isObjectLike(value) {
2790
    return value != null && typeof value == 'object';
2791
  }
2792

    
2793
  /**
2794
   * Checks if `value` is `NaN`.
2795
   *
2796
   * **Note:** This method is based on
2797
   * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
2798
   * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
2799
   * `undefined` and other non-number values.
2800
   *
2801
   * @static
2802
   * @memberOf _
2803
   * @since 0.1.0
2804
   * @category Lang
2805
   * @param {*} value The value to check.
2806
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2807
   * @example
2808
   *
2809
   * _.isNaN(NaN);
2810
   * // => true
2811
   *
2812
   * _.isNaN(new Number(NaN));
2813
   * // => true
2814
   *
2815
   * isNaN(undefined);
2816
   * // => true
2817
   *
2818
   * _.isNaN(undefined);
2819
   * // => false
2820
   */
2821
  function isNaN(value) {
2822
    // An `NaN` primitive is the only value that is not equal to itself.
2823
    // Perform the `toStringTag` check first to avoid errors with some
2824
    // ActiveX objects in IE.
2825
    return isNumber(value) && value != +value;
2826
  }
2827

    
2828
  /**
2829
   * Checks if `value` is `null`.
2830
   *
2831
   * @static
2832
   * @memberOf _
2833
   * @since 0.1.0
2834
   * @category Lang
2835
   * @param {*} value The value to check.
2836
   * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
2837
   * @example
2838
   *
2839
   * _.isNull(null);
2840
   * // => true
2841
   *
2842
   * _.isNull(void 0);
2843
   * // => false
2844
   */
2845
  function isNull(value) {
2846
    return value === null;
2847
  }
2848

    
2849
  /**
2850
   * Checks if `value` is classified as a `Number` primitive or object.
2851
   *
2852
   * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
2853
   * classified as numbers, use the `_.isFinite` method.
2854
   *
2855
   * @static
2856
   * @memberOf _
2857
   * @since 0.1.0
2858
   * @category Lang
2859
   * @param {*} value The value to check.
2860
   * @returns {boolean} Returns `true` if `value` is a number, else `false`.
2861
   * @example
2862
   *
2863
   * _.isNumber(3);
2864
   * // => true
2865
   *
2866
   * _.isNumber(Number.MIN_VALUE);
2867
   * // => true
2868
   *
2869
   * _.isNumber(Infinity);
2870
   * // => true
2871
   *
2872
   * _.isNumber('3');
2873
   * // => false
2874
   */
2875
  function isNumber(value) {
2876
    return typeof value == 'number' ||
2877
      (isObjectLike(value) && baseGetTag(value) == numberTag);
2878
  }
2879

    
2880
  /**
2881
   * Checks if `value` is classified as a `RegExp` object.
2882
   *
2883
   * @static
2884
   * @memberOf _
2885
   * @since 0.1.0
2886
   * @category Lang
2887
   * @param {*} value The value to check.
2888
   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
2889
   * @example
2890
   *
2891
   * _.isRegExp(/abc/);
2892
   * // => true
2893
   *
2894
   * _.isRegExp('/abc/');
2895
   * // => false
2896
   */
2897
  var isRegExp = baseIsRegExp;
2898

    
2899
  /**
2900
   * Checks if `value` is classified as a `String` primitive or object.
2901
   *
2902
   * @static
2903
   * @since 0.1.0
2904
   * @memberOf _
2905
   * @category Lang
2906
   * @param {*} value The value to check.
2907
   * @returns {boolean} Returns `true` if `value` is a string, else `false`.
2908
   * @example
2909
   *
2910
   * _.isString('abc');
2911
   * // => true
2912
   *
2913
   * _.isString(1);
2914
   * // => false
2915
   */
2916
  function isString(value) {
2917
    return typeof value == 'string' ||
2918
      (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
2919
  }
2920

    
2921
  /**
2922
   * Checks if `value` is `undefined`.
2923
   *
2924
   * @static
2925
   * @since 0.1.0
2926
   * @memberOf _
2927
   * @category Lang
2928
   * @param {*} value The value to check.
2929
   * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
2930
   * @example
2931
   *
2932
   * _.isUndefined(void 0);
2933
   * // => true
2934
   *
2935
   * _.isUndefined(null);
2936
   * // => false
2937
   */
2938
  function isUndefined(value) {
2939
    return value === undefined;
2940
  }
2941

    
2942
  /**
2943
   * Converts `value` to an array.
2944
   *
2945
   * @static
2946
   * @since 0.1.0
2947
   * @memberOf _
2948
   * @category Lang
2949
   * @param {*} value The value to convert.
2950
   * @returns {Array} Returns the converted array.
2951
   * @example
2952
   *
2953
   * _.toArray({ 'a': 1, 'b': 2 });
2954
   * // => [1, 2]
2955
   *
2956
   * _.toArray('abc');
2957
   * // => ['a', 'b', 'c']
2958
   *
2959
   * _.toArray(1);
2960
   * // => []
2961
   *
2962
   * _.toArray(null);
2963
   * // => []
2964
   */
2965
  function toArray(value) {
2966
    if (!isArrayLike(value)) {
2967
      return values(value);
2968
    }
2969
    return value.length ? copyArray(value) : [];
2970
  }
2971

    
2972
  /**
2973
   * Converts `value` to an integer.
2974
   *
2975
   * **Note:** This method is loosely based on
2976
   * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
2977
   *
2978
   * @static
2979
   * @memberOf _
2980
   * @since 4.0.0
2981
   * @category Lang
2982
   * @param {*} value The value to convert.
2983
   * @returns {number} Returns the converted integer.
2984
   * @example
2985
   *
2986
   * _.toInteger(3.2);
2987
   * // => 3
2988
   *
2989
   * _.toInteger(Number.MIN_VALUE);
2990
   * // => 0
2991
   *
2992
   * _.toInteger(Infinity);
2993
   * // => 1.7976931348623157e+308
2994
   *
2995
   * _.toInteger('3.2');
2996
   * // => 3
2997
   */
2998
  var toInteger = Number;
2999

    
3000
  /**
3001
   * Converts `value` to a number.
3002
   *
3003
   * @static
3004
   * @memberOf _
3005
   * @since 4.0.0
3006
   * @category Lang
3007
   * @param {*} value The value to process.
3008
   * @returns {number} Returns the number.
3009
   * @example
3010
   *
3011
   * _.toNumber(3.2);
3012
   * // => 3.2
3013
   *
3014
   * _.toNumber(Number.MIN_VALUE);
3015
   * // => 5e-324
3016
   *
3017
   * _.toNumber(Infinity);
3018
   * // => Infinity
3019
   *
3020
   * _.toNumber('3.2');
3021
   * // => 3.2
3022
   */
3023
  var toNumber = Number;
3024

    
3025
  /**
3026
   * Converts `value` to a string. An empty string is returned for `null`
3027
   * and `undefined` values. The sign of `-0` is preserved.
3028
   *
3029
   * @static
3030
   * @memberOf _
3031
   * @since 4.0.0
3032
   * @category Lang
3033
   * @param {*} value The value to convert.
3034
   * @returns {string} Returns the converted string.
3035
   * @example
3036
   *
3037
   * _.toString(null);
3038
   * // => ''
3039
   *
3040
   * _.toString(-0);
3041
   * // => '-0'
3042
   *
3043
   * _.toString([1, 2, 3]);
3044
   * // => '1,2,3'
3045
   */
3046
  function toString(value) {
3047
    if (typeof value == 'string') {
3048
      return value;
3049
    }
3050
    return value == null ? '' : (value + '');
3051
  }
3052

    
3053
  /*------------------------------------------------------------------------*/
3054

    
3055
  /**
3056
   * Assigns own enumerable string keyed properties of source objects to the
3057
   * destination object. Source objects are applied from left to right.
3058
   * Subsequent sources overwrite property assignments of previous sources.
3059
   *
3060
   * **Note:** This method mutates `object` and is loosely based on
3061
   * [`Object.assign`](https://mdn.io/Object/assign).
3062
   *
3063
   * @static
3064
   * @memberOf _
3065
   * @since 0.10.0
3066
   * @category Object
3067
   * @param {Object} object The destination object.
3068
   * @param {...Object} [sources] The source objects.
3069
   * @returns {Object} Returns `object`.
3070
   * @see _.assignIn
3071
   * @example
3072
   *
3073
   * function Foo() {
3074
   *   this.a = 1;
3075
   * }
3076
   *
3077
   * function Bar() {
3078
   *   this.c = 3;
3079
   * }
3080
   *
3081
   * Foo.prototype.b = 2;
3082
   * Bar.prototype.d = 4;
3083
   *
3084
   * _.assign({ 'a': 0 }, new Foo, new Bar);
3085
   * // => { 'a': 1, 'c': 3 }
3086
   */
3087
  var assign = createAssigner(function(object, source) {
3088
    copyObject(source, nativeKeys(source), object);
3089
  });
3090

    
3091
  /**
3092
   * This method is like `_.assign` except that it iterates over own and
3093
   * inherited source properties.
3094
   *
3095
   * **Note:** This method mutates `object`.
3096
   *
3097
   * @static
3098
   * @memberOf _
3099
   * @since 4.0.0
3100
   * @alias extend
3101
   * @category Object
3102
   * @param {Object} object The destination object.
3103
   * @param {...Object} [sources] The source objects.
3104
   * @returns {Object} Returns `object`.
3105
   * @see _.assign
3106
   * @example
3107
   *
3108
   * function Foo() {
3109
   *   this.a = 1;
3110
   * }
3111
   *
3112
   * function Bar() {
3113
   *   this.c = 3;
3114
   * }
3115
   *
3116
   * Foo.prototype.b = 2;
3117
   * Bar.prototype.d = 4;
3118
   *
3119
   * _.assignIn({ 'a': 0 }, new Foo, new Bar);
3120
   * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
3121
   */
3122
  var assignIn = createAssigner(function(object, source) {
3123
    copyObject(source, nativeKeysIn(source), object);
3124
  });
3125

    
3126
  /**
3127
   * Creates an object that inherits from the `prototype` object. If a
3128
   * `properties` object is given, its own enumerable string keyed properties
3129
   * are assigned to the created object.
3130
   *
3131
   * @static
3132
   * @memberOf _
3133
   * @since 2.3.0
3134
   * @category Object
3135
   * @param {Object} prototype The object to inherit from.
3136
   * @param {Object} [properties] The properties to assign to the object.
3137
   * @returns {Object} Returns the new object.
3138
   * @example
3139
   *
3140
   * function Shape() {
3141
   *   this.x = 0;
3142
   *   this.y = 0;
3143
   * }
3144
   *
3145
   * function Circle() {
3146
   *   Shape.call(this);
3147
   * }
3148
   *
3149
   * Circle.prototype = _.create(Shape.prototype, {
3150
   *   'constructor': Circle
3151
   * });
3152
   *
3153
   * var circle = new Circle;
3154
   * circle instanceof Circle;
3155
   * // => true
3156
   *
3157
   * circle instanceof Shape;
3158
   * // => true
3159
   */
3160
  function create(prototype, properties) {
3161
    var result = baseCreate(prototype);
3162
    return properties == null ? result : assign(result, properties);
3163
  }
3164

    
3165
  /**
3166
   * Assigns own and inherited enumerable string keyed properties of source
3167
   * objects to the destination object for all destination properties that
3168
   * resolve to `undefined`. Source objects are applied from left to right.
3169
   * Once a property is set, additional values of the same property are ignored.
3170
   *
3171
   * **Note:** This method mutates `object`.
3172
   *
3173
   * @static
3174
   * @since 0.1.0
3175
   * @memberOf _
3176
   * @category Object
3177
   * @param {Object} object The destination object.
3178
   * @param {...Object} [sources] The source objects.
3179
   * @returns {Object} Returns `object`.
3180
   * @see _.defaultsDeep
3181
   * @example
3182
   *
3183
   * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
3184
   * // => { 'a': 1, 'b': 2 }
3185
   */
3186
  var defaults = baseRest(function(object, sources) {
3187
    object = Object(object);
3188

    
3189
    var index = -1;
3190
    var length = sources.length;
3191
    var guard = length > 2 ? sources[2] : undefined;
3192

    
3193
    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3194
      length = 1;
3195
    }
3196

    
3197
    while (++index < length) {
3198
      var source = sources[index];
3199
      var props = keysIn(source);
3200
      var propsIndex = -1;
3201
      var propsLength = props.length;
3202

    
3203
      while (++propsIndex < propsLength) {
3204
        var key = props[propsIndex];
3205
        var value = object[key];
3206

    
3207
        if (value === undefined ||
3208
            (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
3209
          object[key] = source[key];
3210
        }
3211
      }
3212
    }
3213

    
3214
    return object;
3215
  });
3216

    
3217
  /**
3218
   * Checks if `path` is a direct property of `object`.
3219
   *
3220
   * @static
3221
   * @since 0.1.0
3222
   * @memberOf _
3223
   * @category Object
3224
   * @param {Object} object The object to query.
3225
   * @param {Array|string} path The path to check.
3226
   * @returns {boolean} Returns `true` if `path` exists, else `false`.
3227
   * @example
3228
   *
3229
   * var object = { 'a': { 'b': 2 } };
3230
   * var other = _.create({ 'a': _.create({ 'b': 2 }) });
3231
   *
3232
   * _.has(object, 'a');
3233
   * // => true
3234
   *
3235
   * _.has(object, 'a.b');
3236
   * // => true
3237
   *
3238
   * _.has(object, ['a', 'b']);
3239
   * // => true
3240
   *
3241
   * _.has(other, 'a');
3242
   * // => false
3243
   */
3244
  function has(object, path) {
3245
    return object != null && hasOwnProperty.call(object, path);
3246
  }
3247

    
3248
  /**
3249
   * Creates an array of the own enumerable property names of `object`.
3250
   *
3251
   * **Note:** Non-object values are coerced to objects. See the
3252
   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
3253
   * for more details.
3254
   *
3255
   * @static
3256
   * @since 0.1.0
3257
   * @memberOf _
3258
   * @category Object
3259
   * @param {Object} object The object to query.
3260
   * @returns {Array} Returns the array of property names.
3261
   * @example
3262
   *
3263
   * function Foo() {
3264
   *   this.a = 1;
3265
   *   this.b = 2;
3266
   * }
3267
   *
3268
   * Foo.prototype.c = 3;
3269
   *
3270
   * _.keys(new Foo);
3271
   * // => ['a', 'b'] (iteration order is not guaranteed)
3272
   *
3273
   * _.keys('hi');
3274
   * // => ['0', '1']
3275
   */
3276
  var keys = nativeKeys;
3277

    
3278
  /**
3279
   * Creates an array of the own and inherited enumerable property names of `object`.
3280
   *
3281
   * **Note:** Non-object values are coerced to objects.
3282
   *
3283
   * @static
3284
   * @memberOf _
3285
   * @since 3.0.0
3286
   * @category Object
3287
   * @param {Object} object The object to query.
3288
   * @returns {Array} Returns the array of property names.
3289
   * @example
3290
   *
3291
   * function Foo() {
3292
   *   this.a = 1;
3293
   *   this.b = 2;
3294
   * }
3295
   *
3296
   * Foo.prototype.c = 3;
3297
   *
3298
   * _.keysIn(new Foo);
3299
   * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
3300
   */
3301
  var keysIn = nativeKeysIn;
3302

    
3303
  /**
3304
   * Creates an object composed of the picked `object` properties.
3305
   *
3306
   * @static
3307
   * @since 0.1.0
3308
   * @memberOf _
3309
   * @category Object
3310
   * @param {Object} object The source object.
3311
   * @param {...(string|string[])} [paths] The property paths to pick.
3312
   * @returns {Object} Returns the new object.
3313
   * @example
3314
   *
3315
   * var object = { 'a': 1, 'b': '2', 'c': 3 };
3316
   *
3317
   * _.pick(object, ['a', 'c']);
3318
   * // => { 'a': 1, 'c': 3 }
3319
   */
3320
  var pick = flatRest(function(object, paths) {
3321
    return object == null ? {} : basePick(object, paths);
3322
  });
3323

    
3324
  /**
3325
   * This method is like `_.get` except that if the resolved value is a
3326
   * function it's invoked with the `this` binding of its parent object and
3327
   * its result is returned.
3328
   *
3329
   * @static
3330
   * @since 0.1.0
3331
   * @memberOf _
3332
   * @category Object
3333
   * @param {Object} object The object to query.
3334
   * @param {Array|string} path The path of the property to resolve.
3335
   * @param {*} [defaultValue] The value returned for `undefined` resolved values.
3336
   * @returns {*} Returns the resolved value.
3337
   * @example
3338
   *
3339
   * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
3340
   *
3341
   * _.result(object, 'a[0].b.c1');
3342
   * // => 3
3343
   *
3344
   * _.result(object, 'a[0].b.c2');
3345
   * // => 4
3346
   *
3347
   * _.result(object, 'a[0].b.c3', 'default');
3348
   * // => 'default'
3349
   *
3350
   * _.result(object, 'a[0].b.c3', _.constant('default'));
3351
   * // => 'default'
3352
   */
3353
  function result(object, path, defaultValue) {
3354
    var value = object == null ? undefined : object[path];
3355
    if (value === undefined) {
3356
      value = defaultValue;
3357
    }
3358
    return isFunction(value) ? value.call(object) : value;
3359
  }
3360

    
3361
  /**
3362
   * Creates an array of the own enumerable string keyed property values of `object`.
3363
   *
3364
   * **Note:** Non-object values are coerced to objects.
3365
   *
3366
   * @static
3367
   * @since 0.1.0
3368
   * @memberOf _
3369
   * @category Object
3370
   * @param {Object} object The object to query.
3371
   * @returns {Array} Returns the array of property values.
3372
   * @example
3373
   *
3374
   * function Foo() {
3375
   *   this.a = 1;
3376
   *   this.b = 2;
3377
   * }
3378
   *
3379
   * Foo.prototype.c = 3;
3380
   *
3381
   * _.values(new Foo);
3382
   * // => [1, 2] (iteration order is not guaranteed)
3383
   *
3384
   * _.values('hi');
3385
   * // => ['h', 'i']
3386
   */
3387
  function values(object) {
3388
    return object == null ? [] : baseValues(object, keys(object));
3389
  }
3390

    
3391
  /*------------------------------------------------------------------------*/
3392

    
3393
  /**
3394
   * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
3395
   * corresponding HTML entities.
3396
   *
3397
   * **Note:** No other characters are escaped. To escape additional
3398
   * characters use a third-party library like [_he_](https://mths.be/he).
3399
   *
3400
   * Though the ">" character is escaped for symmetry, characters like
3401
   * ">" and "/" don't need escaping in HTML and have no special meaning
3402
   * unless they're part of a tag or unquoted attribute value. See
3403
   * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
3404
   * (under "semi-related fun fact") for more details.
3405
   *
3406
   * When working with HTML you should always
3407
   * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
3408
   * XSS vectors.
3409
   *
3410
   * @static
3411
   * @since 0.1.0
3412
   * @memberOf _
3413
   * @category String
3414
   * @param {string} [string=''] The string to escape.
3415
   * @returns {string} Returns the escaped string.
3416
   * @example
3417
   *
3418
   * _.escape('fred, barney, & pebbles');
3419
   * // => 'fred, barney, &amp; pebbles'
3420
   */
3421
  function escape(string) {
3422
    string = toString(string);
3423
    return (string && reHasUnescapedHtml.test(string))
3424
      ? string.replace(reUnescapedHtml, escapeHtmlChar)
3425
      : string;
3426
  }
3427

    
3428
  /*------------------------------------------------------------------------*/
3429

    
3430
  /**
3431
   * This method returns the first argument it receives.
3432
   *
3433
   * @static
3434
   * @since 0.1.0
3435
   * @memberOf _
3436
   * @category Util
3437
   * @param {*} value Any value.
3438
   * @returns {*} Returns `value`.
3439
   * @example
3440
   *
3441
   * var object = { 'a': 1 };
3442
   *
3443
   * console.log(_.identity(object) === object);
3444
   * // => true
3445
   */
3446
  function identity(value) {
3447
    return value;
3448
  }
3449

    
3450
  /**
3451
   * Creates a function that invokes `func` with the arguments of the created
3452
   * function. If `func` is a property name, the created function returns the
3453
   * property value for a given element. If `func` is an array or object, the
3454
   * created function returns `true` for elements that contain the equivalent
3455
   * source properties, otherwise it returns `false`.
3456
   *
3457
   * @static
3458
   * @since 4.0.0
3459
   * @memberOf _
3460
   * @category Util
3461
   * @param {*} [func=_.identity] The value to convert to a callback.
3462
   * @returns {Function} Returns the callback.
3463
   * @example
3464
   *
3465
   * var users = [
3466
   *   { 'user': 'barney', 'age': 36, 'active': true },
3467
   *   { 'user': 'fred',   'age': 40, 'active': false }
3468
   * ];
3469
   *
3470
   * // The `_.matches` iteratee shorthand.
3471
   * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
3472
   * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
3473
   *
3474
   * // The `_.matchesProperty` iteratee shorthand.
3475
   * _.filter(users, _.iteratee(['user', 'fred']));
3476
   * // => [{ 'user': 'fred', 'age': 40 }]
3477
   *
3478
   * // The `_.property` iteratee shorthand.
3479
   * _.map(users, _.iteratee('user'));
3480
   * // => ['barney', 'fred']
3481
   *
3482
   * // Create custom iteratee shorthands.
3483
   * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
3484
   *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
3485
   *     return func.test(string);
3486
   *   };
3487
   * });
3488
   *
3489
   * _.filter(['abc', 'def'], /ef/);
3490
   * // => ['def']
3491
   */
3492
  var iteratee = baseIteratee;
3493

    
3494
  /**
3495
   * Creates a function that performs a partial deep comparison between a given
3496
   * object and `source`, returning `true` if the given object has equivalent
3497
   * property values, else `false`.
3498
   *
3499
   * **Note:** The created function is equivalent to `_.isMatch` with `source`
3500
   * partially applied.
3501
   *
3502
   * Partial comparisons will match empty array and empty object `source`
3503
   * values against any array or object value, respectively. See `_.isEqual`
3504
   * for a list of supported value comparisons.
3505
   *
3506
   * @static
3507
   * @memberOf _
3508
   * @since 3.0.0
3509
   * @category Util
3510
   * @param {Object} source The object of property values to match.
3511
   * @returns {Function} Returns the new spec function.
3512
   * @example
3513
   *
3514
   * var objects = [
3515
   *   { 'a': 1, 'b': 2, 'c': 3 },
3516
   *   { 'a': 4, 'b': 5, 'c': 6 }
3517
   * ];
3518
   *
3519
   * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
3520
   * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
3521
   */
3522
  function matches(source) {
3523
    return baseMatches(assign({}, source));
3524
  }
3525

    
3526
  /**
3527
   * Adds all own enumerable string keyed function properties of a source
3528
   * object to the destination object. If `object` is a function, then methods
3529
   * are added to its prototype as well.
3530
   *
3531
   * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
3532
   * avoid conflicts caused by modifying the original.
3533
   *
3534
   * @static
3535
   * @since 0.1.0
3536
   * @memberOf _
3537
   * @category Util
3538
   * @param {Function|Object} [object=lodash] The destination object.
3539
   * @param {Object} source The object of functions to add.
3540
   * @param {Object} [options={}] The options object.
3541
   * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
3542
   * @returns {Function|Object} Returns `object`.
3543
   * @example
3544
   *
3545
   * function vowels(string) {
3546
   *   return _.filter(string, function(v) {
3547
   *     return /[aeiou]/i.test(v);
3548
   *   });
3549
   * }
3550
   *
3551
   * _.mixin({ 'vowels': vowels });
3552
   * _.vowels('fred');
3553
   * // => ['e']
3554
   *
3555
   * _('fred').vowels().value();
3556
   * // => ['e']
3557
   *
3558
   * _.mixin({ 'vowels': vowels }, { 'chain': false });
3559
   * _('fred').vowels();
3560
   * // => ['e']
3561
   */
3562
  function mixin(object, source, options) {
3563
    var props = keys(source),
3564
        methodNames = baseFunctions(source, props);
3565

    
3566
    if (options == null &&
3567
        !(isObject(source) && (methodNames.length || !props.length))) {
3568
      options = source;
3569
      source = object;
3570
      object = this;
3571
      methodNames = baseFunctions(source, keys(source));
3572
    }
3573
    var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
3574
        isFunc = isFunction(object);
3575

    
3576
    baseEach(methodNames, function(methodName) {
3577
      var func = source[methodName];
3578
      object[methodName] = func;
3579
      if (isFunc) {
3580
        object.prototype[methodName] = function() {
3581
          var chainAll = this.__chain__;
3582
          if (chain || chainAll) {
3583
            var result = object(this.__wrapped__),
3584
                actions = result.__actions__ = copyArray(this.__actions__);
3585

    
3586
            actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
3587
            result.__chain__ = chainAll;
3588
            return result;
3589
          }
3590
          return func.apply(object, arrayPush([this.value()], arguments));
3591
        };
3592
      }
3593
    });
3594

    
3595
    return object;
3596
  }
3597

    
3598
  /**
3599
   * Reverts the `_` variable to its previous value and returns a reference to
3600
   * the `lodash` function.
3601
   *
3602
   * @static
3603
   * @since 0.1.0
3604
   * @memberOf _
3605
   * @category Util
3606
   * @returns {Function} Returns the `lodash` function.
3607
   * @example
3608
   *
3609
   * var lodash = _.noConflict();
3610
   */
3611
  function noConflict() {
3612
    if (root._ === this) {
3613
      root._ = oldDash;
3614
    }
3615
    return this;
3616
  }
3617

    
3618
  /**
3619
   * This method returns `undefined`.
3620
   *
3621
   * @static
3622
   * @memberOf _
3623
   * @since 2.3.0
3624
   * @category Util
3625
   * @example
3626
   *
3627
   * _.times(2, _.noop);
3628
   * // => [undefined, undefined]
3629
   */
3630
  function noop() {
3631
    // No operation performed.
3632
  }
3633

    
3634
  /**
3635
   * Generates a unique ID. If `prefix` is given, the ID is appended to it.
3636
   *
3637
   * @static
3638
   * @since 0.1.0
3639
   * @memberOf _
3640
   * @category Util
3641
   * @param {string} [prefix=''] The value to prefix the ID with.
3642
   * @returns {string} Returns the unique ID.
3643
   * @example
3644
   *
3645
   * _.uniqueId('contact_');
3646
   * // => 'contact_104'
3647
   *
3648
   * _.uniqueId();
3649
   * // => '105'
3650
   */
3651
  function uniqueId(prefix) {
3652
    var id = ++idCounter;
3653
    return toString(prefix) + id;
3654
  }
3655

    
3656
  /*------------------------------------------------------------------------*/
3657

    
3658
  /**
3659
   * Computes the maximum value of `array`. If `array` is empty or falsey,
3660
   * `undefined` is returned.
3661
   *
3662
   * @static
3663
   * @since 0.1.0
3664
   * @memberOf _
3665
   * @category Math
3666
   * @param {Array} array The array to iterate over.
3667
   * @returns {*} Returns the maximum value.
3668
   * @example
3669
   *
3670
   * _.max([4, 2, 8, 6]);
3671
   * // => 8
3672
   *
3673
   * _.max([]);
3674
   * // => undefined
3675
   */
3676
  function max(array) {
3677
    return (array && array.length)
3678
      ? baseExtremum(array, identity, baseGt)
3679
      : undefined;
3680
  }
3681

    
3682
  /**
3683
   * Computes the minimum value of `array`. If `array` is empty or falsey,
3684
   * `undefined` is returned.
3685
   *
3686
   * @static
3687
   * @since 0.1.0
3688
   * @memberOf _
3689
   * @category Math
3690
   * @param {Array} array The array to iterate over.
3691
   * @returns {*} Returns the minimum value.
3692
   * @example
3693
   *
3694
   * _.min([4, 2, 8, 6]);
3695
   * // => 2
3696
   *
3697
   * _.min([]);
3698
   * // => undefined
3699
   */
3700
  function min(array) {
3701
    return (array && array.length)
3702
      ? baseExtremum(array, identity, baseLt)
3703
      : undefined;
3704
  }
3705

    
3706
  /*------------------------------------------------------------------------*/
3707

    
3708
  // Add methods that return wrapped values in chain sequences.
3709
  lodash.assignIn = assignIn;
3710
  lodash.before = before;
3711
  lodash.bind = bind;
3712
  lodash.chain = chain;
3713
  lodash.compact = compact;
3714
  lodash.concat = concat;
3715
  lodash.create = create;
3716
  lodash.defaults = defaults;
3717
  lodash.defer = defer;
3718
  lodash.delay = delay;
3719
  lodash.filter = filter;
3720
  lodash.flatten = flatten;
3721
  lodash.flattenDeep = flattenDeep;
3722
  lodash.iteratee = iteratee;
3723
  lodash.keys = keys;
3724
  lodash.map = map;
3725
  lodash.matches = matches;
3726
  lodash.mixin = mixin;
3727
  lodash.negate = negate;
3728
  lodash.once = once;
3729
  lodash.pick = pick;
3730
  lodash.slice = slice;
3731
  lodash.sortBy = sortBy;
3732
  lodash.tap = tap;
3733
  lodash.thru = thru;
3734
  lodash.toArray = toArray;
3735
  lodash.values = values;
3736

    
3737
  // Add aliases.
3738
  lodash.extend = assignIn;
3739

    
3740
  // Add methods to `lodash.prototype`.
3741
  mixin(lodash, lodash);
3742

    
3743
  /*------------------------------------------------------------------------*/
3744

    
3745
  // Add methods that return unwrapped values in chain sequences.
3746
  lodash.clone = clone;
3747
  lodash.escape = escape;
3748
  lodash.every = every;
3749
  lodash.find = find;
3750
  lodash.forEach = forEach;
3751
  lodash.has = has;
3752
  lodash.head = head;
3753
  lodash.identity = identity;
3754
  lodash.indexOf = indexOf;
3755
  lodash.isArguments = isArguments;
3756
  lodash.isArray = isArray;
3757
  lodash.isBoolean = isBoolean;
3758
  lodash.isDate = isDate;
3759
  lodash.isEmpty = isEmpty;
3760
  lodash.isEqual = isEqual;
3761
  lodash.isFinite = isFinite;
3762
  lodash.isFunction = isFunction;
3763
  lodash.isNaN = isNaN;
3764
  lodash.isNull = isNull;
3765
  lodash.isNumber = isNumber;
3766
  lodash.isObject = isObject;
3767
  lodash.isRegExp = isRegExp;
3768
  lodash.isString = isString;
3769
  lodash.isUndefined = isUndefined;
3770
  lodash.last = last;
3771
  lodash.max = max;
3772
  lodash.min = min;
3773
  lodash.noConflict = noConflict;
3774
  lodash.noop = noop;
3775
  lodash.reduce = reduce;
3776
  lodash.result = result;
3777
  lodash.size = size;
3778
  lodash.some = some;
3779
  lodash.uniqueId = uniqueId;
3780

    
3781
  // Add aliases.
3782
  lodash.each = forEach;
3783
  lodash.first = head;
3784

    
3785
  mixin(lodash, (function() {
3786
    var source = {};
3787
    baseForOwn(lodash, function(func, methodName) {
3788
      if (!hasOwnProperty.call(lodash.prototype, methodName)) {
3789
        source[methodName] = func;
3790
      }
3791
    });
3792
    return source;
3793
  }()), { 'chain': false });
3794

    
3795
  /*------------------------------------------------------------------------*/
3796

    
3797
  /**
3798
   * The semantic version number.
3799
   *
3800
   * @static
3801
   * @memberOf _
3802
   * @type {string}
3803
   */
3804
  lodash.VERSION = VERSION;
3805

    
3806
  // Add `Array` methods to `lodash.prototype`.
3807
  baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
3808
    var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
3809
        chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
3810
        retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
3811

    
3812
    lodash.prototype[methodName] = function() {
3813
      var args = arguments;
3814
      if (retUnwrapped && !this.__chain__) {
3815
        var value = this.value();
3816
        return func.apply(isArray(value) ? value : [], args);
3817
      }
3818
      return this[chainName](function(value) {
3819
        return func.apply(isArray(value) ? value : [], args);
3820
      });
3821
    };
3822
  });
3823

    
3824
  // Add chain sequence methods to the `lodash` wrapper.
3825
  lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
3826

    
3827
  /*--------------------------------------------------------------------------*/
3828

    
3829
  // Some AMD build optimizers, like r.js, check for condition patterns like:
3830
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
3831
    // Expose Lodash on the global object to prevent errors when Lodash is
3832
    // loaded by a script tag in the presence of an AMD loader.
3833
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
3834
    // Use `_.noConflict` to remove Lodash from the global object.
3835
    root._ = lodash;
3836

    
3837
    // Define as an anonymous module so, through path mapping, it can be
3838
    // referenced as the "underscore" module.
3839
    define(function() {
3840
      return lodash;
3841
    });
3842
  }
3843
  // Check for `exports` after `define` in case a build optimizer adds it.
3844
  else if (freeModule) {
3845
    // Export for Node.js.
3846
    (freeModule.exports = lodash)._ = lodash;
3847
    // Export for CommonJS support.
3848
    freeExports._ = lodash;
3849
  }
3850
  else {
3851
    // Export to the global object.
3852
    root._ = lodash;
3853
  }
3854
}.call(this));
(290-290/590)