lodash-rails 3.7.0 → 3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acbbe1f3b24a2ea334617126bb2d94a6e7d3bb05
4
- data.tar.gz: 8a613b8d22d1384e9e22669773e7684af4579e86
3
+ metadata.gz: e68b7bc295668dde308b82203de11d70bbc4fb0d
4
+ data.tar.gz: 5dff5e2a2e145a06baa3d6121ddbd67b79f4a6ae
5
5
  SHA512:
6
- metadata.gz: e57eca4fd02abf4bd954a2f38eea63db6fd9a7f83f197160feb7548418fb06ab236655128a4b64aa2546748398445f7e215dfa08fb4b5b2e507ce4f55b91c713
7
- data.tar.gz: 213b0f0b9492e9aa9baad0b9f1b2647a081a2ceecfc8e048f5440cf6a862988959b94b2c6f4952a12a13697e1a6acdd502bac3de6ead52edfa02fb6e0fce0881
6
+ metadata.gz: 1b8de3edf3042d0cdbb444dd05249f9fb5f86ac3a8df87aeb3f62bd83daf3ca4573b47a2a3c69bcb67404d21c661fa837e772086056dd389c54ad2541d9e9423
7
+ data.tar.gz: ab96f3c348ebb4c5e97aad3c002144cfdb0b4481ece3d62df7a23e6ebef1e8a533a2d5b989587d11ae2edce63dbb99f4b41c8439c2cf861b434c24ea3e8a56ab
data/README.md CHANGED
@@ -18,7 +18,7 @@ Add the necessary library to `app/assets/javascripts/application.js`:
18
18
 
19
19
  ## What's included?
20
20
 
21
- lodash 3.7.0:
21
+ lodash 3.9.3:
22
22
 
23
23
  * lodash.js
24
24
  * lodash.min.js
@@ -1,5 +1,5 @@
1
1
  module LoDash
2
2
  module Rails
3
- VERSION = "3.7.0"
3
+ VERSION = "3.9.3"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * lodash 3.7.0 (Custom Build) <https://lodash.com/>
3
+ * lodash 3.9.3 (Custom Build) <https://lodash.com/>
4
4
  * Build: `lodash compat -o ./lodash.js`
5
5
  * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
6
6
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -13,7 +13,7 @@
13
13
  var undefined;
14
14
 
15
15
  /** Used as the semantic version number. */
16
- var VERSION = '3.7.0';
16
+ var VERSION = '3.9.3';
17
17
 
18
18
  /** Used to compose bitmasks for wrapper metadata. */
19
19
  var BIND_FLAG = 1,
@@ -88,7 +88,7 @@
88
88
  reInterpolate = /<%=([\s\S]+?)%>/g;
89
89
 
90
90
  /** Used to match property names within property paths. */
91
- var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,
91
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
92
92
  reIsPlainProp = /^\w*$/,
93
93
  rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
94
94
 
@@ -118,6 +118,9 @@
118
118
  /** Used to detect host constructors (Safari > 5). */
119
119
  var reIsHostCtor = /^\[object .+?Constructor\]$/;
120
120
 
121
+ /** Used to detect unsigned integer values. */
122
+ var reIsUint = /^\d+$/;
123
+
121
124
  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
122
125
  var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
123
126
 
@@ -152,9 +155,8 @@
152
155
  'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
153
156
  'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
154
157
  'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',
155
- 'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
156
- 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
157
- 'window'
158
+ 'isFinite', 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
159
+ 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', 'window'
158
160
  ];
159
161
 
160
162
  /** Used to fix the JScript `[[DontEnum]]` bug. */
@@ -281,7 +283,7 @@
281
283
  /**
282
284
  * Used as a reference to the global object.
283
285
  *
284
- * The `this` value is used if it is the global object to avoid Greasemonkey's
286
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
285
287
  * restricted `window` object, otherwise the `window` object is used.
286
288
  */
287
289
  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
@@ -293,19 +295,28 @@
293
295
  * sorts them in ascending order without guaranteeing a stable sort.
294
296
  *
295
297
  * @private
296
- * @param {*} value The value to compare to `other`.
297
- * @param {*} other The value to compare to `value`.
298
+ * @param {*} value The value to compare.
299
+ * @param {*} other The other value to compare.
298
300
  * @returns {number} Returns the sort order indicator for `value`.
299
301
  */
300
302
  function baseCompareAscending(value, other) {
301
303
  if (value !== other) {
302
- var valIsReflexive = value === value,
304
+ var valIsNull = value === null,
305
+ valIsUndef = value === undefined,
306
+ valIsReflexive = value === value;
307
+
308
+ var othIsNull = other === null,
309
+ othIsUndef = other === undefined,
303
310
  othIsReflexive = other === other;
304
311
 
305
- if (value > other || !valIsReflexive || (value === undefined && othIsReflexive)) {
312
+ if ((value > other && !othIsNull) || !valIsReflexive ||
313
+ (valIsNull && !othIsUndef && othIsReflexive) ||
314
+ (valIsUndef && othIsReflexive)) {
306
315
  return 1;
307
316
  }
308
- if (value < other || !othIsReflexive || (other === undefined && valIsReflexive)) {
317
+ if ((value < other && !valIsNull) || !othIsReflexive ||
318
+ (othIsNull && !valIsUndef && valIsReflexive) ||
319
+ (othIsUndef && valIsReflexive)) {
309
320
  return -1;
310
321
  }
311
322
  }
@@ -373,7 +384,7 @@
373
384
  }
374
385
 
375
386
  /**
376
- * Converts `value` to a string if it is not one. An empty string is returned
387
+ * Converts `value` to a string if it's not one. An empty string is returned
377
388
  * for `null` or `undefined` values.
378
389
  *
379
390
  * @private
@@ -387,17 +398,6 @@
387
398
  return value == null ? '' : (value + '');
388
399
  }
389
400
 
390
- /**
391
- * Used by `_.max` and `_.min` as the default callback for string values.
392
- *
393
- * @private
394
- * @param {string} string The string to inspect.
395
- * @returns {number} Returns the code unit of the first character of the string.
396
- */
397
- function charAtCallback(string) {
398
- return string.charCodeAt(0);
399
- }
400
-
401
401
  /**
402
402
  * Used by `_.trim` and `_.trimLeft` to get the index of the first character
403
403
  * of `string` that is not found in `chars`.
@@ -741,7 +741,7 @@
741
741
  stringProto = String.prototype;
742
742
 
743
743
  /** Used to detect DOM support. */
744
- var document = (document = context.window) && document.document;
744
+ var document = (document = context.window) ? document.document : null;
745
745
 
746
746
  /** Used to resolve the decompiled source of functions. */
747
747
  var fnToString = Function.prototype.toString;
@@ -763,26 +763,25 @@
763
763
 
764
764
  /** Used to detect if a method is native. */
765
765
  var reIsNative = RegExp('^' +
766
- escapeRegExp(objToString)
767
- .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
766
+ escapeRegExp(fnToString.call(hasOwnProperty))
767
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
768
768
  );
769
769
 
770
770
  /** Native method references. */
771
- var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer,
772
- bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,
771
+ var ArrayBuffer = getNative(context, 'ArrayBuffer'),
772
+ bufferSlice = getNative(ArrayBuffer && new ArrayBuffer(0), 'slice'),
773
773
  ceil = Math.ceil,
774
774
  clearTimeout = context.clearTimeout,
775
775
  floor = Math.floor,
776
- getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols,
777
- getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
776
+ getPrototypeOf = getNative(Object, 'getPrototypeOf'),
777
+ parseFloat = context.parseFloat,
778
778
  push = arrayProto.push,
779
- preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions,
780
779
  propertyIsEnumerable = objectProto.propertyIsEnumerable,
781
- Set = isNative(Set = context.Set) && Set,
780
+ Set = getNative(context, 'Set'),
782
781
  setTimeout = context.setTimeout,
783
782
  splice = arrayProto.splice,
784
- Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array,
785
- WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;
783
+ Uint8Array = getNative(context, 'Uint8Array'),
784
+ WeakMap = getNative(context, 'WeakMap');
786
785
 
787
786
  /** Used to clone array buffers. */
788
787
  var Float64Array = (function() {
@@ -790,37 +789,21 @@
790
789
  // where the array buffer's `byteLength` is not a multiple of the typed
791
790
  // array's `BYTES_PER_ELEMENT`.
792
791
  try {
793
- var func = isNative(func = context.Float64Array) && func,
792
+ var func = getNative(context, 'Float64Array'),
794
793
  result = new func(new ArrayBuffer(10), 0, 1) && func;
795
794
  } catch(e) {}
796
- return result;
797
- }());
798
-
799
- /** Used as `baseAssign`. */
800
- var nativeAssign = (function() {
801
- // Avoid `Object.assign` in Firefox 34-37 which have an early implementation
802
- // with a now defunct try/catch behavior. See https://bugzilla.mozilla.org/show_bug.cgi?id=1103344
803
- // for more details.
804
- //
805
- // Use `Object.preventExtensions` on a plain object instead of simply using
806
- // `Object('x')` because Chrome and IE fail to throw an error when attempting
807
- // to assign values to readonly indexes of strings in strict mode.
808
- var object = { '1': 0 },
809
- func = preventExtensions && isNative(func = Object.assign) && func;
810
-
811
- try { func(preventExtensions(object), 'xo'); } catch(e) {}
812
- return !object[1] && func;
795
+ return result || null;
813
796
  }());
814
797
 
815
798
  /* Native method references for those with the same name as other `lodash` methods. */
816
- var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
817
- nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
799
+ var nativeCreate = getNative(Object, 'create'),
800
+ nativeIsArray = getNative(Array, 'isArray'),
818
801
  nativeIsFinite = context.isFinite,
819
- nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
802
+ nativeKeys = getNative(Object, 'keys'),
820
803
  nativeMax = Math.max,
821
804
  nativeMin = Math.min,
822
- nativeNow = isNative(nativeNow = Date.now) && nativeNow,
823
- nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite,
805
+ nativeNow = getNative(Date, 'now'),
806
+ nativeNumIsFinite = getNative(Number, 'isFinite'),
824
807
  nativeParseInt = context.parseInt,
825
808
  nativeRandom = Math.random;
826
809
 
@@ -829,8 +812,8 @@
829
812
  POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
830
813
 
831
814
  /** Used as references for the maximum length and index of an array. */
832
- var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,
833
- MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
815
+ var MAX_ARRAY_LENGTH = 4294967295,
816
+ MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
834
817
  HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
835
818
 
836
819
  /** Used as the size, in bytes, of each `Float64Array` element. */
@@ -840,7 +823,7 @@
840
823
  * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
841
824
  * of an array-like value.
842
825
  */
843
- var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
826
+ var MAX_SAFE_INTEGER = 9007199254740991;
844
827
 
845
828
  /** Used to store function metadata. */
846
829
  var metaMap = WeakMap && new WeakMap;
@@ -917,30 +900,31 @@
917
900
  * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,
918
901
  * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,
919
902
  * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,
920
- * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`,
921
- * `merge`, `mixin`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
922
- * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
923
- * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,
924
- * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,
925
- * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,
926
- * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,
927
- * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,
928
- * `without`, `wrap`, `xor`, `zip`, and `zipObject`
903
+ * `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
904
+ * `memoize`, `merge`, `method`, `methodOf`, `mixin`, `negate`, `omit`, `once`,
905
+ * `pairs`, `partial`, `partialRight`, `partition`, `pick`, `plant`, `pluck`,
906
+ * `property`, `propertyOf`, `pull`, `pullAt`, `push`, `range`, `rearg`,
907
+ * `reject`, `remove`, `rest`, `restParam`, `reverse`, `set`, `shuffle`,
908
+ * `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`, `spread`,
909
+ * `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`,
910
+ * `thru`, `times`, `toArray`, `toPlainObject`, `transform`, `union`, `uniq`,
911
+ * `unshift`, `unzip`, `unzipWith`, `values`, `valuesIn`, `where`, `without`,
912
+ * `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
929
913
  *
930
914
  * The wrapper methods that are **not** chainable by default are:
931
915
  * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,
932
916
  * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
933
- * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,
934
- * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,
935
- * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`
936
- * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`,
937
- * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `isTypedArray`,
938
- * `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, `noConflict`,
939
- * `noop`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`,
940
- * `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, `shift`, `size`,
941
- * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, `startsWith`,
942
- * `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, `unescape`,
943
- * `uniqueId`, `value`, and `words`
917
+ * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `get`,
918
+ * `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, `inRange`, `isArguments`,
919
+ * `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,
920
+ * `isFinite` `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,
921
+ * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,
922
+ * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `lt`, `lte`,
923
+ * `max`, `min`, `noConflict`, `noop`, `now`, `pad`, `padLeft`, `padRight`,
924
+ * `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`,
925
+ * `runInContext`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`,
926
+ * `sortedLastIndex`, `startCase`, `startsWith`, `sum`, `template`, `trim`,
927
+ * `trimLeft`, `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`
944
928
  *
945
929
  * The wrapper method `sample` will return a wrapped value when `n` is provided,
946
930
  * otherwise an unwrapped value is returned.
@@ -1055,24 +1039,6 @@
1055
1039
  */
1056
1040
  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
1057
1041
 
1058
- /**
1059
- * Detect if functions can be decompiled by `Function#toString`
1060
- * (all but Firefox OS certified apps, older Opera mobile browsers, and
1061
- * the PlayStation 3; forced `false` for Windows 8 apps).
1062
- *
1063
- * @memberOf _.support
1064
- * @type boolean
1065
- */
1066
- support.funcDecomp = /\bthis\b/.test(function() { return this; });
1067
-
1068
- /**
1069
- * Detect if `Function#name` is supported (all but IE).
1070
- *
1071
- * @memberOf _.support
1072
- * @type boolean
1073
- */
1074
- support.funcNames = typeof Function.name == 'string';
1075
-
1076
1042
  /**
1077
1043
  * Detect if the `toStringTag` of DOM nodes is resolvable (all but IE < 9).
1078
1044
  *
@@ -1081,14 +1047,6 @@
1081
1047
  */
1082
1048
  support.nodeTag = objToString.call(document) != objectTag;
1083
1049
 
1084
- /**
1085
- * Detect if string indexes are non-enumerable (IE < 9, RingoJS, Rhino, Narwhal).
1086
- *
1087
- * @memberOf _.support
1088
- * @type boolean
1089
- */
1090
- support.nonEnumStrings = !propertyIsEnumerable.call('x', 0);
1091
-
1092
1050
  /**
1093
1051
  * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
1094
1052
  *
@@ -1145,24 +1103,6 @@
1145
1103
  } catch(e) {
1146
1104
  support.dom = false;
1147
1105
  }
1148
-
1149
- /**
1150
- * Detect if `arguments` object indexes are non-enumerable.
1151
- *
1152
- * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object
1153
- * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat
1154
- * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`
1155
- * checks for indexes that exceed the number of function parameters and
1156
- * whose associated argument values are `0`.
1157
- *
1158
- * @memberOf _.support
1159
- * @type boolean
1160
- */
1161
- try {
1162
- support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);
1163
- } catch(e) {
1164
- support.nonEnumArgs = true;
1165
- }
1166
1106
  }(1, 0));
