scrivito_sdk 0.42.1 → 0.50.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f3bd4cf5c39c344c934c2f0ad91b7f7f55c2ca4
4
- data.tar.gz: acfdcaac620551d4b70d7e98bd1c12db595fae02
3
+ metadata.gz: 70cfbded7c08170b69bac4f46a7bafd3c37c8539
4
+ data.tar.gz: 4f684ad24b4cba99c43412e03949e802a4e3c707
5
5
  SHA512:
6
- metadata.gz: 9cbcf79bb46d010b5ac8138f3c498d7e306e470bc422b6933436be517e82f82d02eedf08657030f32d1e5df697134b4e581ec60fffc402f3eddffdcfa6fac450
7
- data.tar.gz: 482f68f1f96ac2e5fe415f4d5d3cdd222a6da5a36ed84d75a768568a30d0652a8020a60833a66e781fb5b179a6e9fcf56d9d3141fb06a3c9cf0afc7da4ae6c1c
6
+ metadata.gz: f379ba2c03ff06267648b8d1504e9dba89de52636b714612466a69a48d05618052a2721c7ac1d068d2c6e0f069d7e0ce01f2264584df29c1e386b21f231d45f4
7
+ data.tar.gz: 0a4f892d6809b97c9fb4cf4d3ca518d44d03950e8ceae94c18025452eef3421f0d53d6c578bd100d00da75ab85318b9024616eeaf64c635503347a1082022ded
@@ -4,7 +4,6 @@
4
4
  <title>Scrivito</title>
5
5
  <%= stylesheet_link_tag 'scrivito_ui' %>
6
6
  <%= javascript_include_tag 'scrivito_ui' %>
7
- <%= stylesheet_link_tag 'scrivito_ui_extensions' %>
8
7
  <%= javascript_include_tag 'scrivito_ui_extensions' %>
9
8
  </head>
10
9
  <body id="scrivito_ui">
data/config/ca-bundle.crt CHANGED
@@ -1,7 +1,7 @@
1
1
  ##
2
2
  ## Bundle of CA Root Certificates
3
3
  ##
4
- ## Certificate data from Mozilla as of: Tue Feb 24 17:42:01 2015
4
+ ## Certificate data from Mozilla as of: Fri Mar 6 09:58:49 2015
5
5
  ##
6
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
data/config/routes.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  Rails.application.routes.draw do
2
2
  resources :objs, controller: 'scrivito/objs', path: '__scrivito/objs',
3
- only: [:create, :update, :destroy] do
3
+ only: [:create, :update, :destroy], defaults: {format: :json} do
4
4
  collection do
5
5
  get :page_class_selection
6
6
  get :search
@@ -23,14 +23,17 @@ Rails.application.routes.draw do
23
23
  end
24
24
  end
25
25
 
26
- resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show]
26
+ resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show],
27
+ defaults: {format: :json}
27
28
 
28
- get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission'
29
+ get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission',
30
+ defaults: {format: :json}
29
31
 
30
32
  resources :workspaces,
31
33
  controller: 'scrivito/workspaces',
32
34
  path: '__scrivito/workspaces',
33
- only: [:index, :show, :create, :update, :destroy] do
35
+ only: [:index, :show, :create, :update, :destroy],
36
+ defaults: {format: :json} do
34
37
  member do
35
38
  put :rebase
36
39
  put :publish
@@ -38,7 +41,7 @@ Rails.application.routes.draw do
38
41
  end
39
42
  end
40
43
 
41
- get '__scrivito/users/suggest' => 'scrivito/users#suggest'
44
+ get '__scrivito/users/suggest' => 'scrivito/users#suggest', defaults: {format: :json}
42
45
 
43
46
  get 'scrivito', to: 'scrivito/ui#index', as: 'scrivito_ui'
44
47
  get 'scrivito/*application_path', to: 'scrivito/ui#index', format: false
@@ -15712,9 +15712,9 @@ if (typeof module !== 'undefined' && module.exports) {
15712
15712
  }
15713
15713
 
15714
15714
  ;
15715
- // Underscore.js 1.7.0
15715
+ // Underscore.js 1.8.2
15716
15716
  // http://underscorejs.org
15717
- // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
15717
+ // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
15718
15718
  // Underscore may be freely distributed under the MIT license.
15719
15719
 
15720
15720
  (function() {
@@ -15735,7 +15735,6 @@ if (typeof module !== 'undefined' && module.exports) {
15735
15735
  var
15736
15736
  push = ArrayProto.push,
15737
15737
  slice = ArrayProto.slice,
15738
- concat = ArrayProto.concat,
15739
15738
  toString = ObjProto.toString,
15740
15739
  hasOwnProperty = ObjProto.hasOwnProperty;
15741
15740
 
@@ -15744,7 +15743,11 @@ if (typeof module !== 'undefined' && module.exports) {
15744
15743
  var
15745
15744
  nativeIsArray = Array.isArray,
15746
15745
  nativeKeys = Object.keys,
15747
- nativeBind = FuncProto.bind;
15746
+ nativeBind = FuncProto.bind,
15747
+ nativeCreate = Object.create;
15748
+
15749
+ // Naked function reference for surrogate-prototype-swapping.
15750
+ var Ctor = function(){};
15748
15751
 
15749
15752
  // Create a safe reference to the Underscore object for use below.
15750
15753
  var _ = function(obj) {
@@ -15766,12 +15769,12 @@ if (typeof module !== 'undefined' && module.exports) {
15766
15769
  }
15767
15770
 
15768
15771
  // Current version.
15769
- _.VERSION = '1.7.0';
15772
+ _.VERSION = '1.8.2';
15770
15773
 
15771
15774
  // Internal function that returns an efficient (for current engines) version
15772
15775
  // of the passed-in callback, to be repeatedly applied in other Underscore
15773
15776
  // functions.
15774
- var createCallback = function(func, context, argCount) {
15777
+ var optimizeCb = function(func, context, argCount) {
15775
15778
  if (context === void 0) return func;
15776
15779
  switch (argCount == null ? 3 : argCount) {
15777
15780
  case 1: return function(value) {
@@ -15795,12 +15798,52 @@ if (typeof module !== 'undefined' && module.exports) {
15795
15798
  // A mostly-internal function to generate callbacks that can be applied
15796
15799
  // to each element in a collection, returning the desired result — either
15797
15800
  // identity, an arbitrary callback, a property matcher, or a property accessor.
15798
- _.iteratee = function(value, context, argCount) {
15801
+ var cb = function(value, context, argCount) {
15799
15802
  if (value == null) return _.identity;
15800
- if (_.isFunction(value)) return createCallback(value, context, argCount);
15801
- if (_.isObject(value)) return _.matches(value);
15803
+ if (_.isFunction(value)) return optimizeCb(value, context, argCount);
15804
+ if (_.isObject(value)) return _.matcher(value);
15802
15805
  return _.property(value);
15803
15806
  };
15807
+ _.iteratee = function(value, context) {
15808
+ return cb(value, context, Infinity);
15809
+ };
15810
+
15811
+ // An internal function for creating assigner functions.
15812
+ var createAssigner = function(keysFunc, undefinedOnly) {
15813
+ return function(obj) {
15814
+ var length = arguments.length;
15815
+ if (length < 2 || obj == null) return obj;
15816
+ for (var index = 1; index < length; index++) {
15817
+ var source = arguments[index],
15818
+ keys = keysFunc(source),
15819
+ l = keys.length;
15820
+ for (var i = 0; i < l; i++) {
15821
+ var key = keys[i];
15822
+ if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
15823
+ }
15824
+ }
15825
+ return obj;
15826
+ };
15827
+ };
15828
+
15829
+ // An internal function for creating a new object that inherits from another.
15830
+ var baseCreate = function(prototype) {
15831
+ if (!_.isObject(prototype)) return {};
15832
+ if (nativeCreate) return nativeCreate(prototype);
15833
+ Ctor.prototype = prototype;
15834
+ var result = new Ctor;
15835
+ Ctor.prototype = null;
15836
+ return result;
15837
+ };
15838
+
15839
+ // Helper for collection methods to determine whether a collection
15840
+ // should be iterated as an array or as an object
15841
+ // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
15842
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
15843
+ var isArrayLike = function(collection) {
15844
+ var length = collection && collection.length;
15845
+ return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
15846
+ };
15804
15847
 
15805
15848
  // Collection Functions
15806
15849
  // --------------------
@@ -15809,11 +15852,10 @@ if (typeof module !== 'undefined' && module.exports) {
15809
15852
  // Handles raw objects in addition to array-likes. Treats all
15810
15853
  // sparse array-likes as if they were dense.
15811
15854
  _.each = _.forEach = function(obj, iteratee, context) {
15812
- if (obj == null) return obj;
15813
- iteratee = createCallback(iteratee, context);
15814
- var i, length = obj.length;
15815
- if (length === +length) {
15816
- for (i = 0; i < length; i++) {
15855
+ iteratee = optimizeCb(iteratee, context);
15856
+ var i, length;
15857
+ if (isArrayLike(obj)) {
15858
+ for (i = 0, length = obj.length; i < length; i++) {
15817
15859
  iteratee(obj[i], i, obj);
15818
15860
  }
15819
15861
  } else {
@@ -15827,77 +15869,66 @@ if (typeof module !== 'undefined' && module.exports) {
15827
15869
 
15828
15870
  // Return the results of applying the iteratee to each element.
15829
15871
  _.map = _.collect = function(obj, iteratee, context) {
15830
- if (obj == null) return [];
15831
- iteratee = _.iteratee(iteratee, context);
15832
- var keys = obj.length !== +obj.length && _.keys(obj),
15872
+ iteratee = cb(iteratee, context);
15873
+ var keys = !isArrayLike(obj) && _.keys(obj),
15833
15874
  length = (keys || obj).length,
15834
- results = Array(length),
15835
- currentKey;
15875
+ results = Array(length);
15836
15876
  for (var index = 0; index < length; index++) {
15837
- currentKey = keys ? keys[index] : index;
15877
+ var currentKey = keys ? keys[index] : index;
15838
15878
  results[index] = iteratee(obj[currentKey], currentKey, obj);
15839
15879
  }
15840
15880
  return results;
15841
15881
  };
15842
15882
 
15843
- var reduceError = 'Reduce of empty array with no initial value';
15883
+ // Create a reducing function iterating left or right.
15884
+ function createReduce(dir) {
15885
+ // Optimized iterator function as using arguments.length
15886
+ // in the main function will deoptimize the, see #1991.
15887
+ function iterator(obj, iteratee, memo, keys, index, length) {
15888
+ for (; index >= 0 && index < length; index += dir) {
15889
+ var currentKey = keys ? keys[index] : index;
15890
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
15891
+ }
15892
+ return memo;
15893
+ }
15894
+
15895
+ return function(obj, iteratee, memo, context) {
15896
+ iteratee = optimizeCb(iteratee, context, 4);
15897
+ var keys = !isArrayLike(obj) && _.keys(obj),
15898
+ length = (keys || obj).length,
15899
+ index = dir > 0 ? 0 : length - 1;
15900
+ // Determine the initial value if none is provided.
15901
+ if (arguments.length < 3) {
15902
+ memo = obj[keys ? keys[index] : index];
15903
+ index += dir;
15904
+ }
15905
+ return iterator(obj, iteratee, memo, keys, index, length);
15906
+ };
15907
+ }
15844
15908
 
15845
15909
  // **Reduce** builds up a single result from a list of values, aka `inject`,
15846
15910
  // or `foldl`.
15847
- _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
15848
- if (obj == null) obj = [];
15849
- iteratee = createCallback(iteratee, context, 4);
15850
- var keys = obj.length !== +obj.length && _.keys(obj),
15851
- length = (keys || obj).length,
15852
- index = 0, currentKey;
15853
- if (arguments.length < 3) {
15854
- if (!length) throw new TypeError(reduceError);
15855
- memo = obj[keys ? keys[index++] : index++];
15856
- }
15857
- for (; index < length; index++) {
15858
- currentKey = keys ? keys[index] : index;
15859
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
15860
- }
15861
- return memo;
15862
- };
15911
+ _.reduce = _.foldl = _.inject = createReduce(1);
15863
15912
 
15864
15913
  // The right-associative version of reduce, also known as `foldr`.
15865
- _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
15866
- if (obj == null) obj = [];
15867
- iteratee = createCallback(iteratee, context, 4);
15868
- var keys = obj.length !== + obj.length && _.keys(obj),
15869
- index = (keys || obj).length,
15870
- currentKey;
15871
- if (arguments.length < 3) {
15872
- if (!index) throw new TypeError(reduceError);
15873
- memo = obj[keys ? keys[--index] : --index];
15874
- }
15875
- while (index--) {
15876
- currentKey = keys ? keys[index] : index;
15877
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
15878
- }
15879
- return memo;
15880
- };
15914
+ _.reduceRight = _.foldr = createReduce(-1);
15881
15915
 
15882
15916
  // Return the first value which passes a truth test. Aliased as `detect`.
15883
15917
  _.find = _.detect = function(obj, predicate, context) {
15884
- var result;
15885
- predicate = _.iteratee(predicate, context);
15886
- _.some(obj, function(value, index, list) {
15887
- if (predicate(value, index, list)) {
15888
- result = value;
15889
- return true;
15890
- }
15891
- });
15892
- return result;
15918
+ var key;
15919
+ if (isArrayLike(obj)) {
15920
+ key = _.findIndex(obj, predicate, context);
15921
+ } else {
15922
+ key = _.findKey(obj, predicate, context);
15923
+ }
15924
+ if (key !== void 0 && key !== -1) return obj[key];
15893
15925
  };
15894
15926
 
15895
15927
  // Return all the elements that pass a truth test.
15896
15928
  // Aliased as `select`.
15897
15929
  _.filter = _.select = function(obj, predicate, context) {
15898
15930
  var results = [];
15899
- if (obj == null) return results;
15900
- predicate = _.iteratee(predicate, context);
15931
+ predicate = cb(predicate, context);
15901
15932
  _.each(obj, function(value, index, list) {
15902
15933
  if (predicate(value, index, list)) results.push(value);
15903
15934
  });
@@ -15906,19 +15937,17 @@ if (typeof module !== 'undefined' && module.exports) {
15906
15937
 
15907
15938
  // Return all the elements for which a truth test fails.
15908
15939
  _.reject = function(obj, predicate, context) {
15909
- return _.filter(obj, _.negate(_.iteratee(predicate)), context);
15940
+ return _.filter(obj, _.negate(cb(predicate)), context);
15910
15941
  };
15911
15942
 
15912
15943
  // Determine whether all of the elements match a truth test.
15913
15944
  // Aliased as `all`.
15914
15945
  _.every = _.all = function(obj, predicate, context) {
15915
- if (obj == null) return true;
15916
- predicate = _.iteratee(predicate, context);
15917
- var keys = obj.length !== +obj.length && _.keys(obj),
15918
- length = (keys || obj).length,
15919
- index, currentKey;
15920
- for (index = 0; index < length; index++) {
15921
- currentKey = keys ? keys[index] : index;
15946
+ predicate = cb(predicate, context);
15947
+ var keys = !isArrayLike(obj) && _.keys(obj),
15948
+ length = (keys || obj).length;
15949
+ for (var index = 0; index < length; index++) {
15950
+ var currentKey = keys ? keys[index] : index;
15922
15951
  if (!predicate(obj[currentKey], currentKey, obj)) return false;
15923
15952
  }
15924
15953
  return true;
@@ -15927,24 +15956,21 @@ if (typeof module !== 'undefined' && module.exports) {
15927
15956
  // Determine if at least one element in the object matches a truth test.
15928
15957
  // Aliased as `any`.
15929
15958
  _.some = _.any = function(obj, predicate, context) {
15930
- if (obj == null) return false;
15931
- predicate = _.iteratee(predicate, context);
15932
- var keys = obj.length !== +obj.length && _.keys(obj),
15933
- length = (keys || obj).length,
15934
- index, currentKey;
15935
- for (index = 0; index < length; index++) {
15936
- currentKey = keys ? keys[index] : index;
15959
+ predicate = cb(predicate, context);
15960
+ var keys = !isArrayLike(obj) && _.keys(obj),
15961
+ length = (keys || obj).length;
15962
+ for (var index = 0; index < length; index++) {
15963
+ var currentKey = keys ? keys[index] : index;
15937
15964
  if (predicate(obj[currentKey], currentKey, obj)) return true;
15938
15965
  }
15939
15966
  return false;
15940
15967
  };
15941
15968
 
15942
15969
  // Determine if the array or object contains a given value (using `===`).
15943
- // Aliased as `include`.
15944
- _.contains = _.include = function(obj, target) {
15945
- if (obj == null) return false;
15946
- if (obj.length !== +obj.length) obj = _.values(obj);
15947
- return _.indexOf(obj, target) >= 0;
15970
+ // Aliased as `includes` and `include`.
15971
+ _.contains = _.includes = _.include = function(obj, target, fromIndex) {
15972
+ if (!isArrayLike(obj)) obj = _.values(obj);
15973
+ return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
15948
15974
  };
15949
15975
 
15950
15976
  // Invoke a method (with arguments) on every item in a collection.
@@ -15952,7 +15978,8 @@ if (typeof module !== 'undefined' && module.exports) {
15952
15978
  var args = slice.call(arguments, 2);
15953
15979
  var isFunc = _.isFunction(method);
15954
15980
  return _.map(obj, function(value) {
15955
- return (isFunc ? method : value[method]).apply(value, args);
15981
+ var func = isFunc ? method : value[method];
15982
+ return func == null ? func : func.apply(value, args);
15956
15983
  });
15957
15984
  };
15958
15985
 
@@ -15964,13 +15991,13 @@ if (typeof module !== 'undefined' && module.exports) {
15964
15991
  // Convenience version of a common use case of `filter`: selecting only objects
15965
15992
  // containing specific `key:value` pairs.
15966
15993
  _.where = function(obj, attrs) {
15967
- return _.filter(obj, _.matches(attrs));
15994
+ return _.filter(obj, _.matcher(attrs));
15968
15995
  };
15969
15996
 
15970
15997
  // Convenience version of a common use case of `find`: getting the first object
15971
15998
  // containing specific `key:value` pairs.
15972
15999
  _.findWhere = function(obj, attrs) {
15973
- return _.find(obj, _.matches(attrs));
16000
+ return _.find(obj, _.matcher(attrs));
15974
16001
  };
15975
16002
 
15976
16003
  // Return the maximum element (or element-based computation).
@@ -15978,7 +16005,7 @@ if (typeof module !== 'undefined' && module.exports) {
15978
16005
  var result = -Infinity, lastComputed = -Infinity,
15979
16006
  value, computed;
15980
16007
  if (iteratee == null && obj != null) {
15981
- obj = obj.length === +obj.length ? obj : _.values(obj);
16008
+ obj = isArrayLike(obj) ? obj : _.values(obj);
15982
16009
  for (var i = 0, length = obj.length; i < length; i++) {
15983
16010
  value = obj[i];
15984
16011
  if (value > result) {
@@ -15986,7 +16013,7 @@ if (typeof module !== 'undefined' && module.exports) {
15986
16013
  }
15987
16014
  }
15988
16015
  } else {
15989
- iteratee = _.iteratee(iteratee, context);
16016
+ iteratee = cb(iteratee, context);
15990
16017
  _.each(obj, function(value, index, list) {
15991
16018
  computed = iteratee(value, index, list);
15992
16019
  if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
@@ -16003,7 +16030,7 @@ if (typeof module !== 'undefined' && module.exports) {
16003
16030
  var result = Infinity, lastComputed = Infinity,
16004
16031
  value, computed;
16005
16032
  if (iteratee == null && obj != null) {
16006
- obj = obj.length === +obj.length ? obj : _.values(obj);
16033
+ obj = isArrayLike(obj) ? obj : _.values(obj);
16007
16034
  for (var i = 0, length = obj.length; i < length; i++) {
16008
16035
  value = obj[i];
16009
16036
  if (value < result) {
@@ -16011,7 +16038,7 @@ if (typeof module !== 'undefined' && module.exports) {
16011
16038
  }
16012
16039
  }
16013
16040
  } else {
16014
- iteratee = _.iteratee(iteratee, context);
16041
+ iteratee = cb(iteratee, context);
16015
16042
  _.each(obj, function(value, index, list) {
16016
16043
  computed = iteratee(value, index, list);
16017
16044
  if (computed < lastComputed || computed === Infinity && result === Infinity) {
@@ -16026,7 +16053,7 @@ if (typeof module !== 'undefined' && module.exports) {
16026
16053
  // Shuffle a collection, using the modern version of the
16027
16054
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
16028
16055
  _.shuffle = function(obj) {
16029
- var set = obj && obj.length === +obj.length ? obj : _.values(obj);
16056
+ var set = isArrayLike(obj) ? obj : _.values(obj);
16030
16057
  var length = set.length;
16031
16058
  var shuffled = Array(length);
16032
16059
  for (var index = 0, rand; index < length; index++) {
@@ -16042,7 +16069,7 @@ if (typeof module !== 'undefined' && module.exports) {
16042
16069
  // The internal `guard` argument allows it to work with `map`.
16043
16070
  _.sample = function(obj, n, guard) {
16044
16071
  if (n == null || guard) {
16045
- if (obj.length !== +obj.length) obj = _.values(obj);
16072
+ if (!isArrayLike(obj)) obj = _.values(obj);
16046
16073
  return obj[_.random(obj.length - 1)];
16047
16074
  }
16048
16075
  return _.shuffle(obj).slice(0, Math.max(0, n));
@@ -16050,7 +16077,7 @@ if (typeof module !== 'undefined' && module.exports) {
16050
16077
 
16051
16078
  // Sort the object's values by a criterion produced by an iteratee.
16052
16079
  _.sortBy = function(obj, iteratee, context) {
16053
- iteratee = _.iteratee(iteratee, context);
16080
+ iteratee = cb(iteratee, context);
16054
16081
  return _.pluck(_.map(obj, function(value, index, list) {
16055
16082
  return {
16056
16083
  value: value,
@@ -16072,7 +16099,7 @@ if (typeof module !== 'undefined' && module.exports) {
16072
16099
  var group = function(behavior) {
16073
16100
  return function(obj, iteratee, context) {
16074
16101
  var result = {};
16075
- iteratee = _.iteratee(iteratee, context);
16102
+ iteratee = cb(iteratee, context);
16076
16103
  _.each(obj, function(value, index) {
16077
16104
  var key = iteratee(value, index, obj);
16078
16105
  behavior(result, value, key);
@@ -16100,37 +16127,24 @@ if (typeof module !== 'undefined' && module.exports) {
16100
16127
  if (_.has(result, key)) result[key]++; else result[key] = 1;
16101
16128
  });
16102
16129
 
16103
- // Use a comparator function to figure out the smallest index at which
16104
- // an object should be inserted so as to maintain order. Uses binary search.
16105
- _.sortedIndex = function(array, obj, iteratee, context) {
16106
- iteratee = _.iteratee(iteratee, context, 1);
16107
- var value = iteratee(obj);
16108
- var low = 0, high = array.length;
16109
- while (low < high) {
16110
- var mid = low + high >>> 1;
16111
- if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
16112
- }
16113
- return low;
16114
- };
16115
-
16116
16130
  // Safely create a real, live array from anything iterable.
16117
16131
  _.toArray = function(obj) {
16118
16132
  if (!obj) return [];
16119
16133
  if (_.isArray(obj)) return slice.call(obj);
16120
- if (obj.length === +obj.length) return _.map(obj, _.identity);
16134
+ if (isArrayLike(obj)) return _.map(obj, _.identity);
16121
16135
  return _.values(obj);
16122
16136
  };
16123
16137
 
16124
16138
  // Return the number of elements in an object.
16125
16139
  _.size = function(obj) {
16126
16140
  if (obj == null) return 0;
16127
- return obj.length === +obj.length ? obj.length : _.keys(obj).length;
16141
+ return isArrayLike(obj) ? obj.length : _.keys(obj).length;
16128
16142
  };
16129
16143
 
16130
16144
  // Split a collection into two arrays: one whose elements all satisfy the given
16131
16145
  // predicate, and one whose elements all do not satisfy the predicate.
16132
16146
  _.partition = function(obj, predicate, context) {
16133
- predicate = _.iteratee(predicate, context);
16147
+ predicate = cb(predicate, context);
16134
16148
  var pass = [], fail = [];
16135
16149
  _.each(obj, function(value, key, obj) {
16136
16150
  (predicate(value, key, obj) ? pass : fail).push(value);
@@ -16147,30 +16161,27 @@ if (typeof module !== 'undefined' && module.exports) {
16147
16161
  _.first = _.head = _.take = function(array, n, guard) {
16148
16162
  if (array == null) return void 0;
16149
16163
  if (n == null || guard) return array[0];
16150
- if (n < 0) return [];
16151
- return slice.call(array, 0, n);
16164
+ return _.initial(array, array.length - n);
16152
16165
  };
16153
16166
 
16154
16167
  // Returns everything but the last entry of the array. Especially useful on
16155
16168
  // the arguments object. Passing **n** will return all the values in
16156
- // the array, excluding the last N. The **guard** check allows it to work with
16157
- // `_.map`.
16169
+ // the array, excluding the last N.
16158
16170
  _.initial = function(array, n, guard) {
16159
16171
  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
16160
16172
  };
16161
16173
 
16162
16174
  // Get the last element of an array. Passing **n** will return the last N
16163
- // values in the array. The **guard** check allows it to work with `_.map`.
16175
+ // values in the array.
16164
16176
  _.last = function(array, n, guard) {
16165
16177
  if (array == null) return void 0;
16166
16178
  if (n == null || guard) return array[array.length - 1];
16167
- return slice.call(array, Math.max(array.length - n, 0));
16179
+ return _.rest(array, Math.max(0, array.length - n));
16168
16180
  };
16169
16181
 
16170
16182
  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
16171
16183
  // Especially useful on the arguments object. Passing an **n** will return
16172
- // the rest N values in the array. The **guard**
16173
- // check allows it to work with `_.map`.
16184
+ // the rest N values in the array.
16174
16185
  _.rest = _.tail = _.drop = function(array, n, guard) {
16175
16186
  return slice.call(array, n == null || guard ? 1 : n);
16176
16187
  };
@@ -16181,18 +16192,20 @@ if (typeof module !== 'undefined' && module.exports) {
16181
16192
  };
16182
16193
 
16183
16194
  // Internal implementation of a recursive `flatten` function.
16184
- var flatten = function(input, shallow, strict, output) {
16185
- if (shallow && _.every(input, _.isArray)) {
16186
- return concat.apply(output, input);
16187
- }
16188
- for (var i = 0, length = input.length; i < length; i++) {
16195
+ var flatten = function(input, shallow, strict, startIndex) {
16196
+ var output = [], idx = 0;
16197
+ for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
16189
16198
  var value = input[i];
16190
- if (!_.isArray(value) && !_.isArguments(value)) {
16191
- if (!strict) output.push(value);
16192
- } else if (shallow) {
16193
- push.apply(output, value);
16194
- } else {
16195
- flatten(value, shallow, strict, output);
16199
+ if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
16200
+ //flatten current level of array or arguments object
16201
+ if (!shallow) value = flatten(value, shallow, strict);
16202
+ var j = 0, len = value.length;
16203
+ output.length += len;
16204
+ while (j < len) {
16205
+ output[idx++] = value[j++];
16206
+ }
16207
+ } else if (!strict) {
16208
+ output[idx++] = value;
16196
16209
  }
16197
16210
  }
16198
16211
  return output;
@@ -16200,7 +16213,7 @@ if (typeof module !== 'undefined' && module.exports) {
16200
16213
 
16201
16214
  // Flatten out an array, either recursively (by default), or just one level.
16202
16215
  _.flatten = function(array, shallow) {
16203
- return flatten(array, shallow, false, []);
16216
+ return flatten(array, shallow, false);
16204
16217
  };
16205
16218
 
16206
16219
  // Return a version of the array that does not contain the specified value(s).
@@ -16218,21 +16231,21 @@ if (typeof module !== 'undefined' && module.exports) {
16218
16231
  iteratee = isSorted;
16219
16232
  isSorted = false;
16220
16233
  }
16221
- if (iteratee != null) iteratee = _.iteratee(iteratee, context);
16234
+ if (iteratee != null) iteratee = cb(iteratee, context);
16222
16235
  var result = [];
16223
16236
  var seen = [];
16224
16237
  for (var i = 0, length = array.length; i < length; i++) {
16225
- var value = array[i];
16238
+ var value = array[i],
16239
+ computed = iteratee ? iteratee(value, i, array) : value;
16226
16240
  if (isSorted) {
16227
- if (!i || seen !== value) result.push(value);
16228
- seen = value;
16241
+ if (!i || seen !== computed) result.push(value);
16242
+ seen = computed;
16229
16243
  } else if (iteratee) {
16230
- var computed = iteratee(value, i, array);
16231
- if (_.indexOf(seen, computed) < 0) {
16244
+ if (!_.contains(seen, computed)) {
16232
16245
  seen.push(computed);
16233
16246
  result.push(value);
16234
16247
  }
16235
- } else if (_.indexOf(result, value) < 0) {
16248
+ } else if (!_.contains(result, value)) {
16236
16249
  result.push(value);
16237
16250
  }
16238
16251
  }
@@ -16242,7 +16255,7 @@ if (typeof module !== 'undefined' && module.exports) {
16242
16255
  // Produce an array that contains the union: each distinct element from all of
16243
16256
  // the passed-in arrays.
16244
16257
  _.union = function() {
16245
- return _.uniq(flatten(arguments, true, true, []));
16258
+ return _.uniq(flatten(arguments, true, true));
16246
16259
  };
16247
16260
 
16248
16261
  // Produce an array that contains every item shared between all the
@@ -16265,7 +16278,7 @@ if (typeof module !== 'undefined' && module.exports) {
16265
16278
  // Take the difference between one array and a number of other arrays.
16266
16279
  // Only the elements present in just the first array will remain.
16267
16280
  _.difference = function(array) {
16268
- var rest = flatten(slice.call(arguments, 1), true, true, []);
16281
+ var rest = flatten(arguments, true, true, 1);
16269
16282
  return _.filter(array, function(value){
16270
16283
  return !_.contains(rest, value);
16271
16284
  });
@@ -16273,23 +16286,28 @@ if (typeof module !== 'undefined' && module.exports) {
16273
16286
 
16274
16287
  // Zip together multiple lists into a single array -- elements that share
16275
16288
  // an index go together.
16276
- _.zip = function(array) {
16277
- if (array == null) return [];
16278
- var length = _.max(arguments, 'length').length;
16279
- var results = Array(length);
16280
- for (var i = 0; i < length; i++) {
16281
- results[i] = _.pluck(arguments, i);
16289
+ _.zip = function() {
16290
+ return _.unzip(arguments);
16291
+ };
16292
+
16293
+ // Complement of _.zip. Unzip accepts an array of arrays and groups
16294
+ // each array's elements on shared indices
16295
+ _.unzip = function(array) {
16296
+ var length = array && _.max(array, 'length').length || 0;
16297
+ var result = Array(length);
16298
+
16299
+ for (var index = 0; index < length; index++) {
16300
+ result[index] = _.pluck(array, index);
16282
16301
  }
16283
- return results;
16302
+ return result;
16284
16303
  };
16285
16304
 
16286
16305
  // Converts lists into objects. Pass either a single array of `[key, value]`
16287
16306
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
16288
16307
  // the corresponding values.
16289
16308
  _.object = function(list, values) {
16290
- if (list == null) return {};
16291
16309
  var result = {};
16292
- for (var i = 0, length = list.length; i < length; i++) {
16310
+ for (var i = 0, length = list && list.length; i < length; i++) {
16293
16311
  if (values) {
16294
16312
  result[list[i]] = values[i];
16295
16313
  } else {
@@ -16304,30 +16322,63 @@ if (typeof module !== 'undefined' && module.exports) {
16304
16322
  // If the array is large and already in sort order, pass `true`
16305
16323
  // for **isSorted** to use binary search.
16306
16324
  _.indexOf = function(array, item, isSorted) {
16307
- if (array == null) return -1;
16308
- var i = 0, length = array.length;
16309
- if (isSorted) {
16310
- if (typeof isSorted == 'number') {
16311
- i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
16312
- } else {
16313
- i = _.sortedIndex(array, item);
16314
- return array[i] === item ? i : -1;
16315
- }
16325
+ var i = 0, length = array && array.length;
16326
+ if (typeof isSorted == 'number') {
16327
+ i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
16328
+ } else if (isSorted && length) {
16329
+ i = _.sortedIndex(array, item);
16330
+ return array[i] === item ? i : -1;
16331
+ }
16332
+ if (item !== item) {
16333
+ return _.findIndex(slice.call(array, i), _.isNaN);
16316
16334
  }
16317
16335
  for (; i < length; i++) if (array[i] === item) return i;
16318
16336
  return -1;
16319
16337
  };
16320
16338
 
16321
16339
  _.lastIndexOf = function(array, item, from) {
16322
- if (array == null) return -1;
16323
- var idx = array.length;
16340
+ var idx = array ? array.length : 0;
16324
16341
  if (typeof from == 'number') {
16325
16342
  idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
16326
16343
  }
16344
+ if (item !== item) {
16345
+ return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
16346
+ }
16327
16347
  while (--idx >= 0) if (array[idx] === item) return idx;
16328
16348
  return -1;
16329
16349
  };
16330
16350
 
16351
+ // Generator function to create the findIndex and findLastIndex functions
16352
+ function createIndexFinder(dir) {
16353
+ return function(array, predicate, context) {
16354
+ predicate = cb(predicate, context);
16355
+ var length = array != null && array.length;
16356
+ var index = dir > 0 ? 0 : length - 1;
16357
+ for (; index >= 0 && index < length; index += dir) {
16358
+ if (predicate(array[index], index, array)) return index;
16359
+ }
16360
+ return -1;
16361
+ };
16362
+ }
16363
+
16364
+ // Returns the first index on an array-like that passes a predicate test
16365
+ _.findIndex = createIndexFinder(1);
16366
+
16367
+ _.findLastIndex = createIndexFinder(-1);
16368
+
16369
+ // Use a comparator function to figure out the smallest index at which
16370
+ // an object should be inserted so as to maintain order. Uses binary search.
16371
+ _.sortedIndex = function(array, obj, iteratee, context) {
16372
+ iteratee = cb(iteratee, context, 1);
16373
+ var value = iteratee(obj);
16374
+ var low = 0, high = array.length;
16375
+ while (low < high) {
16376
+ var mid = Math.floor((low + high) / 2);
16377
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
16378
+ }
16379
+ return low;
16380
+ };
16381
+
16331
16382
  // Generate an integer Array containing an arithmetic progression. A port of
16332
16383
  // the native Python `range()` function. See
16333
16384
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
@@ -16351,25 +16402,25 @@ if (typeof module !== 'undefined' && module.exports) {
16351
16402
  // Function (ahem) Functions
16352
16403
  // ------------------
16353
16404
 
16354
- // Reusable constructor function for prototype setting.
16355
- var Ctor = function(){};
16405
+ // Determines whether to execute a function as a constructor
16406
+ // or a normal function with the provided arguments
16407
+ var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
16408
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
16409
+ var self = baseCreate(sourceFunc.prototype);
16410
+ var result = sourceFunc.apply(self, args);
16411
+ if (_.isObject(result)) return result;
16412
+ return self;
16413
+ };
16356
16414
 
16357
16415
  // Create a function bound to a given object (assigning `this`, and arguments,
16358
16416
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
16359
16417
  // available.
16360
16418
  _.bind = function(func, context) {
16361
- var args, bound;
16362
16419
  if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
16363
16420
  if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
16364
- args = slice.call(arguments, 2);
16365
- bound = function() {
16366
- if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
16367
- Ctor.prototype = func.prototype;
16368
- var self = new Ctor;
16369
- Ctor.prototype = null;
16370
- var result = func.apply(self, args.concat(slice.call(arguments)));
16371
- if (_.isObject(result)) return result;
16372
- return self;
16421
+ var args = slice.call(arguments, 2);
16422
+ var bound = function() {
16423
+ return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
16373
16424
  };
16374
16425
  return bound;
16375
16426
  };
@@ -16379,15 +16430,16 @@ if (typeof module !== 'undefined' && module.exports) {
16379
16430
  // as a placeholder, allowing any combination of arguments to be pre-filled.
16380
16431
  _.partial = function(func) {
16381
16432
  var boundArgs = slice.call(arguments, 1);
16382
- return function() {
16383
- var position = 0;
16384
- var args = boundArgs.slice();
16385
- for (var i = 0, length = args.length; i < length; i++) {
16386
- if (args[i] === _) args[i] = arguments[position++];
16433
+ var bound = function() {
16434
+ var position = 0, length = boundArgs.length;
16435
+ var args = Array(length);
16436
+ for (var i = 0; i < length; i++) {
16437
+ args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
16387
16438
  }
16388
16439
  while (position < arguments.length) args.push(arguments[position++]);
16389
- return func.apply(this, args);
16440
+ return executeBound(func, bound, this, this, args);
16390
16441
  };
16442
+ return bound;
16391
16443
  };
16392
16444
 
16393
16445
  // Bind a number of an object's methods to that object. Remaining arguments
@@ -16407,7 +16459,7 @@ if (typeof module !== 'undefined' && module.exports) {
16407
16459
  _.memoize = function(func, hasher) {
16408
16460
  var memoize = function(key) {
16409
16461
  var cache = memoize.cache;
16410
- var address = hasher ? hasher.apply(this, arguments) : key;
16462
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
16411
16463
  if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
16412
16464
  return cache[address];
16413
16465
  };
@@ -16426,9 +16478,7 @@ if (typeof module !== 'undefined' && module.exports) {
16426
16478
 
16427
16479
  // Defers a function, scheduling it to run after the current call stack has
16428
16480
  // cleared.
16429
- _.defer = function(func) {
16430
- return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
16431
- };
16481
+ _.defer = _.partial(_.delay, _, 1);
16432
16482
 
16433
16483
  // Returns a function, that, when invoked, will only be triggered at most once
16434
16484
  // during a given window of time. Normally, the throttled function will run
@@ -16453,8 +16503,10 @@ if (typeof module !== 'undefined' && module.exports) {
16453
16503
  context = this;
16454
16504
  args = arguments;
16455
16505
  if (remaining <= 0 || remaining > wait) {
16456
- clearTimeout(timeout);
16457
- timeout = null;
16506
+ if (timeout) {
16507
+ clearTimeout(timeout);
16508
+ timeout = null;
16509
+ }
16458
16510
  previous = now;
16459
16511
  result = func.apply(context, args);
16460
16512
  if (!timeout) context = args = null;
@@ -16475,7 +16527,7 @@ if (typeof module !== 'undefined' && module.exports) {
16475
16527
  var later = function() {
16476
16528
  var last = _.now() - timestamp;
16477
16529
 
16478
- if (last < wait && last > 0) {
16530
+ if (last < wait && last >= 0) {
16479
16531
  timeout = setTimeout(later, wait - last);
16480
16532
  } else {
16481
16533
  timeout = null;
@@ -16528,7 +16580,7 @@ if (typeof module !== 'undefined' && module.exports) {
16528
16580
  };
16529
16581
  };
16530
16582
 
16531
- // Returns a function that will only be executed after being called N times.
16583
+ // Returns a function that will only be executed on and after the Nth call.
16532
16584
  _.after = function(times, func) {
16533
16585
  return function() {
16534
16586
  if (--times < 1) {
@@ -16537,15 +16589,14 @@ if (typeof module !== 'undefined' && module.exports) {
16537
16589
  };
16538
16590
  };
16539
16591
 
16540
- // Returns a function that will only be executed before being called N times.
16592
+ // Returns a function that will only be executed up to (but not including) the Nth call.
16541
16593
  _.before = function(times, func) {
16542
16594
  var memo;
16543
16595
  return function() {
16544
16596
  if (--times > 0) {
16545
16597
  memo = func.apply(this, arguments);
16546
- } else {
16547
- func = null;
16548
16598
  }
16599
+ if (times <= 1) func = null;
16549
16600
  return memo;
16550
16601
  };
16551
16602
  };
@@ -16557,13 +16608,47 @@ if (typeof module !== 'undefined' && module.exports) {
16557
16608
  // Object Functions
16558
16609
  // ----------------
16559
16610
 
16560
- // Retrieve the names of an object's properties.
16611
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
16612
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
16613
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
16614
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
16615
+
16616
+ function collectNonEnumProps(obj, keys) {
16617
+ var nonEnumIdx = nonEnumerableProps.length;
16618
+ var constructor = obj.constructor;
16619
+ var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
16620
+
16621
+ // Constructor is a special case.
16622
+ var prop = 'constructor';
16623
+ if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
16624
+
16625
+ while (nonEnumIdx--) {
16626
+ prop = nonEnumerableProps[nonEnumIdx];
16627
+ if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
16628
+ keys.push(prop);
16629
+ }
16630
+ }
16631
+ }
16632
+
16633
+ // Retrieve the names of an object's own properties.
16561
16634
  // Delegates to **ECMAScript 5**'s native `Object.keys`
16562
16635
  _.keys = function(obj) {
16563
16636
  if (!_.isObject(obj)) return [];
16564
16637
  if (nativeKeys) return nativeKeys(obj);
16565
16638
  var keys = [];
16566
16639
  for (var key in obj) if (_.has(obj, key)) keys.push(key);
16640
+ // Ahem, IE < 9.
16641
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
16642
+ return keys;
16643
+ };
16644
+
16645
+ // Retrieve all the property names of an object.
16646
+ _.allKeys = function(obj) {
16647
+ if (!_.isObject(obj)) return [];
16648
+ var keys = [];
16649
+ for (var key in obj) keys.push(key);
16650
+ // Ahem, IE < 9.
16651
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
16567
16652
  return keys;
16568
16653
  };
16569
16654
 
@@ -16578,6 +16663,21 @@ if (typeof module !== 'undefined' && module.exports) {
16578
16663
  return values;
16579
16664
  };
16580
16665
 
16666
+ // Returns the results of applying the iteratee to each element of the object
16667
+ // In contrast to _.map it returns an object
16668
+ _.mapObject = function(obj, iteratee, context) {
16669
+ iteratee = cb(iteratee, context);
16670
+ var keys = _.keys(obj),
16671
+ length = keys.length,
16672
+ results = {},
16673
+ currentKey;
16674
+ for (var index = 0; index < length; index++) {
16675
+ currentKey = keys[index];
16676
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
16677
+ }
16678
+ return results;
16679
+ };
16680
+
16581
16681
  // Convert an object into a list of `[key, value]` pairs.
16582
16682
  _.pairs = function(obj) {
16583
16683
  var keys = _.keys(obj);
@@ -16610,37 +16710,38 @@ if (typeof module !== 'undefined' && module.exports) {
16610
16710
  };
16611
16711
 
16612
16712
  // Extend a given object with all the properties in passed-in object(s).
16613
- _.extend = function(obj) {
16614
- if (!_.isObject(obj)) return obj;
16615
- var source, prop;
16616
- for (var i = 1, length = arguments.length; i < length; i++) {
16617
- source = arguments[i];
16618
- for (prop in source) {
16619
- if (hasOwnProperty.call(source, prop)) {
16620
- obj[prop] = source[prop];
16621
- }
16622
- }
16713
+ _.extend = createAssigner(_.allKeys);
16714
+
16715
+ // Assigns a given object with all the own properties in the passed-in object(s)
16716
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
16717
+ _.extendOwn = _.assign = createAssigner(_.keys);
16718
+
16719
+ // Returns the first key on an object that passes a predicate test
16720
+ _.findKey = function(obj, predicate, context) {
16721
+ predicate = cb(predicate, context);
16722
+ var keys = _.keys(obj), key;
16723
+ for (var i = 0, length = keys.length; i < length; i++) {
16724
+ key = keys[i];
16725
+ if (predicate(obj[key], key, obj)) return key;
16623
16726
  }
16624
- return obj;
16625
16727
  };
16626
16728
 
16627
16729
  // Return a copy of the object only containing the whitelisted properties.
16628
- _.pick = function(obj, iteratee, context) {
16629
- var result = {}, key;
16730
+ _.pick = function(object, oiteratee, context) {
16731
+ var result = {}, obj = object, iteratee, keys;
16630
16732
  if (obj == null) return result;
16631
- if (_.isFunction(iteratee)) {
16632
- iteratee = createCallback(iteratee, context);
16633
- for (key in obj) {
16634
- var value = obj[key];
16635
- if (iteratee(value, key, obj)) result[key] = value;
16636
- }
16733
+ if (_.isFunction(oiteratee)) {
16734
+ keys = _.allKeys(obj);
16735
+ iteratee = optimizeCb(oiteratee, context);
16637
16736
  } else {
16638
- var keys = concat.apply([], slice.call(arguments, 1));
16639
- obj = new Object(obj);
16640
- for (var i = 0, length = keys.length; i < length; i++) {
16641
- key = keys[i];
16642
- if (key in obj) result[key] = obj[key];
16643
- }
16737
+ keys = flatten(arguments, false, false, 1);
16738
+ iteratee = function(value, key, obj) { return key in obj; };
16739
+ obj = Object(obj);
16740
+ }
16741
+ for (var i = 0, length = keys.length; i < length; i++) {
16742
+ var key = keys[i];
16743
+ var value = obj[key];
16744
+ if (iteratee(value, key, obj)) result[key] = value;
16644
16745
  }
16645
16746
  return result;
16646
16747
  };
@@ -16650,7 +16751,7 @@ if (typeof module !== 'undefined' && module.exports) {
16650
16751
  if (_.isFunction(iteratee)) {
16651
16752
  iteratee = _.negate(iteratee);
16652
16753
  } else {
16653
- var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
16754
+ var keys = _.map(flatten(arguments, false, false, 1), String);
16654
16755
  iteratee = function(value, key) {
16655
16756
  return !_.contains(keys, key);
16656
16757
  };
@@ -16659,16 +16760,7 @@ if (typeof module !== 'undefined' && module.exports) {
16659
16760
  };
16660
16761
 
16661
16762
  // Fill in a given object with default properties.
16662
- _.defaults = function(obj) {
16663
- if (!_.isObject(obj)) return obj;
16664
- for (var i = 1, length = arguments.length; i < length; i++) {
16665
- var source = arguments[i];
16666
- for (var prop in source) {
16667
- if (obj[prop] === void 0) obj[prop] = source[prop];
16668
- }
16669
- }
16670
- return obj;
16671
- };
16763
+ _.defaults = createAssigner(_.allKeys, true);
16672
16764
 
16673
16765
  // Create a (shallow-cloned) duplicate of an object.
16674
16766
  _.clone = function(obj) {
@@ -16684,6 +16776,19 @@ if (typeof module !== 'undefined' && module.exports) {
16684
16776
  return obj;
16685
16777
  };
16686
16778
 
16779
+ // Returns whether an object has a given set of `key:value` pairs.
16780
+ _.isMatch = function(object, attrs) {
16781
+ var keys = _.keys(attrs), length = keys.length;
16782
+ if (object == null) return !length;
16783
+ var obj = Object(object);
16784
+ for (var i = 0; i < length; i++) {
16785
+ var key = keys[i];
16786
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
16787
+ }
16788
+ return true;
16789
+ };
16790
+
16791
+
16687
16792
  // Internal recursive comparison function for `isEqual`.
16688
16793
  var eq = function(a, b, aStack, bStack) {
16689
16794
  // Identical objects are equal. `0 === -0`, but they aren't identical.
@@ -16718,74 +16823,76 @@ if (typeof module !== 'undefined' && module.exports) {
16718
16823
  // of `NaN` are not equivalent.
16719
16824
  return +a === +b;
16720
16825
  }
16721
- if (typeof a != 'object' || typeof b != 'object') return false;
16826
+
16827
+ var areArrays = className === '[object Array]';
16828
+ if (!areArrays) {
16829
+ if (typeof a != 'object' || typeof b != 'object') return false;
16830
+
16831
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
16832
+ // from different frames are.
16833
+ var aCtor = a.constructor, bCtor = b.constructor;
16834
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
16835
+ _.isFunction(bCtor) && bCtor instanceof bCtor)
16836
+ && ('constructor' in a && 'constructor' in b)) {
16837
+ return false;
16838
+ }
16839
+ }
16722
16840
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
16723
16841
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
16842
+
16843
+ // Initializing stack of traversed objects.
16844
+ // It's done here since we only need them for objects and arrays comparison.
16845
+ aStack = aStack || [];
16846
+ bStack = bStack || [];
16724
16847
  var length = aStack.length;
16725
16848
  while (length--) {
16726
16849
  // Linear search. Performance is inversely proportional to the number of
16727
16850
  // unique nested structures.
16728
16851
  if (aStack[length] === a) return bStack[length] === b;
16729
16852
  }
16730
- // Objects with different constructors are not equivalent, but `Object`s
16731
- // from different frames are.
16732
- var aCtor = a.constructor, bCtor = b.constructor;
16733
- if (
16734
- aCtor !== bCtor &&
16735
- // Handle Object.create(x) cases
16736
- 'constructor' in a && 'constructor' in b &&
16737
- !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
16738
- _.isFunction(bCtor) && bCtor instanceof bCtor)
16739
- ) {
16740
- return false;
16741
- }
16853
+
16742
16854
  // Add the first object to the stack of traversed objects.
16743
16855
  aStack.push(a);
16744
16856
  bStack.push(b);
16745
- var size, result;
16857
+
16746
16858
  // Recursively compare objects and arrays.
16747
- if (className === '[object Array]') {
16859
+ if (areArrays) {
16748
16860
  // Compare array lengths to determine if a deep comparison is necessary.
16749
- size = a.length;
16750
- result = size === b.length;
16751
- if (result) {
16752
- // Deep compare the contents, ignoring non-numeric properties.
16753
- while (size--) {
16754
- if (!(result = eq(a[size], b[size], aStack, bStack))) break;
16755
- }
16861
+ length = a.length;
16862
+ if (length !== b.length) return false;
16863
+ // Deep compare the contents, ignoring non-numeric properties.
16864
+ while (length--) {
16865
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
16756
16866
  }
16757
16867
  } else {
16758
16868
  // Deep compare objects.
16759
16869
  var keys = _.keys(a), key;
16760
- size = keys.length;
16870
+ length = keys.length;
16761
16871
  // Ensure that both objects contain the same number of properties before comparing deep equality.
16762
- result = _.keys(b).length === size;
16763
- if (result) {
16764
- while (size--) {
16765
- // Deep compare each member
16766
- key = keys[size];
16767
- if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
16768
- }
16872
+ if (_.keys(b).length !== length) return false;
16873
+ while (length--) {
16874
+ // Deep compare each member
16875
+ key = keys[length];
16876
+ if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
16769
16877
  }
16770
16878
  }
16771
16879
  // Remove the first object from the stack of traversed objects.
16772
16880
  aStack.pop();
16773
16881
  bStack.pop();
16774
- return result;
16882
+ return true;
16775
16883
  };
16776
16884
 
16777
16885
  // Perform a deep comparison to check if two objects are equal.
16778
16886
  _.isEqual = function(a, b) {
16779
- return eq(a, b, [], []);
16887
+ return eq(a, b);
16780
16888
  };
16781
16889
 
16782
16890
  // Is a given array, string, or object empty?
16783
16891
  // An "empty" object has no enumerable own-properties.
16784
16892
  _.isEmpty = function(obj) {
16785
16893
  if (obj == null) return true;
16786
- if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
16787
- for (var key in obj) if (_.has(obj, key)) return false;
16788
- return true;
16894
+ if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
16895
+ return _.keys(obj).length === 0;
16789
16896
  };
16790
16897
 
16791
16898
  // Is a given value a DOM element?
@@ -16805,14 +16912,14 @@ if (typeof module !== 'undefined' && module.exports) {
16805
16912
  return type === 'function' || type === 'object' && !!obj;
16806
16913
  };
16807
16914
 
16808
- // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
16809
- _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
16915
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
16916
+ _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
16810
16917
  _['is' + name] = function(obj) {
16811
16918
  return toString.call(obj) === '[object ' + name + ']';
16812
16919
  };
16813
16920
  });
16814
16921
 
16815
- // Define a fallback version of the method in browsers (ahem, IE), where
16922
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
16816
16923
  // there isn't any inspectable "Arguments" type.
16817
16924
  if (!_.isArguments(arguments)) {
16818
16925
  _.isArguments = function(obj) {
@@ -16820,8 +16927,9 @@ if (typeof module !== 'undefined' && module.exports) {
16820
16927
  };
16821
16928
  }
16822
16929
 
16823
- // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
16824
- if (typeof /./ !== 'function') {
16930
+ // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
16931
+ // IE 11 (#1621), and in Safari 8 (#1929).
16932
+ if (typeof /./ != 'function' && typeof Int8Array != 'object') {
16825
16933
  _.isFunction = function(obj) {
16826
16934
  return typeof obj == 'function' || false;
16827
16935
  };
@@ -16884,28 +16992,30 @@ if (typeof module !== 'undefined' && module.exports) {
16884
16992
 
16885
16993
  _.property = function(key) {
16886
16994
  return function(obj) {
16995
+ return obj == null ? void 0 : obj[key];
16996
+ };
16997
+ };
16998
+
16999
+ // Generates a function for a given object that returns a given property.
17000
+ _.propertyOf = function(obj) {
17001
+ return obj == null ? function(){} : function(key) {
16887
17002
  return obj[key];
16888
17003
  };
16889
17004
  };
16890
17005
 
16891
- // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
16892
- _.matches = function(attrs) {
16893
- var pairs = _.pairs(attrs), length = pairs.length;
17006
+ // Returns a predicate for checking whether an object has a given set of
17007
+ // `key:value` pairs.
17008
+ _.matcher = _.matches = function(attrs) {
17009
+ attrs = _.extendOwn({}, attrs);
16894
17010
  return function(obj) {
16895
- if (obj == null) return !length;
16896
- obj = new Object(obj);
16897
- for (var i = 0; i < length; i++) {
16898
- var pair = pairs[i], key = pair[0];
16899
- if (pair[1] !== obj[key] || !(key in obj)) return false;
16900
- }
16901
- return true;
17011
+ return _.isMatch(obj, attrs);
16902
17012
  };
16903
17013
  };
16904
17014
 
16905
17015
  // Run a function **n** times.
16906
17016
  _.times = function(n, iteratee, context) {
16907
17017
  var accum = Array(Math.max(0, n));
16908
- iteratee = createCallback(iteratee, context, 1);
17018
+ iteratee = optimizeCb(iteratee, context, 1);
16909
17019
  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
16910
17020
  return accum;
16911
17021
  };
@@ -16954,10 +17064,12 @@ if (typeof module !== 'undefined' && module.exports) {
16954
17064
 
16955
17065
  // If the value of the named `property` is a function then invoke it with the
16956
17066
  // `object` as context; otherwise, return it.
16957
- _.result = function(object, property) {
16958
- if (object == null) return void 0;
16959
- var value = object[property];
16960
- return _.isFunction(value) ? object[property]() : value;
17067
+ _.result = function(object, property, fallback) {
17068
+ var value = object == null ? void 0 : object[property];
17069
+ if (value === void 0) {
17070
+ value = fallback;
17071
+ }
17072
+ return _.isFunction(value) ? value.call(object) : value;
16961
17073
  };
16962
17074
 
16963
17075
  // Generate a unique integer id (unique within the entire client session).
@@ -17072,8 +17184,8 @@ if (typeof module !== 'undefined' && module.exports) {
17072
17184
  // underscore functions. Wrapped objects may be chained.
17073
17185
 
17074
17186
  // Helper function to continue chaining intermediate results.
17075
- var result = function(obj) {
17076
- return this._chain ? _(obj).chain() : obj;
17187
+ var result = function(instance, obj) {
17188
+ return instance._chain ? _(obj).chain() : obj;
17077
17189
  };
17078
17190
 
17079
17191
  // Add your own custom functions to the Underscore object.
@@ -17083,7 +17195,7 @@ if (typeof module !== 'undefined' && module.exports) {
17083
17195
  _.prototype[name] = function() {
17084
17196
  var args = [this._wrapped];
17085
17197
  push.apply(args, arguments);
17086
- return result.call(this, func.apply(_, args));
17198
+ return result(this, func.apply(_, args));
17087
17199
  };
17088
17200
  });
17089
17201
  };
@@ -17098,7 +17210,7 @@ if (typeof module !== 'undefined' && module.exports) {
17098
17210
  var obj = this._wrapped;
17099
17211
  method.apply(obj, arguments);
17100
17212
  if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
17101
- return result.call(this, obj);
17213
+ return result(this, obj);
17102
17214
  };
17103
17215
  });
17104
17216
 
@@ -17106,7 +17218,7 @@ if (typeof module !== 'undefined' && module.exports) {
17106
17218
  _.each(['concat', 'join', 'slice'], function(name) {
17107
17219
  var method = ArrayProto[name];
17108
17220
  _.prototype[name] = function() {
17109
- return result.call(this, method.apply(this._wrapped, arguments));
17221
+ return result(this, method.apply(this._wrapped, arguments));
17110
17222
  };
17111
17223
  });
17112
17224
 
@@ -17115,6 +17227,14 @@ if (typeof module !== 'undefined' && module.exports) {
17115
17227
  return this._wrapped;
17116
17228
  };
17117
17229
 
17230
+ // Provide unwrapping proxy for some methods used in engine operations
17231
+ // such as arithmetic and JSON stringification.
17232
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
17233
+
17234
+ _.prototype.toString = function() {
17235
+ return '' + this._wrapped;
17236
+ };
17237
+
17118
17238
  // AMD registration happens at the end for compatibility with AMD loaders
17119
17239
  // that may not enforce next-turn semantics on modules. Even though general
17120
17240
  // practice for AMD registration is to be anonymous, underscore registers