1167
1107
 
1168
1108
  /**
@@ -1561,6 +1501,35 @@
1561
1501
  return true;
1562
1502
  }
1563
1503
 
1504
+ /**
1505
+ * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
1506
+ * with one argument: (value).
1507
+ *
1508
+ * @private
1509
+ * @param {Array} array The array to iterate over.
1510
+ * @param {Function} iteratee The function invoked per iteration.
1511
+ * @param {Function} comparator The function used to compare values.
1512
+ * @param {*} exValue The initial extremum value.
1513
+ * @returns {*} Returns the extremum value.
1514
+ */
1515
+ function arrayExtremum(array, iteratee, comparator, exValue) {
1516
+ var index = -1,
1517
+ length = array.length,
1518
+ computed = exValue,
1519
+ result = computed;
1520
+
1521
+ while (++index < length) {
1522
+ var value = array[index],
1523
+ current = +iteratee(value);
1524
+
1525
+ if (comparator(current, computed)) {
1526
+ computed = current;
1527
+ result = value;
1528
+ }
1529
+ }
1530
+ return result;
1531
+ }
1532
+
1564
1533
  /**
1565
1534
  * A specialized version of `_.filter` for arrays without support for callback
1566
1535
  * shorthands and `this` binding.
@@ -1605,48 +1574,6 @@
1605
1574
  return result;
1606
1575
  }
1607
1576
 
1608
- /**
1609
- * A specialized version of `_.max` for arrays without support for iteratees.
1610
- *
1611
- * @private
1612
- * @param {Array} array The array to iterate over.
1613
- * @returns {*} Returns the maximum value.
1614
- */
1615
- function arrayMax(array) {
1616
- var index = -1,
1617
- length = array.length,
1618
- result = NEGATIVE_INFINITY;
1619
-
1620
- while (++index < length) {
1621
- var value = array[index];
1622
- if (value > result) {
1623
- result = value;
1624
- }
1625
- }
1626
- return result;
1627
- }
1628
-
1629
- /**
1630
- * A specialized version of `_.min` for arrays without support for iteratees.
1631
- *
1632
- * @private
1633
- * @param {Array} array The array to iterate over.
1634
- * @returns {*} Returns the minimum value.
1635
- */
1636
- function arrayMin(array) {
1637
- var index = -1,
1638
- length = array.length,
1639
- result = POSITIVE_INFINITY;
1640
-
1641
- while (++index < length) {
1642
- var value = array[index];
1643
- if (value < result) {
1644
- result = value;
1645
- }
1646
- }
1647
- return result;
1648
- }
1649
-
1650
1577
  /**
1651
1578
  * A specialized version of `_.reduce` for arrays without support for callback
1652
1579
  * shorthands and `this` binding.
@@ -1777,10 +1704,8 @@
1777
1704
  * @returns {Object} Returns `object`.
1778
1705
  */
1779
1706
  function assignWith(object, source, customizer) {
1780
- var props = keys(source);
1781
- push.apply(props, getSymbols(source));
1782
-
1783
1707
  var index = -1,
1708
+ props = keys(source),
1784
1709
  length = props.length;
1785
1710
 
1786
1711
  while (++index < length) {
@@ -1805,11 +1730,11 @@
1805
1730
  * @param {Object} source The source object.
1806
1731
  * @returns {Object} Returns `object`.
1807
1732
  */
1808
- var baseAssign = nativeAssign || function(object, source) {
1733
+ function baseAssign(object, source) {
1809
1734
  return source == null
1810
1735
  ? object
1811
- : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object));
1812
- };
1736
+ : baseCopy(source, keys(source), object);
1737
+ }
1813
1738
 
1814
1739
  /**
1815
1740
  * The base implementation of `_.at` without support for string collections
@@ -1822,8 +1747,9 @@
1822
1747
  */
1823
1748
  function baseAt(collection, props) {
1824
1749
  var index = -1,
1825
- length = collection.length,
1826
- isArr = isLength(length),
1750
+ isNil = collection == null,
1751
+ isArr = !isNil && isArrayLike(collection),
1752
+ length = isArr ? collection.length : 0,
1827
1753
  propsLength = props.length,
1828
1754
  result = Array(propsLength);
1829
1755
 
@@ -1832,7 +1758,7 @@
1832
1758
  if (isArr) {
1833
1759
  result[index] = isIndex(key, length) ? collection[key] : undefined;
1834
1760
  } else {
1835
- result[index] = collection[key];
1761
+ result[index] = isNil ? undefined : collection[key];
1836
1762
  }
1837
1763
  }
1838
1764
  return result;
@@ -1967,14 +1893,14 @@
1967
1893
  * @returns {Object} Returns the new object.
1968
1894
  */
1969
1895
  var baseCreate = (function() {
1970
- function Object() {}
1896
+ function object() {}
1971
1897
  return function(prototype) {
1972
1898
  if (isObject(prototype)) {
1973
- Object.prototype = prototype;
1974
- var result = new Object;
1975
- Object.prototype = null;
1899
+ object.prototype = prototype;
1900
+ var result = new object;
1901
+ object.prototype = null;
1976
1902
  }
1977
- return result || context.Object();
1903
+ return result || {};
1978
1904
  };
1979
1905
  }());
1980
1906
 
@@ -2083,6 +2009,32 @@
2083
2009
  return result;
2084
2010
  }
2085
2011
 
2012
+ /**
2013
+ * Gets the extremum value of `collection` invoking `iteratee` for each value
2014
+ * in `collection` to generate the criterion by which the value is ranked.
2015
+ * The `iteratee` is invoked with three arguments: (value, index|key, collection).
2016
+ *
2017
+ * @private
2018
+ * @param {Array|Object|string} collection The collection to iterate over.
2019
+ * @param {Function} iteratee The function invoked per iteration.
2020
+ * @param {Function} comparator The function used to compare values.
2021
+ * @param {*} exValue The initial extremum value.
2022
+ * @returns {*} Returns the extremum value.
2023
+ */
2024
+ function baseExtremum(collection, iteratee, comparator, exValue) {
2025
+ var computed = exValue,
2026
+ result = computed;
2027
+
2028
+ baseEach(collection, function(value, index, collection) {
2029
+ var current = +iteratee(value, index, collection);
2030
+ if (comparator(current, computed) || (current === exValue && current === result)) {
2031
+ computed = current;
2032
+ result = value;
2033
+ }
2034
+ });
2035
+ return result;
2036
+ }
2037
+
2086
2038
  /**
2087
2039
  * The base implementation of `_.fill` without an iteratee call guard.
2088
2040
  *
@@ -2162,8 +2114,8 @@
2162
2114
  *
2163
2115
  * @private
2164
2116
  * @param {Array} array The array to flatten.
2165
- * @param {boolean} isDeep Specify a deep flatten.
2166
- * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
2117
+ * @param {boolean} [isDeep] Specify a deep flatten.
2118
+ * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
2167
2119
  * @returns {Array} Returns the new flattened array.
2168
2120
  */
2169
2121
  function baseFlatten(array, isDeep, isStrict) {
@@ -2174,8 +2126,8 @@
2174
2126
 
2175
2127
  while (++index < length) {
2176
2128
  var value = array[index];
2177
-
2178
- if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
2129
+ if (isObjectLike(value) && isArrayLike(value) &&
2130
+ (isStrict || isArray(value) || isArguments(value))) {
2179
2131
  if (isDeep) {
2180
2132
  // Recursively flatten arrays (susceptible to call stack limits).
2181
2133
  value = baseFlatten(value, isDeep, isStrict);
@@ -2183,7 +2135,6 @@
2183
2135
  var valIndex = -1,
2184
2136
  valLength = value.length;
2185
2137
 
2186
- result.length += valLength;
2187
2138
  while (++valIndex < valLength) {
2188
2139
  result[++resIndex] = value[valIndex];
2189
2140
  }
@@ -2301,13 +2252,13 @@
2301
2252
  if (pathKey !== undefined && pathKey in object) {
2302
2253
  path = [pathKey];
2303
2254
  }
2304
- var index = -1,
2255
+ var index = 0,
2305
2256
  length = path.length;
2306
2257
 
2307
- while (object != null && ++index < length) {
2308
- var result = object = toObject(object)[path[index]];
2258
+ while (object != null && index < length) {
2259
+ object = toObject(object)[path[index++]];
2309
2260
  }
2310
- return result;
2261
+ return (index && index == length) ? object : undefined;
2311
2262
  }
2312
2263
 
2313
2264
  /**
@@ -2324,18 +2275,10 @@
2324
2275
  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2325
2276
  */
2326
2277
  function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
2327
- // Exit early for identical values.
2328
2278
  if (value === other) {
2329
- // Treat `+0` vs. `-0` as not equal.
2330
- return value !== 0 || (1 / value == 1 / other);
2279
+ return true;
2331
2280
  }
2332
- var valType = typeof value,
2333
- othType = typeof other;
2334
-
2335
- // Exit early for unlike primitive values.
2336
- if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||
2337
- value == null || other == null) {
2338
- // Return `false` unless both values are `NaN`.
2281
+ if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
2339
2282
  return value !== value && other !== other;
2340
2283
  }
2341
2284
  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
@@ -2386,11 +2329,11 @@
2386
2329
  return equalByTag(object, other, objTag);
2387
2330
  }
2388
2331
  if (!isLoose) {
2389
- var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
2390
- othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2332
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
2333
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2391
2334
 
2392
- if (valWrapped || othWrapped) {
2393
- return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
2335
+ if (objIsWrapped || othIsWrapped) {
2336
+ return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
2394
2337
  }
2395
2338
  }
2396
2339
  if (!isSameTag) {
@@ -2425,42 +2368,44 @@
2425
2368
  *
2426
2369
  * @private
2427
2370
  * @param {Object} object The object to inspect.
2428
- * @param {Array} props The source property names to match.
2429
- * @param {Array} values The source values to match.
2430
- * @param {Array} strictCompareFlags Strict comparison flags for source values.
2371
+ * @param {Array} matchData The propery names, values, and compare flags to match.
2431
2372
  * @param {Function} [customizer] The function to customize comparing objects.
2432
2373
  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
2433
2374
  */
2434
- function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
2435
- var index = -1,
2436
- length = props.length,
2375
+ function baseIsMatch(object, matchData, customizer) {
2376
+ var index = matchData.length,
2377
+ length = index,
2437
2378
  noCustomizer = !customizer;
2438
2379
 
2439
- while (++index < length) {
2440
- if ((noCustomizer && strictCompareFlags[index])
2441
- ? values[index] !== object[props[index]]
2442
- : !(props[index] in object)
2380
+ if (object == null) {
2381
+ return !length;
2382
+ }
2383
+ object = toObject(object);
2384
+ while (index--) {
2385
+ var data = matchData[index];
2386
+ if ((noCustomizer && data[2])
2387
+ ? data[1] !== object[data[0]]
2388
+ : !(data[0] in object)
2443
2389
  ) {
2444
2390
  return false;
2445
2391
  }
2446
2392
  }
2447
- index = -1;
2448
2393
  while (++index < length) {
2449
- var key = props[index],
2394
+ data = matchData[index];
2395
+ var key = data[0],
2450
2396
  objValue = object[key],
2451
- srcValue = values[index];
2397
+ srcValue = data[1];
2452
2398
 
2453
- if (noCustomizer && strictCompareFlags[index]) {
2454
- var result = objValue !== undefined || (key in object);
2399
+ if (noCustomizer && data[2]) {
2400
+ if (objValue === undefined && !(key in object)) {
2401
+ return false;
2402
+ }
2455
2403
  } else {
2456
- result = customizer ? customizer(objValue, srcValue, key) : undefined;
2457
- if (result === undefined) {
2458
- result = baseIsEqual(srcValue, objValue, customizer, true);
2404
+ var result = customizer ? customizer(objValue, srcValue, key) : undefined;
2405
+ if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
2406
+ return false;
2459
2407
  }
2460
2408
  }
2461
- if (!result) {
2462
- return false;
2463
- }
2464
2409
  }
2465
2410
  return true;
2466
2411
  }
@@ -2476,8 +2421,7 @@
2476
2421
  */
2477
2422
  function baseMap(collection, iteratee) {
2478
2423
  var index = -1,
2479
- length = getLength(collection),
2480
- result = isLength(length) ? Array(length) : [];
2424
+ result = isArrayLike(collection) ? Array(collection.length) : [];
2481
2425
 
2482
2426
  baseEach(collection, function(value, key, collection) {
2483
2427
  result[++index] = iteratee(value, key, collection);
@@ -2493,51 +2437,35 @@
2493
2437
  * @returns {Function} Returns the new function.
2494
2438
  */
2495
2439
  function baseMatches(source) {
2496
- var props = keys(source),
2497
- length = props.length;
2498
-
2499
- if (!length) {
2500
- return constant(true);
2501
- }
2502
- if (length == 1) {
2503
- var key = props[0],
2504
- value = source[key];
2440
+ var matchData = getMatchData(source);
2441
+ if (matchData.length == 1 && matchData[0][2]) {
2442
+ var key = matchData[0][0],
2443
+ value = matchData[0][1];
2505
2444
 
2506
- if (isStrictComparable(value)) {
2507
- return function(object) {
2508
- if (object == null) {
2509
- return false;
2510
- }
2511
- object = toObject(object);
2512
- return object[key] === value && (value !== undefined || (key in object));
2513
- };
2514
- }
2515
- }
2516
- var values = Array(length),
2517
- strictCompareFlags = Array(length);
2518
-
2519
- while (length--) {
2520
- value = source[props[length]];
2521
- values[length] = value;
2522
- strictCompareFlags[length] = isStrictComparable(value);
2445
+ return function(object) {
2446
+ if (object == null) {
2447
+ return false;
2448
+ }
2449
+ object = toObject(object);
2450
+ return object[key] === value && (value !== undefined || (key in object));
2451
+ };
2523
2452
  }
2524
2453
  return function(object) {
2525
- return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);
2454
+ return baseIsMatch(object, matchData);
2526
2455
  };
2527
2456
  }
2528
2457
 
2529
2458
  /**
2530
- * The base implementation of `_.matchesProperty` which does not which does
2531
- * not clone `value`.
2459
+ * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
2532
2460
  *
2533
2461
  * @private
2534
2462
  * @param {string} path The path of the property to get.
2535
- * @param {*} value The value to compare.
2463
+ * @param {*} srcValue The value to compare.
2536
2464
  * @returns {Function} Returns the new function.
2537
2465
  */
2538
- function baseMatchesProperty(path, value) {
2466
+ function baseMatchesProperty(path, srcValue) {
2539
2467
  var isArr = isArray(path),
2540
- isCommon = isKey(path) && isStrictComparable(value),
2468
+ isCommon = isKey(path) && isStrictComparable(srcValue),
2541
2469
  pathKey = (path + '');
2542
2470
 
2543
2471
  path = toPath(path);
@@ -2555,9 +2483,9 @@
2555
2483
  key = last(path);
2556
2484
  object = toObject(object);
2557
2485
  }
2558
- return object[key] === value
2559
- ? (value !== undefined || (key in object))
2560
- : baseIsEqual(value, object[key], null, true);
2486
+ return object[key] === srcValue
2487
+ ? (srcValue !== undefined || (key in object))
2488
+ : baseIsEqual(srcValue, object[key], undefined, true);
2561
2489
  };
2562
2490
  }
2563
2491
 
@@ -2577,11 +2505,9 @@
2577
2505
  if (!isObject(object)) {
2578
2506
  return object;
2579
2507
  }
2580
- var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
2581
- if (!isSrcArr) {
2582
- var props = keys(source);
2583
- push.apply(props, getSymbols(source));
2584
- }
2508
+ var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
2509
+ props = isSrcArr ? null : keys(source);
2510
+
2585
2511
  arrayEach(props || source, function(srcValue, key) {
2586
2512
  if (props) {
2587
2513
  key = srcValue;
@@ -2600,7 +2526,7 @@
2600
2526
  if (isCommon) {
2601
2527
  result = srcValue;
2602
2528
  }
2603
- if ((isSrcArr || result !== undefined) &&
2529
+ if ((result !== undefined || (isSrcArr && !(key in object))) &&
2604
2530
  (isCommon || (result === result ? (result !== value) : (value === value)))) {
2605
2531
  object[key] = result;
2606
2532
  }
@@ -2640,10 +2566,10 @@
2640
2566
 
2641
2567
  if (isCommon) {
2642
2568
  result = srcValue;
2643
- if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
2569
+ if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
2644
2570
  result = isArray(value)
2645
2571
  ? value
2646
- : (getLength(value) ? arrayCopy(value) : []);
2572
+ : (isArrayLike(value) ? arrayCopy(value) : []);
2647
2573
  }
2648
2574
  else if (isPlainObject(srcValue) || isArguments(srcValue)) {
2649
2575
  result = isArguments(value)
@@ -2705,9 +2631,9 @@
2705
2631
  * @returns {Array} Returns `array`.
2706
2632
  */
2707
2633
  function basePullAt(array, indexes) {
2708
- var length = indexes.length;
2634
+ var length = array ? indexes.length : 0;
2709
2635
  while (length--) {
2710
- var index = parseFloat(indexes[length]);
2636
+ var index = indexes[length];
2711
2637
  if (index != previous && isIndex(index)) {
2712
2638
  var previous = index;
2713
2639
  splice.call(array, index, 1);
@@ -3020,7 +2946,7 @@
3020
2946
  var mid = (low + high) >>> 1,
3021
2947
  computed = array[mid];
3022
2948
 
3023
- if (retHighest ? (computed <= value) : (computed < value)) {
2949
+ if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
3024
2950
  low = mid + 1;
3025
2951
  } else {
3026
2952
  high = mid;
@@ -3050,17 +2976,23 @@
3050
2976
  var low = 0,
3051
2977
  high = array ? array.length : 0,
3052
2978
  valIsNaN = value !== value,
2979
+ valIsNull = value === null,
3053
2980
  valIsUndef = value === undefined;
3054
2981
 
3055
2982
  while (low < high) {
3056
2983
  var mid = floor((low + high) / 2),
3057
2984
  computed = iteratee(array[mid]),
2985
+ isDef = computed !== undefined,
3058
2986
  isReflexive = computed === computed;
3059
2987
 
3060
2988
  if (valIsNaN) {
3061
2989
  var setLow = isReflexive || retHighest;
2990
+ } else if (valIsNull) {
2991
+ setLow = isReflexive && isDef && (retHighest || computed != null);
3062
2992
  } else if (valIsUndef) {
3063
- setLow = isReflexive && (retHighest || computed !== undefined);
2993
+ setLow = isReflexive && (retHighest || isDef);
2994
+ } else if (computed == null) {
2995
+ setLow = false;
3064
2996
  } else {
3065
2997
  setLow = retHighest ? (computed <= value) : (computed < value);
3066
2998
  }
@@ -3191,12 +3123,12 @@
3191
3123
  while (++argsIndex < argsLength) {
3192
3124
  result[argsIndex] = args[argsIndex];
3193
3125
  }
3194
- var pad = argsIndex;
3126
+ var offset = argsIndex;
3195
3127
  while (++rightIndex < rightLength) {
3196
- result[pad + rightIndex] = partials[rightIndex];
3128
+ result[offset + rightIndex] = partials[rightIndex];
3197
3129
  }
3198
3130
  while (++holdersIndex < holdersLength) {
3199
- result[pad + holders[holdersIndex]] = args[argsIndex++];
3131
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
3200
3132
  }
3201
3133
  return result;
3202
3134
  }
@@ -3250,19 +3182,19 @@
3250
3182
  return restParam(function(object, sources) {
3251
3183
  var index = -1,
3252
3184
  length = object == null ? 0 : sources.length,
3253
- customizer = length > 2 && sources[length - 2],
3254
- guard = length > 2 && sources[2],
3255
- thisArg = length > 1 && sources[length - 1];
3185
+ customizer = length > 2 ? sources[length - 2] : undefined,
3186
+ guard = length > 2 ? sources[2] : undefined,
3187
+ thisArg = length > 1 ? sources[length - 1] : undefined;
3256
3188
 
3257
3189
  if (typeof customizer == 'function') {
3258
3190
  customizer = bindCallback(customizer, thisArg, 5);
3259
3191
  length -= 2;
3260
3192
  } else {
3261
- customizer = typeof thisArg == 'function' ? thisArg : null;
3193
+ customizer = typeof thisArg == 'function' ? thisArg : undefined;
3262
3194
  length -= (customizer ? 1 : 0);
3263
3195
  }
3264
3196
  if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3265
- customizer = length < 3 ? null : customizer;
3197
+ customizer = length < 3 ? undefined : customizer;
3266
3198
  length = 1;
3267
3199
  }
3268
3200
  while (++index < length) {
@@ -3387,8 +3319,20 @@
3387
3319
  */
3388
3320
  function createCtorWrapper(Ctor) {
3389
3321
  return function() {
3322
+ // Use a `switch` statement to work with class constructors.
3323
+ // See https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-function-objects-call-thisargument-argumentslist
3324
+ // for more details.
3325
+ var args = arguments;
3326
+ switch (args.length) {
3327
+ case 0: return new Ctor;
3328
+ case 1: return new Ctor(args[0]);
3329
+ case 2: return new Ctor(args[0], args[1]);
3330
+ case 3: return new Ctor(args[0], args[1], args[2]);
3331
+ case 4: return new Ctor(args[0], args[1], args[2], args[3]);
3332
+ case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
3333
+ }
3390
3334
  var thisBinding = baseCreate(Ctor.prototype),
3391
- result = Ctor.apply(thisBinding, arguments);
3335
+ result = Ctor.apply(thisBinding, args);
3392
3336
 
3393
3337
  // Mimic the constructor's `return` behavior.
3394
3338
  // See https://es5.github.io/#x13.2.2 for more details.
@@ -3419,32 +3363,24 @@
3419
3363
  * Creates a `_.max` or `_.min` function.
3420
3364
  *
3421
3365
  * @private
3422
- * @param {Function} arrayFunc The function to get the extremum value from an array.
3423
- * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,
3424
- * extremum value.
3366
+ * @param {Function} comparator The function used to compare values.
3367
+ * @param {*} exValue The initial extremum value.
3425
3368
  * @returns {Function} Returns the new extremum function.
3426
3369
  */
3427
- function createExtremum(arrayFunc, isMin) {
3370
+ function createExtremum(comparator, exValue) {
3428
3371
  return function(collection, iteratee, thisArg) {
3429
3372
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
3430
3373
  iteratee = null;
3431
3374
  }
3432
- var func = getCallback(),
3433
- noIteratee = iteratee == null;
3434
-
3435
- if (!(func === baseCallback && noIteratee)) {
3436
- noIteratee = false;
3437
- iteratee = func(iteratee, thisArg, 3);
3438
- }
3439
- if (noIteratee) {
3440
- var isArr = isArray(collection);
3441
- if (!isArr && isString(collection)) {
3442
- iteratee = charAtCallback;
3443
- } else {
3444
- return arrayFunc(isArr ? collection : toIterable(collection));
3375
+ iteratee = getCallback(iteratee, thisArg, 3);
3376
+ if (iteratee.length == 1) {
3377
+ collection = toIterable(collection);
3378
+ var result = arrayExtremum(collection, iteratee, comparator, exValue);
3379
+ if (!(collection.length && result === exValue)) {
3380
+ return result;
3445
3381
  }
3446
3382
  }
3447
- return extremumBy(collection, iteratee, isMin);
3383
+ return baseExtremum(collection, iteratee, comparator, exValue);
3448
3384
  };
3449
3385
  }
3450
3386
 
@@ -3464,7 +3400,7 @@
3464
3400
  return index > -1 ? collection[index] : undefined;
3465
3401
  }
3466
3402
  return baseFind(collection, predicate, eachFunc);
3467
- }
3403
+ };
3468
3404
  }
3469
3405
 
3470
3406
  /**
@@ -3507,11 +3443,8 @@
3507
3443
  */
3508
3444
  function createFlow(fromRight) {
3509
3445
  return function() {
3510
- var length = arguments.length;
3511
- if (!length) {
3512
- return function() { return arguments[0]; };
3513
- }
3514
3446
  var wrapper,
3447
+ length = arguments.length,
3515
3448
  index = fromRight ? length : -1,
3516
3449
  leftIndex = 0,
3517
3450
  funcs = Array(length);
@@ -3521,16 +3454,18 @@
3521
3454
  if (typeof func != 'function') {
3522
3455
  throw new TypeError(FUNC_ERROR_TEXT);
3523
3456
  }
3524
- var funcName = wrapper ? '' : getFuncName(func);
3525
- wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;
3457
+ if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
3458
+ wrapper = new LodashWrapper([]);
3459
+ }
3526
3460
  }
3527
3461
  index = wrapper ? -1 : length;
3528
3462
  while (++index < length) {
3529
3463
  func = funcs[index];
3530
- funcName = getFuncName(func);
3531
3464
 
3532
- var data = funcName == 'wrapper' ? getData(func) : null;
3533
- if (data && isLaziable(data[0])) {
3465
+ var funcName = getFuncName(func),
3466
+ data = funcName == 'wrapper' ? getData(func) : null;
3467
+
3468
+ if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
3534
3469
  wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
3535
3470
  } else {
3536
3471
  wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
@@ -3542,7 +3477,7 @@
3542
3477
  return wrapper.plant(args[0]).value();
3543
3478
  }
3544
3479
  var index = 0,
3545
- result = funcs[index].apply(this, args);
3480
+ result = length ? funcs[index].apply(this, args) : args[0];
3546
3481
 
3547
3482
  while (++index < length) {
3548
3483
  result = funcs[index].call(this, result);
@@ -3600,6 +3535,28 @@
3600
3535
  };
3601
3536
  }
3602
3537
 
3538
+ /**
3539
+ * Creates a function for `_.mapKeys` or `_.mapValues`.
3540
+ *
3541
+ * @private
3542
+ * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
3543
+ * @returns {Function} Returns the new map function.
3544
+ */
3545
+ function createObjectMapper(isMapKeys) {
3546
+ return function(object, iteratee, thisArg) {
3547
+ var result = {};
3548
+ iteratee = getCallback(iteratee, thisArg, 3);
3549
+
3550
+ baseForOwn(object, function(value, key, object) {
3551
+ var mapped = iteratee(value, key, object);
3552
+ key = isMapKeys ? mapped : key;
3553
+ value = isMapKeys ? value : mapped;
3554
+ result[key] = value;
3555
+ });
3556
+ return result;
3557
+ };
3558
+ }
3559
+
3603
3560
  /**
3604
3561
  * Creates a function for `_.padLeft` or `_.padRight`.
3605
3562
  *
@@ -3610,7 +3567,7 @@
3610
3567
  function createPadDir(fromRight) {
3611
3568
  return function(string, length, chars) {
3612
3569
  string = baseToString(string);
3613
- return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));
3570
+ return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
3614
3571
  };
3615
3572
  }
3616
3573
 
@@ -3669,10 +3626,8 @@
3669
3626
  isBindKey = bitmask & BIND_KEY_FLAG,
3670
3627
  isCurry = bitmask & CURRY_FLAG,
3671
3628
  isCurryBound = bitmask & CURRY_BOUND_FLAG,
3672
- isCurryRight = bitmask & CURRY_RIGHT_FLAG;
3673
-
3674
- var Ctor = !isBindKey && createCtorWrapper(func),
3675
- key = func;
3629
+ isCurryRight = bitmask & CURRY_RIGHT_FLAG,
3630
+ Ctor = isBindKey ? null : createCtorWrapper(func);
3676
3631
 
3677
3632
  function wrapper() {
3678
3633
  // Avoid `arguments` object use disqualifying optimizations by
@@ -3719,17 +3674,18 @@
3719
3674
  return result;
3720
3675
  }
3721
3676
  }
3722
- var thisBinding = isBind ? thisArg : this;
3723
- if (isBindKey) {
3724
- func = thisBinding[key];
3725
- }
3677
+ var thisBinding = isBind ? thisArg : this,
3678
+ fn = isBindKey ? thisBinding[func] : func;
3679
+
3726
3680
  if (argPos) {
3727
3681
  args = reorder(args, argPos);
3728
3682
  }
3729
3683
  if (isAry && ary < args.length) {
3730
3684
  args.length = ary;
3731
3685
  }
3732
- var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func;
3686
+ if (this && this !== root && this instanceof wrapper) {
3687
+ fn = Ctor || createCtorWrapper(func);
3688
+ }
3733
3689
  return fn.apply(thisBinding, args);
3734
3690
  }
3735
3691
  return wrapper;
@@ -3803,10 +3759,10 @@
3803
3759
  */
3804
3760
  function createSortedIndex(retHighest) {
3805
3761
  return function(array, value, iteratee, thisArg) {
3806
- var func = getCallback(iteratee);
3807
- return (func === baseCallback && iteratee == null)
3762
+ var callback = getCallback(iteratee);
3763
+ return (iteratee == null && callback === baseCallback)
3808
3764
  ? binaryIndex(array, value, retHighest)
3809
- : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);
3765
+ : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);
3810
3766
  };
3811
3767
  }
3812
3768
 
@@ -3892,40 +3848,35 @@
3892
3848
  function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
3893
3849
  var index = -1,
3894
3850
  arrLength = array.length,
3895
- othLength = other.length,
3896
- result = true;
3851
+ othLength = other.length;
3897
3852
 
3898
3853
  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
3899
3854
  return false;
3900
3855
  }
3901
- // Deep compare the contents, ignoring non-numeric properties.
3902
- while (result && ++index < arrLength) {
3856
+ // Ignore non-index properties.
3857
+ while (++index < arrLength) {
3903
3858
  var arrValue = array[index],
3904
- othValue = other[index];
3905
-
3906
- result = undefined;
3907
- if (customizer) {
3908
- result = isLoose
3909
- ? customizer(othValue, arrValue, index)
3910
- : customizer(arrValue, othValue, index);
3911
- }
3912
- if (result === undefined) {
3913
- // Recursively compare arrays (susceptible to call stack limits).
3914
- if (isLoose) {
3915
- var othIndex = othLength;
3916
- while (othIndex--) {
3917
- othValue = other[othIndex];
3918
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3919
- if (result) {
3920
- break;
3921
- }
3922
- }
3923
- } else {
3924
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3859
+ othValue = other[index],
3860
+ result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
3861
+
3862
+ if (result !== undefined) {
3863
+ if (result) {
3864
+ continue;
3925
3865
  }
3866
+ return false;
3867
+ }
3868
+ // Recursively compare arrays (susceptible to call stack limits).
3869
+ if (isLoose) {
3870
+ if (!arraySome(other, function(othValue) {
3871
+ return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3872
+ })) {
3873
+ return false;
3874
+ }
3875
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
3876
+ return false;
3926
3877
  }
3927
3878
  }
3928
- return !!result;
3879
+ return true;
3929
3880
  }
3930
3881
 
3931
3882
  /**
@@ -3956,8 +3907,7 @@
3956
3907
  // Treat `NaN` vs. `NaN` as equal.
3957
3908
  return (object != +object)
3958
3909
  ? other != +other
3959
- // But, treat `-0` vs. `+0` as not equal.
3960
- : (object == 0 ? ((1 / object) == (1 / other)) : object == +other);
3910
+ : object == +other;
3961
3911
 
3962
3912
  case regexpTag:
3963
3913
  case stringTag:
@@ -3991,29 +3941,22 @@
3991
3941
  if (objLength != othLength && !isLoose) {
3992
3942
  return false;
3993
3943
  }
3994
- var skipCtor = isLoose,
3995
- index = -1;
3996
-
3944
+ var index = objLength;
3945
+ while (index--) {
3946
+ var key = objProps[index];
3947
+ if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
3948
+ return false;
3949
+ }
3950
+ }
3951
+ var skipCtor = isLoose;
3997
3952
  while (++index < objLength) {
3998
- var key = objProps[index],
3999
- result = isLoose ? key in other : hasOwnProperty.call(other, key);
3953
+ key = objProps[index];
3954
+ var objValue = object[key],
3955
+ othValue = other[key],
3956
+ result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
4000
3957
 
4001
- if (result) {
4002
- var objValue = object[key],
4003
- othValue = other[key];
4004
-
4005
- result = undefined;
4006
- if (customizer) {
4007
- result = isLoose
4008
- ? customizer(othValue, objValue, key)
4009
- : customizer(objValue, othValue, key);
4010
- }
4011
- if (result === undefined) {
4012
- // Recursively compare objects (susceptible to call stack limits).
4013
- result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
4014
- }
4015
- }
4016
- if (!result) {
3958
+ // Recursively compare objects (susceptible to call stack limits).
3959
+ if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
4017
3960
  return false;
4018
3961
  }
4019
3962
  skipCtor || (skipCtor = key == 'constructor');
@@ -4033,34 +3976,6 @@
4033
3976
  return true;
4034
3977
  }
4035
3978
 
4036
- /**
4037
- * Gets the extremum value of `collection` invoking `iteratee` for each value
4038
- * in `collection` to generate the criterion by which the value is ranked.
4039
- * The `iteratee` is invoked with three arguments: (value, index, collection).
4040
- *
4041
- * @private
4042
- * @param {Array|Object|string} collection The collection to iterate over.
4043
- * @param {Function} iteratee The function invoked per iteration.
4044
- * @param {boolean} [isMin] Specify returning the minimum, instead of the
4045
- * maximum, extremum value.
4046
- * @returns {*} Returns the extremum value.
4047
- */
4048
- function extremumBy(collection, iteratee, isMin) {
4049
- var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,
4050
- computed = exValue,
4051
- result = computed;
4052
-
4053
- baseEach(collection, function(value, index, collection) {
4054
- var current = iteratee(value, index, collection);
4055
- if ((isMin ? (current < computed) : (current > computed)) ||
4056
- (current === exValue && current === result)) {
4057
- computed = current;
4058
- result = value;
4059
- }
4060
- });
4061
- return result;
4062
- }
4063
-
4064
3979
  /**
4065
3980
  * Gets the appropriate "callback" function. If the `_.callback` method is
4066
3981
  * customized this function returns the custom method, otherwise it returns
@@ -4094,29 +4009,20 @@
4094
4009
  * @param {Function} func The function to query.
4095
4010
  * @returns {string} Returns the function name.
4096
4011
  */
4097
- var getFuncName = (function() {
4098
- if (!support.funcNames) {
4099
- return constant('');
4100
- }
4101
- if (constant.name == 'constant') {
4102
- return baseProperty('name');
4103
- }
4104
- return function(func) {
4105
- var result = func.name,
4106
- array = realNames[result],
4107
- length = array ? array.length : 0;
4012
+ function getFuncName(func) {
4013
+ var result = func.name,
4014
+ array = realNames[result],
4015
+ length = array ? array.length : 0;
4108
4016
 
4109
- while (length--) {
4110
- var data = array[length],
4111
- otherFunc = data.func;
4112
-
4113
- if (otherFunc == null || otherFunc == func) {
4114
- return data.name;
4115
- }
4017
+ while (length--) {
4018
+ var data = array[length],
4019
+ otherFunc = data.func;
4020
+ if (otherFunc == null || otherFunc == func) {
4021
+ return data.name;
4116
4022
  }
4117
- return result;
4118
- };
4119
- }());
4023
+ }
4024
+ return result;
4025
+ }
4120
4026
 
4121
4027
  /**
4122
4028
  * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
@@ -4137,7 +4043,7 @@
4137
4043
  * Gets the "length" property value of `object`.
4138
4044
  *
4139
4045
  * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
4140
- * in Safari on iOS 8.1 ARM64.
4046
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
4141
4047
  *
4142
4048
  * @private
4143
4049
  * @param {Object} object The object to query.
@@ -4146,15 +4052,34 @@
4146
4052
  var getLength = baseProperty('length');
4147
4053
 
4148
4054
  /**
4149
- * Creates an array of the own symbols of `object`.
4055
+ * Gets the propery names, values, and compare flags of `object`.
4150
4056
  *
4151
4057
  * @private
4152
4058
  * @param {Object} object The object to query.
4153
- * @returns {Array} Returns the array of symbols.
4059
+ * @returns {Array} Returns the match data of `object`.
4154
4060
  */
4155
- var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) {
4156
- return getOwnPropertySymbols(toObject(object));
4157
- };
4061
+ function getMatchData(object) {
4062
+ var result = pairs(object),
4063
+ length = result.length;
4064
+
4065
+ while (length--) {
4066
+ result[length][2] = isStrictComparable(result[length][1]);
4067
+ }
4068
+ return result;
4069
+ }
4070
+
4071
+ /**
4072
+ * Gets the native function at `key` of `object`.
4073
+ *
4074
+ * @private
4075
+ * @param {Object} object The object to query.
4076
+ * @param {string} key The key of the method to get.
4077
+ * @returns {*} Returns the function if it's native, else `undefined`.
4078
+ */
4079
+ function getNative(object, key) {
4080
+ var value = object == null ? undefined : object[key];
4081
+ return isNative(value) ? value : undefined;
4082
+ }
4158
4083
 
4159
4084
  /**
4160
4085
  * Gets the view, applying any `transforms` to the `start` and `end` positions.
@@ -4280,6 +4205,17 @@
4280
4205
  return func == null ? undefined : func.apply(object, args);
4281
4206
  }
4282
4207
 
4208
+ /**
4209
+ * Checks if `value` is array-like.
4210
+ *
4211
+ * @private
4212
+ * @param {*} value The value to check.
4213
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
4214
+ */
4215
+ function isArrayLike(value) {
4216
+ return value != null && isLength(getLength(value));
4217
+ }
4218
+
4283
4219
  /**
4284
4220
  * Checks if `value` is a valid array-like index.
4285
4221
  *
@@ -4289,7 +4225,7 @@
4289
4225
  * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
4290
4226
  */
4291
4227
  function isIndex(value, length) {
4292
- value = +value;
4228
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
4293
4229
  length = length == null ? MAX_SAFE_INTEGER : length;
4294
4230
  return value > -1 && value % 1 == 0 && value < length;
4295
4231
  }
@@ -4308,13 +4244,9 @@
4308
4244
  return false;
4309
4245
  }
4310
4246
  var type = typeof index;
4311
- if (type == 'number') {
4312
- var length = getLength(object),
4313
- prereq = isLength(length) && isIndex(index, length);
4314
- } else {
4315
- prereq = type == 'string' && index in object;
4316
- }
4317
- if (prereq) {
4247
+ if (type == 'number'
4248
+ ? (isArrayLike(object) && isIndex(index, object.length))
4249
+ : (type == 'string' && index in object)) {
4318
4250
  var other = object[index];
4319
4251
  return value === value ? (value === other) : (other !== other);
4320
4252
  }
@@ -4350,7 +4282,15 @@
4350
4282
  */
4351
4283
  function isLaziable(func) {
4352
4284
  var funcName = getFuncName(func);
4353
- return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;
4285
+ if (!(funcName in LazyWrapper.prototype)) {
4286
+ return false;
4287
+ }
4288
+ var other = lodash[funcName];
4289
+ if (func === other) {
4290
+ return true;
4291
+ }
4292
+ var data = getData(other);
4293
+ return !!data && func === data[0];
4354
4294
  }
4355
4295
 
4356
4296
  /**
@@ -4375,7 +4315,7 @@
4375
4315
  * equality comparisons, else `false`.
4376
4316
  */
4377
4317
  function isStrictComparable(value) {
4378
- return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));
4318
+ return value === value && !isObject(value);
4379
4319
  }
4380
4320
 
4381
4321
  /**
@@ -4449,7 +4389,7 @@
4449
4389
  }
4450
4390
 
4451
4391
  /**
4452
- * A specialized version of `_.pick` that picks `object` properties specified
4392
+ * A specialized version of `_.pick` which picks `object` properties specified
4453
4393
  * by `props`.
4454
4394
  *
4455
4395
  * @private
@@ -4474,7 +4414,7 @@
4474
4414
  }
4475
4415
 
4476
4416
  /**
4477
- * A specialized version of `_.pick` that picks `object` properties `predicate`
4417
+ * A specialized version of `_.pick` which picks `object` properties `predicate`
4478
4418
  * returns truthy for.
4479
4419
  *
4480
4420
  * @private
@@ -4598,12 +4538,10 @@
4598
4538
  function shimKeys(object) {
4599
4539
  var props = keysIn(object),
4600
4540
  propsLength = props.length,
4601
- length = propsLength && object.length,
4602
- support = lodash.support;
4541
+ length = propsLength && object.length;
4603
4542
 
4604
- var allowIndexes = length && isLength(length) &&
4605
- (isArray(object) || (support.nonEnumStrings && isString(object)) ||
4606
- (support.nonEnumArgs && isArguments(object)));
4543
+ var allowIndexes = !!length && isLength(length) &&
4544
+ (isArray(object) || isArguments(object) || isString(object));
4607
4545
 
4608
4546
  var index = -1,
4609
4547
  result = [];
@@ -4618,7 +4556,7 @@
4618
4556
  }
4619
4557
 
4620
4558
  /**
4621
- * Converts `value` to an array-like object if it is not one.
4559
+ * Converts `value` to an array-like object if it's not one.
4622
4560
  *
4623
4561
  * @private
4624
4562
  * @param {*} value The value to process.
@@ -4628,7 +4566,7 @@
4628
4566
  if (value == null) {
4629
4567
  return [];
4630
4568
  }
4631
- if (!isLength(getLength(value))) {
4569
+ if (!isArrayLike(value)) {
4632
4570
  return values(value);
4633
4571
  }
4634
4572
  if (lodash.support.unindexedChars && isString(value)) {
@@ -4638,7 +4576,7 @@
4638
4576
  }
4639
4577
 
4640
4578
  /**
4641
- * Converts `value` to an object if it is not one.
4579
+ * Converts `value` to an object if it's not one.
4642
4580
  *
4643
4581
  * @private
4644
4582
  * @param {*} value The value to process.
@@ -4659,7 +4597,7 @@
4659
4597
  }
4660
4598
 
4661
4599
  /**
4662
- * Converts `value` to property path array if it is not one.
4600
+ * Converts `value` to property path array if it's not one.
4663
4601
  *
4664
4602
  * @private
4665
4603
  * @param {*} value The value to process.
@@ -4758,12 +4696,9 @@
4758
4696
  }
4759
4697
 
4760
4698
  /**
4761
- * Creates an array excluding all values of the provided arrays using
4762
- * `SameValueZero` for equality comparisons.
4763
- *
4764
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
4765
- * comparisons are like strict equality comparisons, e.g. `===`, except that
4766
- * `NaN` matches `NaN`.
4699
+ * Creates an array of unique `array` values not included in the other
4700
+ * provided arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
4701
+ * for equality comparisons.
4767
4702
  *
4768
4703
  * @static
4769
4704
  * @memberOf _
@@ -4777,7 +4712,7 @@
4777
4712
  * // => [1, 3]
4778
4713
  */
4779
4714
  var difference = restParam(function(array, values) {
4780
- return (isArray(array) || isArguments(array))
4715
+ return isArrayLike(array)
4781
4716
  ? baseDifference(array, baseFlatten(values, false, true))
4782
4717
  : [];
4783
4718
  });
@@ -5172,13 +5107,10 @@
5172
5107
 
5173
5108
  /**
5174
5109
  * Gets the index at which the first occurrence of `value` is found in `array`
5175
- * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,
5176
- * it is used as the offset from the end of `array`. If `array` is sorted
5177
- * providing `true` for `fromIndex` performs a faster binary search.
5178
- *
5179
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5180
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5181
- * `NaN` matches `NaN`.
5110
+ * using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5111
+ * for equality comparisons. If `fromIndex` is negative, it is used as the offset
5112
+ * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
5113
+ * performs a faster binary search.
5182
5114
  *
5183
5115
  * @static
5184
5116
  * @memberOf _
@@ -5238,13 +5170,10 @@
5238
5170
  }
5239
5171
 
5240
5172
  /**
5241
- * Creates an array of unique values in all provided arrays using `SameValueZero`
5173
+ * Creates an array of unique values that are included in all of the provided
5174
+ * arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5242
5175
  * for equality comparisons.
5243
5176
  *
5244
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5245
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5246
- * `NaN` matches `NaN`.
5247
- *
5248
5177
  * @static
5249
5178
  * @memberOf _
5250
5179
  * @category Array
@@ -5254,27 +5183,19 @@
5254
5183
  * _.intersection([1, 2], [4, 2], [2, 1]);
5255
5184
  * // => [2]
5256
5185
  */
5257
- function intersection() {
5258
- var args = [],
5259
- argsIndex = -1,
5260
- argsLength = arguments.length,
5261
- caches = [],
5186
+ var intersection = restParam(function(arrays) {
5187
+ var othLength = arrays.length,
5188
+ othIndex = othLength,
5189
+ caches = Array(length),
5262
5190
  indexOf = getIndexOf(),
5263
5191
  isCommon = indexOf == baseIndexOf,
5264
5192
  result = [];
5265
5193
 
5266
- while (++argsIndex < argsLength) {
5267
- var value = arguments[argsIndex];
5268
- if (isArray(value) || isArguments(value)) {
5269
- args.push(value);
5270
- caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null);
5271
- }
5272
- }
5273
- argsLength = args.length;
5274
- if (argsLength < 2) {
5275
- return result;
5194
+ while (othIndex--) {
5195
+ var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
5196
+ caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
5276
5197
  }
5277
- var array = args[0],
5198
+ var array = arrays[0],
5278
5199
  index = -1,
5279
5200
  length = array ? array.length : 0,
5280
5201
  seen = caches[0];
@@ -5283,10 +5204,10 @@
5283
5204
  while (++index < length) {
5284
5205
  value = array[index];
5285
5206
  if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
5286
- argsIndex = argsLength;
5287
- while (--argsIndex) {
5288
- var cache = caches[argsIndex];
5289
- if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {
5207
+ var othIndex = othLength;
5208
+ while (--othIndex) {
5209
+ var cache = caches[othIndex];
5210
+ if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
5290
5211
  continue outer;
5291
5212
  }
5292
5213
  }
@@ -5297,7 +5218,7 @@
5297
5218
  }
5298
5219
  }
5299
5220
  return result;
5300
- }
5221
+ });
5301
5222
 
5302
5223
  /**
5303
5224
  * Gets the last element of `array`.
@@ -5370,14 +5291,11 @@
5370
5291
  }
5371
5292
 
5372
5293
  /**
5373
- * Removes all provided values from `array` using `SameValueZero` for equality
5374
- * comparisons.
5294
+ * Removes all provided values from `array` using
5295
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5296
+ * for equality comparisons.
5375
5297
  *
5376
- * **Notes:**
5377
- * - Unlike `_.without`, this method mutates `array`
5378
- * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5379
- * comparisons are like strict equality comparisons, e.g. `===`, except
5380
- * that `NaN` matches `NaN`
5298
+ * **Note:** Unlike `_.without`, this method mutates `array`.
5381
5299
  *
5382
5300
  * @static
5383
5301
  * @memberOf _
@@ -5441,7 +5359,6 @@
5441
5359
  * // => [10, 20]
5442
5360
  */
5443
5361
  var pullAt = restParam(function(array, indexes) {
5444
- array || (array = []);
5445
5362
  indexes = baseFlatten(indexes);
5446
5363
 
5447
5364
  var result = baseAt(array, indexes);
@@ -5807,12 +5724,9 @@
5807
5724
  }
5808
5725
 
5809
5726
  /**
5810
- * Creates an array of unique values, in order, of the provided arrays using
5811
- * `SameValueZero` for equality comparisons.
5812
- *
5813
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5814
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5815
- * `NaN` matches `NaN`.
5727
+ * Creates an array of unique values, in order, from all of the provided arrays
5728
+ * using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5729
+ * for equality comparisons.
5816
5730
  *
5817
5731
  * @static
5818
5732
  * @memberOf _
@@ -5829,8 +5743,9 @@
5829
5743
  });
5830
5744
 
5831
5745
  /**
5832
- * Creates a duplicate-free version of an array, using `SameValueZero` for
5833
- * equality comparisons, in which only the first occurence of each element
5746
+ * Creates a duplicate-free version of an array, using
5747
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5748
+ * for equality comparisons, in which only the first occurence of each element
5834
5749
  * is kept. Providing `true` for `isSorted` performs a faster search algorithm
5835
5750
  * for sorted arrays. If an iteratee function is provided it is invoked for
5836
5751
  * each element in the array to generate the criterion by which uniqueness
@@ -5848,10 +5763,6 @@
5848
5763
  * callback returns `true` for elements that have the properties of the given
5849
5764
  * object, else `false`.
5850
5765
  *
5851
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5852
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5853
- * `NaN` matches `NaN`.
5854
- *
5855
5766
  * @static
5856
5767
  * @memberOf _
5857
5768
  * @alias unique
@@ -5890,9 +5801,9 @@
5890
5801
  iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;
5891
5802
  isSorted = false;
5892
5803
  }
5893
- var func = getCallback();
5894
- if (!(func === baseCallback && iteratee == null)) {
5895
- iteratee = func(iteratee, thisArg, 3);
5804
+ var callback = getCallback();
5805
+ if (!(iteratee == null && callback === baseCallback)) {
5806
+ iteratee = callback(iteratee, thisArg, 3);
5896
5807
  }
5897
5808
  return (isSorted && getIndexOf() == baseIndexOf)
5898
5809
  ? sortedUniq(array, iteratee)
@@ -5901,7 +5812,7 @@
5901
5812
 
5902
5813
  /**
5903
5814
  * This method is like `_.zip` except that it accepts an array of grouped
5904
- * elements and creates an array regrouping the elements to their pre-`_.zip`
5815
+ * elements and creates an array regrouping the elements to their pre-zip
5905
5816
  * configuration.
5906
5817
  *
5907
5818
  * @static
@@ -5918,10 +5829,19 @@
5918
5829
  * // => [['fred', 'barney'], [30, 40], [true, false]]
5919
5830
  */
5920
5831
  function unzip(array) {
5832
+ if (!(array && array.length)) {
5833
+ return [];
5834
+ }
5921
5835
  var index = -1,
5922
- length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0,
5923
- result = Array(length);
5836
+ length = 0;
5924
5837
 
5838
+ array = arrayFilter(array, function(group) {
5839
+ if (isArrayLike(group)) {
5840
+ length = nativeMax(group.length, length);
5841
+ return true;
5842
+ }
5843
+ });
5844
+ var result = Array(length);
5925
5845
  while (++index < length) {
5926
5846
  result[index] = arrayMap(array, baseProperty(index));
5927
5847
  }
@@ -5929,12 +5849,44 @@
5929
5849
  }
5930
5850
 
5931
5851
  /**
5932
- * Creates an array excluding all provided values using `SameValueZero` for
5933
- * equality comparisons.
5852
+ * This method is like `_.unzip` except that it accepts an iteratee to specify
5853
+ * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
5854
+ * and invoked with four arguments: (accumulator, value, index, group).
5934
5855
  *
5935
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5936
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5937
- * `NaN` matches `NaN`.
5856
+ * @static
5857
+ * @memberOf _
5858
+ * @category Array
5859
+ * @param {Array} array The array of grouped elements to process.
5860
+ * @param {Function} [iteratee] The function to combine regrouped values.
5861
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
5862
+ * @returns {Array} Returns the new array of regrouped elements.
5863
+ * @example
5864
+ *
5865
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
5866
+ * // => [[1, 10, 100], [2, 20, 200]]
5867
+ *
5868
+ * _.unzipWith(zipped, _.add);
5869
+ * // => [3, 30, 300]
5870
+ */
5871
+ function unzipWith(array, iteratee, thisArg) {
5872
+ var length = array ? array.length : 0;
5873
+ if (!length) {
5874
+ return [];
5875
+ }
5876
+ var result = unzip(array);
5877
+ if (iteratee == null) {
5878
+ return result;
5879
+ }
5880
+ iteratee = bindCallback(iteratee, thisArg, 4);
5881
+ return arrayMap(result, function(group) {
5882
+ return arrayReduce(group, iteratee, undefined, true);
5883
+ });
5884
+ }
5885
+
5886
+ /**
5887
+ * Creates an array excluding all provided values using
5888
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5889
+ * for equality comparisons.
5938
5890
  *
5939
5891
  * @static
5940
5892
  * @memberOf _
@@ -5948,13 +5900,13 @@
5948
5900
  * // => [3]
5949
5901
  */
5950
5902
  var without = restParam(function(array, values) {
5951
- return (isArray(array) || isArguments(array))
5903
+ return isArrayLike(array)
5952
5904
  ? baseDifference(array, values)
5953
5905
  : [];
5954
5906
  });
5955
5907
 
5956
5908
  /**
5957
- * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
5909
+ * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
5958
5910
  * of the provided arrays.
5959
5911
  *
5960
5912
  * @static
@@ -5973,7 +5925,7 @@
5973
5925
 
5974
5926
  while (++index < length) {
5975
5927
  var array = arguments[index];
5976
- if (isArray(array) || isArguments(array)) {
5928
+ if (isArrayLike(array)) {
5977
5929
  var result = result
5978
5930
  ? baseDifference(result, array).concat(baseDifference(array, result))
5979
5931
  : array;
@@ -6039,6 +5991,38 @@
6039
5991
  return result;
6040
5992
  }
6041
5993
 
5994
+ /**
5995
+ * This method is like `_.zip` except that it accepts an iteratee to specify
5996
+ * how grouped values should be combined. The `iteratee` is bound to `thisArg`
5997
+ * and invoked with four arguments: (accumulator, value, index, group).
5998
+ *
5999
+ * @static
6000
+ * @memberOf _
6001
+ * @category Array
6002
+ * @param {...Array} [arrays] The arrays to process.
6003
+ * @param {Function} [iteratee] The function to combine grouped values.
6004
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
6005
+ * @returns {Array} Returns the new array of grouped elements.
6006
+ * @example
6007
+ *
6008
+ * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
6009
+ * // => [111, 222]
6010
+ */
6011
+ var zipWith = restParam(function(arrays) {
6012
+ var length = arrays.length,
6013
+ iteratee = length > 2 ? arrays[length - 2] : undefined,
6014
+ thisArg = length > 1 ? arrays[length - 1] : undefined;
6015
+
6016
+ if (length > 2 && typeof iteratee == 'function') {
6017
+ length -= 2;
6018
+ } else {
6019
+ iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
6020
+ thisArg = undefined;
6021
+ }
6022
+ arrays.length = length;
6023
+ return unzipWith(arrays, iteratee, thisArg);
6024
+ });
6025
+
6042
6026
  /*------------------------------------------------------------------------*/
6043
6027
 
6044
6028
  /**
@@ -6314,8 +6298,7 @@
6314
6298
  * // => ['barney', 'pebbles']
6315
6299
  */
6316
6300
  var at = restParam(function(collection, props) {
6317
- var length = collection ? getLength(collection) : 0;
6318
- if (isLength(length)) {
6301
+ if (isArrayLike(collection)) {
6319
6302
  collection = toIterable(collection);
6320
6303
  }
6321
6304
  return baseAt(collection, baseFlatten(props));
@@ -6690,13 +6673,10 @@
6690
6673
  });
6691
6674
 
6692
6675
  /**
6693
- * Checks if `value` is in `collection` using `SameValueZero` for equality
6694
- * comparisons. If `fromIndex` is negative, it is used as the offset from
6695
- * the end of `collection`.
6696
- *
6697
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6698
- * comparisons are like strict equality comparisons, e.g. `===`, except that
6699
- * `NaN` matches `NaN`.
6676
+ * Checks if `value` is in `collection` using
6677
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6678
+ * for equality comparisons. If `fromIndex` is negative, it is used as the offset
6679
+ * from the end of `collection`.
6700
6680
  *
6701
6681
  * @static
6702
6682
  * @memberOf _
@@ -6791,7 +6771,7 @@
6791
6771
  });
6792
6772
 
6793
6773
  /**
6794
- * Invokes the method at `path` on each element in `collection`, returning
6774
+ * Invokes the method at `path` of each element in `collection`, returning
6795
6775
  * an array of the results of each invoked method. Any additional arguments
6796
6776
  * are provided to each invoked method. If `methodName` is a function it is
6797
6777
  * invoked for, and `this` bound to, each element in `collection`.
@@ -6816,11 +6796,10 @@
6816
6796
  var index = -1,
6817
6797
  isFunc = typeof path == 'function',
6818
6798
  isProp = isKey(path),
6819
- length = getLength(collection),
6820
- result = isLength(length) ? Array(length) : [];
6799
+ result = isArrayLike(collection) ? Array(collection.length) : [];
6821
6800
 
6822
6801
  baseEach(collection, function(value) {
6823
- var func = isFunc ? path : (isProp && value != null && value[path]);
6802
+ var func = isFunc ? path : ((isProp && value != null) ? value[path] : null);
6824
6803
  result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
6825
6804
  });
6826
6805
  return result;
@@ -6842,14 +6821,15 @@
6842
6821
  * callback returns `true` for elements that have the properties of the given
6843
6822
  * object, else `false`.
6844
6823
  *
6845
- * Many lodash methods are guarded to work as interatees for methods like
6824
+ * Many lodash methods are guarded to work as iteratees for methods like
6846
6825
  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
6847
6826
  *
6848
6827
  * The guarded methods are:
6849
- * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,
6850
- * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,
6851
- * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,
6852
- * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`
6828
+ * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
6829
+ * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
6830
+ * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
6831
+ * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
6832
+ * `sum`, `uniq`, and `words`
6853
6833
  *
6854
6834
  * @static
6855
6835
  * @memberOf _
@@ -6985,7 +6965,7 @@
6985
6965
  * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
6986
6966
  * (accumulator, value, index|key, collection).
6987
6967
  *
6988
- * Many lodash methods are guarded to work as interatees for methods like
6968
+ * Many lodash methods are guarded to work as iteratees for methods like
6989
6969
  * `_.reduce`, `_.reduceRight`, and `_.transform`.
6990
6970
  *
6991
6971
  * The guarded methods are:
@@ -7037,23 +7017,12 @@
7037
7017
  * }, []);
7038
7018
  * // => [4, 5, 2, 3, 0, 1]
7039
7019
  */
7040
- var reduceRight = createReduce(arrayReduceRight, baseEachRight);
7020
+ var reduceRight = createReduce(arrayReduceRight, baseEachRight);
7041
7021
 
7042
7022
  /**
7043
7023
  * The opposite of `_.filter`; this method returns the elements of `collection`
7044
7024
  * that `predicate` does **not** return truthy for.
7045
7025
  *
7046
- * If a property name is provided for `predicate` the created `_.property`
7047
- * style callback returns the property value of the given element.
7048
- *
7049
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
7050
- * style callback returns `true` for elements that have a matching property
7051
- * value, else `false`.
7052
- *
7053
- * If an object is provided for `predicate` the created `_.matches` style
7054
- * callback returns `true` for elements that have the properties of the given
7055
- * object, else `false`.
7056
- *
7057
7026
  * @static
7058
7027
  * @memberOf _
7059
7028
  * @category Collection
@@ -7118,8 +7087,20 @@
7118
7087
  var length = collection.length;
7119
7088
  return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
7120
7089
  }
7121
- var result = shuffle(collection);
7122
- result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length);
7090
+ var index = -1,
7091
+ result = toArray(collection),
7092
+ length = result.length,
7093
+ lastIndex = length - 1;
7094
+
7095
+ n = nativeMin(n < 0 ? 0 : (+n || 0), length);
7096
+ while (++index < n) {
7097
+ var rand = baseRandom(index, lastIndex),
7098
+ value = result[rand];
7099
+
7100
+ result[rand] = result[index];
7101
+ result[index] = value;
7102
+ }
7103
+ result.length = n;
7123
7104
  return result;
7124
7105
  }
7125
7106
 
@@ -7138,20 +7119,7 @@
7138
7119
  * // => [4, 1, 3, 2]
7139
7120
  */
7140
7121
  function shuffle(collection) {
7141
- collection = toIterable(collection);
7142
-
7143
- var index = -1,
7144
- length = collection.length,
7145
- result = Array(length);
7146
-
7147
- while (++index < length) {
7148
- var rand = baseRandom(0, index);
7149
- if (index != rand) {
7150
- result[index] = result[rand];
7151
- }
7152
- result[rand] = collection[index];
7153
- }
7154
- return result;
7122
+ return sample(collection, POSITIVE_INFINITY);
7155
7123
  }
7156
7124
 
7157
7125
  /**
@@ -7777,12 +7745,13 @@
7777
7745
  var curryRight = createCurry(CURRY_RIGHT_FLAG);
7778
7746
 
7779
7747
  /**
7780
- * Creates a function that delays invoking `func` until after `wait` milliseconds
7781
- * have elapsed since the last time it was invoked. The created function comes
7782
- * with a `cancel` method to cancel delayed invocations. Provide an options
7783
- * object to indicate that `func` should be invoked on the leading and/or
7784
- * trailing edge of the `wait` timeout. Subsequent calls to the debounced
7785
- * function return the result of the last `func` invocation.
7748
+ * Creates a debounced function that delays invoking `func` until after `wait`
7749
+ * milliseconds have elapsed since the last time the debounced function was
7750
+ * invoked. The debounced function comes with a `cancel` method to cancel
7751
+ * delayed invocations. Provide an options object to indicate that `func`
7752
+ * should be invoked on the leading and/or trailing edge of the `wait` timeout.
7753
+ * Subsequent calls to the debounced function return the result of the last
7754
+ * `func` invocation.
7786
7755
  *
7787
7756
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
7788
7757
  * on the trailing edge of the timeout only if the the debounced function is
@@ -8096,14 +8065,14 @@
8096
8065
  }
8097
8066
  var memoized = function() {
8098
8067
  var args = arguments,
8099
- cache = memoized.cache,
8100
- key = resolver ? resolver.apply(this, args) : args[0];
8068
+ key = resolver ? resolver.apply(this, args) : args[0],
8069
+ cache = memoized.cache;
8101
8070
 
8102
8071
  if (cache.has(key)) {
8103
8072
  return cache.get(key);
8104
8073
  }
8105
8074
  var result = func.apply(this, args);
8106
- cache.set(key, result);
8075
+ memoized.cache = cache.set(key, result);
8107
8076
  return result;
8108
8077
  };
8109
8078
  memoized.cache = new memoize.Cache;
@@ -8350,12 +8319,12 @@
8350
8319
  }
8351
8320
 
8352
8321
  /**
8353
- * Creates a function that only invokes `func` at most once per every `wait`
8354
- * milliseconds. The created function comes with a `cancel` method to cancel
8355
- * delayed invocations. Provide an options object to indicate that `func`
8356
- * should be invoked on the leading and/or trailing edge of the `wait` timeout.
8357
- * Subsequent calls to the throttled function return the result of the last
8358
- * `func` call.
8322
+ * Creates a throttled function that only invokes `func` at most once per
8323
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
8324
+ * method to cancel delayed invocations. Provide an options object to indicate
8325
+ * that `func` should be invoked on the leading and/or trailing edge of the
8326
+ * `wait` timeout. Subsequent calls to the throttled function return the
8327
+ * result of the last `func` call.
8359
8328
  *
8360
8329
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
8361
8330
  * on the trailing edge of the timeout only if the the throttled function is
@@ -8495,8 +8464,9 @@
8495
8464
  customizer = isDeep;
8496
8465
  isDeep = false;
8497
8466
  }
8498
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
8499
- return baseClone(value, isDeep, customizer);
8467
+ return typeof customizer == 'function'
8468
+ ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))
8469
+ : baseClone(value, isDeep);
8500
8470
  }
8501
8471
 
8502
8472
  /**
@@ -8545,8 +8515,57 @@
8545
8515
  * // => 20
8546
8516
  */
8547
8517
  function cloneDeep(value, customizer, thisArg) {
8548
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
8549
- return baseClone(value, true, customizer);
8518
+ return typeof customizer == 'function'
8519
+ ? baseClone(value, true, bindCallback(customizer, thisArg, 1))
8520
+ : baseClone(value, true);
8521
+ }
8522
+
8523
+ /**
8524
+ * Checks if `value` is greater than `other`.
8525
+ *
8526
+ * @static
8527
+ * @memberOf _
8528
+ * @category Lang
8529
+ * @param {*} value The value to compare.
8530
+ * @param {*} other The other value to compare.
8531
+ * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
8532
+ * @example
8533
+ *
8534
+ * _.gt(3, 1);
8535
+ * // => true
8536
+ *
8537
+ * _.gt(3, 3);
8538
+ * // => false
8539
+ *
8540
+ * _.gt(1, 3);
8541
+ * // => false
8542
+ */
8543
+ function gt(value, other) {
8544
+ return value > other;
8545
+ }
8546
+
8547
+ /**
8548
+ * Checks if `value` is greater than or equal to `other`.
8549
+ *
8550
+ * @static
8551
+ * @memberOf _
8552
+ * @category Lang
8553
+ * @param {*} value The value to compare.
8554
+ * @param {*} other The other value to compare.
8555
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
8556
+ * @example
8557
+ *
8558
+ * _.gte(3, 1);
8559
+ * // => true
8560
+ *
8561
+ * _.gte(3, 3);
8562
+ * // => true
8563
+ *
8564
+ * _.gte(1, 3);
8565
+ * // => false
8566
+ */
8567
+ function gte(value, other) {
8568
+ return value >= other;
8550
8569
  }
8551
8570
 
8552
8571
  /**
@@ -8566,15 +8585,13 @@
8566
8585
  * // => false
8567
8586
  */
8568
8587
  function isArguments(value) {
8569
- var length = isObjectLike(value) ? value.length : undefined;
8570
- return isLength(length) && objToString.call(value) == argsTag;
8588
+ return isObjectLike(value) && isArrayLike(value) && objToString.call(value) == argsTag;
8571
8589
  }
8572
8590
  // Fallback for environments without a `toStringTag` for `arguments` objects.
8573
8591
  if (!support.argsTag) {
8574
8592
  isArguments = function(value) {
8575
- var length = isObjectLike(value) ? value.length : undefined;
8576
- return isLength(length) && hasOwnProperty.call(value, 'callee') &&
8577
- !propertyIsEnumerable.call(value, 'callee');
8593
+ return isObjectLike(value) && isArrayLike(value) &&
8594
+ hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
8578
8595
  };
8579
8596
  }
8580
8597
 
@@ -8696,10 +8713,9 @@
8696
8713
  if (value == null) {
8697
8714
  return true;
8698
8715
  }
8699
- var length = getLength(value);
8700
- if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
8716
+ if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
8701
8717
  (isObjectLike(value) && isFunction(value.splice)))) {
8702
- return !length;
8718
+ return !value.length;
8703
8719
  }
8704
8720
  return !keys(value).length;
8705
8721
  }
@@ -8719,6 +8735,7 @@
8719
8735
  *
8720
8736
  * @static
8721
8737
  * @memberOf _
8738
+ * @alias eq
8722
8739
  * @category Lang
8723
8740
  * @param {*} value The value to compare.
8724
8741
  * @param {*} other The other value to compare.
@@ -8748,12 +8765,9 @@
8748
8765
  * // => true
8749
8766
  */
8750
8767
  function isEqual(value, other, customizer, thisArg) {
8751
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
8752
- if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {
8753
- return value === other;
8754
- }
8768
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
8755
8769
  var result = customizer ? customizer(value, other) : undefined;
8756
- return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
8770
+ return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
8757
8771
  }
8758
8772
 
8759
8773
  /**
@@ -8855,7 +8869,7 @@
8855
8869
  // Avoid a V8 JIT bug in Chrome 19-20.
8856
8870
  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
8857
8871
  var type = typeof value;
8858
- return type == 'function' || (!!value && type == 'object');
8872
+ return !!value && (type == 'object' || type == 'function');
8859
8873
  }
8860
8874
 
8861
8875
  /**
@@ -8898,33 +8912,8 @@
8898
8912
  * // => true
8899
8913
  */
8900
8914
  function isMatch(object, source, customizer, thisArg) {
8901
- var props = keys(source),
8902
- length = props.length;
8903
-
8904
- if (!length) {
8905
- return true;
8906
- }
8907
- if (object == null) {
8908
- return false;
8909
- }
8910
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
8911
- object = toObject(object);
8912
- if (!customizer && length == 1) {
8913
- var key = props[0],
8914
- value = source[key];
8915
-
8916
- if (isStrictComparable(value)) {
8917
- return value === object[key] && (value !== undefined || (key in object));
8918
- }
8919
- }
8920
- var values = Array(length),
8921
- strictCompareFlags = Array(length);
8922
-
8923
- while (length--) {
8924
- value = values[length] = source[props[length]];
8925
- strictCompareFlags[length] = isStrictComparable(value);
8926
- }
8927
- return baseIsMatch(object, props, values, strictCompareFlags, customizer);
8915
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
8916
+ return baseIsMatch(object, getMatchData(source), customizer);
8928
8917
  }
8929
8918
 
8930
8919
  /**
@@ -9064,8 +9053,8 @@
9064
9053
  if (!(value && objToString.call(value) == objectTag) || (!lodash.support.argsTag && isArguments(value))) {
9065
9054
  return false;
9066
9055
  }
9067
- var valueOf = value.valueOf,
9068
- objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
9056
+ var valueOf = getNative(value, 'valueOf'),
9057
+ objProto = valueOf && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
9069
9058
 
9070
9059
  return objProto
9071
9060
  ? (value == objProto || getPrototypeOf(value) == objProto)
@@ -9152,6 +9141,54 @@
9152
9141
  return value === undefined;
9153
9142
  }
9154
9143
 
9144
+ /**
9145
+ * Checks if `value` is less than `other`.
9146
+ *
9147
+ * @static
9148
+ * @memberOf _
9149
+ * @category Lang
9150
+ * @param {*} value The value to compare.
9151
+ * @param {*} other The other value to compare.
9152
+ * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
9153
+ * @example
9154
+ *
9155
+ * _.lt(1, 3);
9156
+ * // => true
9157
+ *
9158
+ * _.lt(3, 3);
9159
+ * // => false
9160
+ *
9161
+ * _.lt(3, 1);
9162
+ * // => false
9163
+ */
9164
+ function lt(value, other) {
9165
+ return value < other;
9166
+ }
9167
+
9168
+ /**
9169
+ * Checks if `value` is less than or equal to `other`.
9170
+ *
9171
+ * @static
9172
+ * @memberOf _
9173
+ * @category Lang
9174
+ * @param {*} value The value to compare.
9175
+ * @param {*} other The other value to compare.
9176
+ * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
9177
+ * @example
9178
+ *
9179
+ * _.lte(1, 3);
9180
+ * // => true
9181
+ *
9182
+ * _.lte(3, 3);
9183
+ * // => true
9184
+ *
9185
+ * _.lte(3, 1);
9186
+ * // => false
9187
+ */
9188
+ function lte(value, other) {
9189
+ return value <= other;
9190
+ }
9191
+
9155
9192
  /**
9156
9193
  * Converts `value` to an array.
9157
9194
  *
@@ -9219,7 +9256,6 @@
9219
9256
  * **Note:** This method mutates `object` and is based on
9220
9257
  * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).
9221
9258
  *
9222
- *
9223
9259
  * @static
9224
9260
  * @memberOf _
9225
9261
  * @alias extend
@@ -9549,7 +9585,7 @@
9549
9585
  }
9550
9586
 
9551
9587
  /**
9552
- * Gets the property value of `path` on `object`. If the resolved value is
9588
+ * Gets the property value at `path` of `object`. If the resolved value is
9553
9589
  * `undefined` the `defaultValue` is used in its place.
9554
9590
  *
9555
9591
  * @static
@@ -9607,10 +9643,14 @@
9607
9643
  if (!result && !isKey(path)) {
9608
9644
  path = toPath(path);
9609
9645
  object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
9646
+ if (object == null) {
9647
+ return false;
9648
+ }
9610
9649
  path = last(path);
9611
- result = object != null && hasOwnProperty.call(object, path);
9650
+ result = hasOwnProperty.call(object, path);
9612
9651
  }
9613
- return result || (lodash.support.nonEnumStrings && isString(object) && isIndex(path, object.length));
9652
+ return result || (isLength(object.length) && isIndex(path, object.length) &&
9653
+ (isArray(object) || isArguments(object) || isString(object)));
9614
9654
  }
9615
9655
 
9616
9656
  /**
@@ -9691,12 +9731,9 @@
9691
9731
  * // => ['0', '1']
9692
9732
  */
9693
9733
  var keys = !nativeKeys ? shimKeys : function(object) {
9694
- if (object) {
9695
- var Ctor = object.constructor,
9696
- length = object.length;
9697
- }
9734
+ var Ctor = object == null ? null : object.constructor;
9698
9735
  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
9699
- (typeof object == 'function' ? lodash.support.enumPrototypes : isLength(length))) {
9736
+ (typeof object == 'function' ? lodash.support.enumPrototypes : isArrayLike(object))) {
9700
9737
  return shimKeys(object);
9701
9738
  }
9702
9739
  return isObject(object) ? nativeKeys(object) : [];
@@ -9735,8 +9772,7 @@
9735
9772
  support = lodash.support;
9736
9773
 
9737
9774
  length = (length && isLength(length) &&
9738
- (isArray(object) || (support.nonEnumStrings && isString(object)) ||
9739
- (support.nonEnumArgs && isArguments(object))) && length) || 0;
9775
+ (isArray(object) || isArguments(object) || isString(object)) && length) || 0;
9740
9776
 
9741
9777
  var Ctor = object.constructor,
9742
9778
  index = -1,
@@ -9782,6 +9818,28 @@
9782
9818
  return result;
9783
9819
  }
9784
9820
 
9821
+ /**
9822
+ * The opposite of `_.mapValues`; this method creates an object with the
9823
+ * same values as `object` and keys generated by running each own enumerable
9824
+ * property of `object` through `iteratee`.
9825
+ *
9826
+ * @static
9827
+ * @memberOf _
9828
+ * @category Object
9829
+ * @param {Object} object The object to iterate over.
9830
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
9831
+ * per iteration.
9832
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
9833
+ * @returns {Object} Returns the new mapped object.
9834
+ * @example
9835
+ *
9836
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
9837
+ * return key + value;
9838
+ * });
9839
+ * // => { 'a1': 1, 'b2': 2 }
9840
+ */
9841
+ var mapKeys = createObjectMapper(true);
9842
+
9785
9843
  /**
9786
9844
  * Creates an object with the same keys as `object` and values generated by
9787
9845
  * running each own enumerable property of `object` through `iteratee`. The
@@ -9823,15 +9881,7 @@
9823
9881
  * _.mapValues(users, 'age');
9824
9882
  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
9825
9883
  */
9826
- function mapValues(object, iteratee, thisArg) {
9827
- var result = {};
9828
- iteratee = getCallback(iteratee, thisArg, 3);
9829
-
9830
- baseForOwn(object, function(value, key, object) {
9831
- result[key] = iteratee(value, key, object);
9832
- });
9833
- return result;
9834
- }
9884
+ var mapValues = createObjectMapper();
9835
9885
 
9836
9886
  /**
9837
9887
  * Recursively merges own enumerable properties of the source object(s), that
@@ -9886,11 +9936,6 @@
9886
9936
  /**
9887
9937
  * The opposite of `_.pick`; this method creates an object composed of the
9888
9938
  * own and inherited enumerable properties of `object` that are not omitted.
9889
- * Property names may be specified as individual arguments or as arrays of
9890
- * property names. If `predicate` is provided it is invoked for each property
9891
- * of `object` omitting the properties `predicate` returns truthy for. The
9892
- * predicate is bound to `thisArg` and invoked with three arguments:
9893
- * (value, key, object).
9894
9939
  *
9895
9940
  * @static
9896
9941
  * @memberOf _
@@ -9940,6 +9985,8 @@
9940
9985
  * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
9941
9986
  */
9942
9987
  function pairs(object) {
9988
+ object = toObject(object);
9989
+
9943
9990
  var index = -1,
9944
9991
  props = keys(object),
9945
9992
  length = props.length,
@@ -10060,13 +10107,13 @@
10060
10107
 
10061
10108
  var index = -1,
10062
10109
  length = path.length,
10063
- endIndex = length - 1,
10110
+ lastIndex = length - 1,
10064
10111
  nested = object;
10065
10112
 
10066
10113
  while (nested != null && ++index < length) {
10067
10114
  var key = path[index];
10068
10115
  if (isObject(nested)) {
10069
- if (index == endIndex) {
10116
+ if (index == lastIndex) {
10070
10117
  nested[key] = value;
10071
10118
  } else if (nested[key] == null) {
10072
10119
  nested[key] = isIndex(path[index + 1]) ? [] : {};
@@ -10116,7 +10163,7 @@
10116
10163
  if (isArr) {
10117
10164
  accumulator = isArray(object) ? new Ctor : [];
10118
10165
  } else {
10119
- accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype);
10166
+ accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : null);
10120
10167
  }
10121
10168
  } else {
10122
10169
  accumulator = {};
@@ -10395,7 +10442,7 @@
10395
10442
  * use a third-party library like [_he_](https://mths.be/he).
10396
10443
  *
10397
10444
  * Though the ">" character is escaped for symmetry, characters like
10398
- * ">" and "/" don't require escaping in HTML and have no special meaning
10445
+ * ">" and "/" don't need escaping in HTML and have no special meaning
10399
10446
  * unless they're part of a tag or unquoted attribute value.
10400
10447
  * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
10401
10448
  * (under "semi-related fun fact") for more details.
@@ -10472,7 +10519,7 @@
10472
10519
  });
10473
10520
 
10474
10521
  /**
10475
- * Pads `string` on the left and right sides if it is shorter than `length`.
10522
+ * Pads `string` on the left and right sides if it's shorter than `length`.
10476
10523
  * Padding characters are truncated if they can't be evenly divided by `length`.
10477
10524
  *
10478
10525
  * @static
@@ -10510,7 +10557,7 @@
10510
10557
  }
10511
10558
 
10512
10559
  /**
10513
- * Pads `string` on the left side if it is shorter than `length`. Padding
10560
+ * Pads `string` on the left side if it's shorter than `length`. Padding
10514
10561
  * characters are truncated if they exceed `length`.
10515
10562
  *
10516
10563
  * @static
@@ -10534,7 +10581,7 @@
10534
10581
  var padLeft = createPadDir();
10535
10582
 
10536
10583
  /**
10537
- * Pads `string` on the right side if it is shorter than `length`. Padding
10584
+ * Pads `string` on the right side if it's shorter than `length`. Padding
10538
10585
  * characters are truncated if they exceed `length`.
10539
10586
  *
10540
10587
  * @static
@@ -11015,7 +11062,7 @@
11015
11062
  }
11016
11063
 
11017
11064
  /**
11018
- * Truncates `string` if it is longer than the given maximum string length.
11065
+ * Truncates `string` if it's longer than the given maximum string length.
11019
11066
  * The last characters of the truncated string are replaced with the omission
11020
11067
  * string which defaults to "...".
11021
11068
  *
@@ -11229,7 +11276,9 @@
11229
11276
  if (guard && isIterateeCall(func, thisArg, guard)) {
11230
11277
  thisArg = null;
11231
11278
  }
11232
- return baseCallback(func, thisArg);
11279
+ return isObjectLike(func)
11280
+ ? matches(func)
11281
+ : baseCallback(func, thisArg);
11233
11282
  }
11234
11283
 
11235
11284
  /**
@@ -11274,7 +11323,7 @@
11274
11323
  }
11275
11324
 
11276
11325
  /**
11277
- * Creates a function which performs a deep comparison between a given object
11326
+ * Creates a function that performs a deep comparison between a given object
11278
11327
  * and `source`, returning `true` if the given object has equivalent property
11279
11328
  * values, else `false`.
11280
11329
  *
@@ -11303,7 +11352,7 @@
11303
11352
  }
11304
11353
 
11305
11354
  /**
11306
- * Creates a function which compares the property value of `path` on a given
11355
+ * Creates a function that compares the property value of `path` on a given
11307
11356
  * object to `value`.
11308
11357
  *
11309
11358
  * **Note:** This method supports comparing arrays, booleans, `Date` objects,
@@ -11314,7 +11363,7 @@
11314
11363
  * @memberOf _
11315
11364
  * @category Utility
11316
11365
  * @param {Array|string} path The path of the property to get.
11317
- * @param {*} value The value to compare.
11366
+ * @param {*} srcValue The value to match.
11318
11367
  * @returns {Function} Returns the new function.
11319
11368
  * @example
11320
11369
  *
@@ -11326,17 +11375,19 @@
11326
11375
  * _.find(users, _.matchesProperty('user', 'fred'));
11327
11376
  * // => { 'user': 'fred' }
11328
11377
  */
11329
- function matchesProperty(path, value) {
11330
- return baseMatchesProperty(path, baseClone(value, true));
11378
+ function matchesProperty(path, srcValue) {
11379
+ return baseMatchesProperty(path, baseClone(srcValue, true));
11331
11380
  }
11332
11381
 
11333
11382
  /**
11334
- * Creates a function which invokes the method at `path` on a given object.
11383
+ * Creates a function that invokes the method at `path` on a given object.
11384
+ * Any additional arguments are provided to the invoked method.
11335
11385
  *
11336
11386
  * @static
11337
11387
  * @memberOf _
11338
11388
  * @category Utility
11339
11389
  * @param {Array|string} path The path of the method to invoke.
11390
+ * @param {...*} [args] The arguments to invoke the method with.
11340
11391
  * @returns {Function} Returns the new function.
11341
11392
  * @example
11342
11393
  *
@@ -11354,17 +11405,19 @@
11354
11405
  var method = restParam(function(path, args) {
11355
11406
  return function(object) {
11356
11407
  return invokePath(object, path, args);
11357
- }
11408
+ };
11358
11409
  });
11359
11410
 
11360
11411
  /**
11361
- * The opposite of `_.method`; this method creates a function which invokes
11362
- * the method at a given path on `object`.
11412
+ * The opposite of `_.method`; this method creates a function that invokes
11413
+ * the method at a given path on `object`. Any additional arguments are
11414
+ * provided to the invoked method.
11363
11415
  *
11364
11416
  * @static
11365
11417
  * @memberOf _
11366
11418
  * @category Utility
11367
11419
  * @param {Object} object The object to query.
11420
+ * @param {...*} [args] The arguments to invoke the method with.
11368
11421
  * @returns {Function} Returns the new function.
11369
11422
  * @example
11370
11423
  *
@@ -11408,9 +11461,6 @@
11408
11461
  * });
11409
11462
  * }
11410
11463
  *
11411
- * // use `_.runInContext` to avoid conflicts (esp. in Node.js)
11412
- * var _ = require('lodash').runInContext();
11413
- *
11414
11464
  * _.mixin({ 'vowels': vowels });
11415
11465
  * _.vowels('fred');
11416
11466
  * // => ['e']
@@ -11425,8 +11475,8 @@
11425
11475
  function mixin(object, source, options) {
11426
11476
  if (options == null) {
11427
11477
  var isObj = isObject(source),
11428
- props = isObj && keys(source),
11429
- methodNames = props && props.length && baseFunctions(source, props);
11478
+ props = isObj ? keys(source) : null,
11479
+ methodNames = (props && props.length) ? baseFunctions(source, props) : null;
11430
11480
 
11431
11481
  if (!(methodNames ? methodNames.length : isObj)) {
11432
11482
  methodNames = false;
@@ -11493,7 +11543,7 @@
11493
11543
  }
11494
11544
 
11495
11545
  /**
11496
- * A no-operation function which returns `undefined` regardless of the
11546
+ * A no-operation function that returns `undefined` regardless of the
11497
11547
  * arguments it receives.
11498
11548
  *
11499
11549
  * @static
@@ -11511,7 +11561,7 @@
11511
11561
  }
11512
11562
 
11513
11563
  /**
11514
- * Creates a function which returns the property value at `path` on a
11564
+ * Creates a function that returns the property value at `path` on a
11515
11565
  * given object.
11516
11566
  *
11517
11567
  * @static
@@ -11537,7 +11587,7 @@
11537
11587
  }
11538
11588
 
11539
11589
  /**
11540
- * The opposite of `_.property`; this method creates a function which returns
11590
+ * The opposite of `_.property`; this method creates a function that returns
11541
11591
  * the property value at a given path on `object`.
11542
11592
  *
11543
11593
  * @static
@@ -11758,7 +11808,7 @@
11758
11808
  * _.max(users, 'age');
11759
11809
  * // => { 'user': 'fred', 'age': 40 }
11760
11810
  */
11761
- var max = createExtremum(arrayMax);
11811
+ var max = createExtremum(gt, NEGATIVE_INFINITY);
11762
11812
 
11763
11813
  /**
11764
11814
  * Gets the minimum value of `collection`. If `collection` is empty or falsey
@@ -11807,7 +11857,7 @@
11807
11857
  * _.min(users, 'age');
11808
11858
  * // => { 'user': 'barney', 'age': 36 }
11809
11859
  */
11810
- var min = createExtremum(arrayMin, true);
11860
+ var min = createExtremum(lt, POSITIVE_INFINITY);
11811
11861
 
11812
11862
  /**
11813
11863
  * Gets the sum of the values in `collection`.
@@ -11845,12 +11895,12 @@
11845
11895
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
11846
11896
  iteratee = null;
11847
11897
  }
11848
- var func = getCallback(),
11898
+ var callback = getCallback(),
11849
11899
  noIteratee = iteratee == null;
11850
11900
 
11851
- if (!(func === baseCallback && noIteratee)) {
11901
+ if (!(noIteratee && callback === baseCallback)) {
11852
11902
  noIteratee = false;
11853
- iteratee = func(iteratee, thisArg, 3);
11903
+ iteratee = callback(iteratee, thisArg, 3);
11854
11904
  }
11855
11905
  return noIteratee
11856
11906
  ? arraySum(isArray(collection) ? collection : toIterable(collection))
@@ -11929,6 +11979,7 @@
11929
11979
  lodash.keys = keys;
11930
11980
  lodash.keysIn = keysIn;
11931
11981
  lodash.map = map;
11982
+ lodash.mapKeys = mapKeys;
11932
11983
  lodash.mapValues = mapValues;
11933
11984
  lodash.matches = matches;
11934
11985
  lodash.matchesProperty = matchesProperty;
@@ -11977,6 +12028,7 @@
11977
12028
  lodash.union = union;
11978
12029
  lodash.uniq = uniq;
11979
12030
  lodash.unzip = unzip;
12031
+ lodash.unzipWith = unzipWith;
11980
12032
  lodash.values = values;
11981
12033
  lodash.valuesIn = valuesIn;
11982
12034
  lodash.where = where;
@@ -11985,6 +12037,7 @@
11985
12037
  lodash.xor = xor;
11986
12038
  lodash.zip = zip;
11987
12039
  lodash.zipObject = zipObject;
12040
+ lodash.zipWith = zipWith;
11988
12041
 
11989
12042
  // Add aliases.
11990
12043
  lodash.backflow = flowRight;
@@ -12026,6 +12079,8 @@
12026
12079
  lodash.findWhere = findWhere;
12027
12080
  lodash.first = first;
12028
12081
  lodash.get = get;
12082
+ lodash.gt = gt;
12083
+ lodash.gte = gte;
12029
12084
  lodash.has = has;
12030
12085
  lodash.identity = identity;
12031
12086
  lodash.includes = includes;
@@ -12055,6 +12110,8 @@
12055
12110
  lodash.kebabCase = kebabCase;
12056
12111
  lodash.last = last;
12057
12112
  lodash.lastIndexOf = lastIndexOf;
12113
+ lodash.lt = lt;
12114
+ lodash.lte = lte;
12058
12115
  lodash.max = max;
12059
12116
  lodash.min = min;
12060
12117
  lodash.noConflict = noConflict;
@@ -12091,6 +12148,7 @@
12091
12148
  lodash.all = every;
12092
12149
  lodash.any = some;
12093
12150
  lodash.contains = includes;
12151
+ lodash.eq = isEqual;
12094
12152
  lodash.detect = find;
12095
12153
  lodash.foldl = reduce;
12096
12154
  lodash.foldr = reduceRight;
@@ -12234,8 +12292,13 @@
12234
12292
 
12235
12293
  LazyWrapper.prototype.slice = function(start, end) {
12236
12294
  start = start == null ? 0 : (+start || 0);
12237
- var result = start < 0 ? this.takeRight(-start) : this.drop(start);
12238
12295
 
12296
+ var result = this;
12297
+ if (start < 0) {
12298
+ result = this.takeRight(-start);
12299
+ } else if (start) {
12300
+ result = this.drop(start);
12301
+ }
12239
12302
  if (end !== undefined) {
12240
12303
  end = (+end || 0);
12241
12304
  result = end < 0 ? result.dropRight(-end) : result.take(end - start);
@@ -12258,7 +12321,6 @@
12258
12321
 
12259
12322
  lodash.prototype[methodName] = function() {
12260
12323
  var args = arguments,
12261
- length = args.length,
12262
12324
  chainAll = this.__chain__,
12263
12325
  value = this.__wrapped__,
12264
12326
  isHybrid = !!this.__actions__.length,
@@ -12303,7 +12365,7 @@
12303
12365
  retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
12304
12366
 
12305
12367
  // Avoid array-like object bugs with `Array#shift` and `Array#splice` in
12306
- // IE < 9, Firefox < 10, Narwhal, and RingoJS.
12368
+ // IE < 9, Firefox < 10, and RingoJS.
12307
12369
  var func = !fixObjects ? protoFunc : function() {
12308
12370
  var result = protoFunc.apply(this, arguments);
12309
12371
  if (this.length === 0) {
@@ -12383,7 +12445,7 @@
12383
12445
  if (moduleExports) {
12384
12446
  (freeModule.exports = _)._ = _;
12385
12447
  }
12386
- // Export for Narwhal or Rhino -require.
12448
+ // Export for Rhino with CommonJS support.
12387
12449
  else {
12388
12450
  freeExports._ = _;
12389
12451
  }