-
-
Save alunny/d79798d417959489172aa60e8dd4b253 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******/ (function(modules) { // webpackBootstrap | |
/******/ // The module cache | |
/******/ var installedModules = {}; | |
/******/ // The require function | |
/******/ function __webpack_require__(moduleId) { | |
/******/ // Check if module is in cache | |
/******/ if(installedModules[moduleId]) | |
/******/ return installedModules[moduleId].exports; | |
/******/ // Create a new module (and put it into the cache) | |
/******/ var module = installedModules[moduleId] = { | |
/******/ exports: {}, | |
/******/ id: moduleId, | |
/******/ loaded: false | |
/******/ }; | |
/******/ // Execute the module function | |
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | |
/******/ // Flag the module as loaded | |
/******/ module.loaded = true; | |
/******/ // Return the exports of the module | |
/******/ return module.exports; | |
/******/ } | |
/******/ // expose the modules object (__webpack_modules__) | |
/******/ __webpack_require__.m = modules; | |
/******/ // expose the module cache | |
/******/ __webpack_require__.c = installedModules; | |
/******/ // __webpack_public_path__ | |
/******/ __webpack_require__.p = ""; | |
/******/ // Load entry module and return exports | |
/******/ return __webpack_require__(0); | |
/******/ }) | |
/************************************************************************/ | |
/******/ ([ | |
/* 0 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var normalizr = __webpack_require__(1); | |
var richTimelineSchema = __webpack_require__(99); | |
function appendResult(msg) { | |
var logNode = document.getElementById('log'); | |
var entry = document.createElement('p'); | |
var text = document.createTextNode((new Date).toISOString() + ' ' + msg); | |
entry.appendChild(text); | |
logNode.appendChild(entry); | |
} | |
function getTimeline(callback) { | |
var xhr = new XMLHttpRequest(); | |
xhr.open('GET', 'twitter_timeline.json'); | |
xhr.onreadystatechange = function () { | |
if (xhr.readyState === 4) { | |
callback(xhr.responseText); | |
} | |
} | |
xhr.send(); | |
} | |
function assert(predicate, msg) { | |
if (!predicate) { throw new Error(msg); } | |
} | |
function verifyNormalized(raw, normed) { | |
if (!normed.entities.tweets) { | |
appendResult('missing entities.tweets'); | |
} else if (!normed.entities.users) { | |
appendResult('missing entities.users'); | |
} else { | |
appendResult('looks okay'); | |
} | |
} | |
document.addEventListener('DOMContentLoaded', function () { | |
console.log('here'); | |
appendResult('loaded'); | |
setInterval(function () { | |
getTimeline(function (text) { | |
var body = JSON.parse(text); | |
var normalized = normalizr.normalize(body, richTimelineSchema); | |
verifyNormalized(body, normalized); | |
}); | |
}, 5000) | |
}, false); | |
/***/ }, | |
/* 1 */ | |
/***/ function(module, exports, __webpack_require__) { | |
'use strict'; | |
exports.__esModule = true; | |
exports.arrayOf = arrayOf; | |
exports.valuesOf = valuesOf; | |
exports.unionOf = unionOf; | |
exports.normalize = normalize; | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | |
var _EntitySchema = __webpack_require__(2); | |
var _EntitySchema2 = _interopRequireDefault(_EntitySchema); | |
var _IterableSchema = __webpack_require__(3); | |
var _IterableSchema2 = _interopRequireDefault(_IterableSchema); | |
var _UnionSchema = __webpack_require__(5); | |
var _UnionSchema2 = _interopRequireDefault(_UnionSchema); | |
var _lodashIsObject = __webpack_require__(4); | |
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject); | |
var _lodashIsEqual = __webpack_require__(6); | |
var _lodashIsEqual2 = _interopRequireDefault(_lodashIsEqual); | |
var _lodashMapValues = __webpack_require__(70); | |
var _lodashMapValues2 = _interopRequireDefault(_lodashMapValues); | |
function defaultAssignEntity(normalized, key, entity) { | |
normalized[key] = entity; | |
} | |
function visitObject(obj, schema, bag, options) { | |
var _options$assignEntity = options.assignEntity; | |
var assignEntity = _options$assignEntity === undefined ? defaultAssignEntity : _options$assignEntity; | |
var normalized = {}; | |
for (var key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
var entity = visit(obj[key], schema[key], bag, options); | |
assignEntity.call(null, normalized, key, entity); | |
} | |
} | |
return normalized; | |
} | |
function defaultMapper(iterableSchema, itemSchema, bag, options) { | |
return function (obj) { | |
return visit(obj, itemSchema, bag, options); | |
}; | |
} | |
function polymorphicMapper(iterableSchema, itemSchema, bag, options) { | |
return function (obj) { | |
var schemaKey = iterableSchema.getSchemaKey(obj); | |
var result = visit(obj, itemSchema[schemaKey], bag, options); | |
return { id: result, schema: schemaKey }; | |
}; | |
} | |
function visitIterable(obj, iterableSchema, bag, options) { | |
var itemSchema = iterableSchema.getItemSchema(); | |
var curriedItemMapper = defaultMapper(iterableSchema, itemSchema, bag, options); | |
if (Array.isArray(obj)) { | |
return obj.map(curriedItemMapper); | |
} else { | |
return _lodashMapValues2['default'](obj, curriedItemMapper); | |
} | |
} | |
function visitUnion(obj, unionSchema, bag, options) { | |
var itemSchema = unionSchema.getItemSchema(); | |
return polymorphicMapper(unionSchema, itemSchema, bag, options)(obj); | |
} | |
function defaultMergeIntoEntity(entityA, entityB, entityKey) { | |
for (var key in entityB) { | |
if (!entityB.hasOwnProperty(key)) { | |
continue; | |
} | |
if (!entityA.hasOwnProperty(key) || _lodashIsEqual2['default'](entityA[key], entityB[key])) { | |
entityA[key] = entityB[key]; | |
continue; | |
} | |
console.warn('When merging two ' + entityKey + ', found unequal data in their "' + key + '" values. Using the earlier value.', entityA[key], entityB[key]); | |
} | |
} | |
function visitEntity(entity, entitySchema, bag, options) { | |
var _options$mergeIntoEntity = options.mergeIntoEntity; | |
var mergeIntoEntity = _options$mergeIntoEntity === undefined ? defaultMergeIntoEntity : _options$mergeIntoEntity; | |
var entityKey = entitySchema.getKey(); | |
var id = entitySchema.getId(entity); | |
if (!bag.hasOwnProperty(entityKey)) { | |
bag[entityKey] = {}; | |
} | |
if (!bag[entityKey].hasOwnProperty(id)) { | |
bag[entityKey][id] = {}; | |
} | |
var stored = bag[entityKey][id]; | |
var normalized = visitObject(entity, entitySchema, bag, options); | |
mergeIntoEntity(stored, normalized, entityKey); | |
return id; | |
} | |
function visit(obj, schema, bag, options) { | |
if (!_lodashIsObject2['default'](obj) || !_lodashIsObject2['default'](schema)) { | |
return obj; | |
} | |
if (schema instanceof _EntitySchema2['default']) { | |
return visitEntity(obj, schema, bag, options); | |
} else if (schema instanceof _IterableSchema2['default']) { | |
return visitIterable(obj, schema, bag, options); | |
} else if (schema instanceof _UnionSchema2['default']) { | |
return visitUnion(obj, schema, bag, options); | |
} else { | |
return visitObject(obj, schema, bag, options); | |
} | |
} | |
function arrayOf(schema, options) { | |
return new _IterableSchema2['default'](schema, options); | |
} | |
function valuesOf(schema, options) { | |
return new _IterableSchema2['default'](schema, options); | |
} | |
function unionOf(schema, options) { | |
return new _UnionSchema2['default'](schema, options); | |
} | |
exports.Schema = _EntitySchema2['default']; | |
function normalize(obj, schema) { | |
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; | |
if (!_lodashIsObject2['default'](obj) && !Array.isArray(obj)) { | |
throw new Error('Normalize accepts an object or an array as its input.'); | |
} | |
if (!_lodashIsObject2['default'](schema) || Array.isArray(schema)) { | |
throw new Error('Normalize accepts an object for schema.'); | |
} | |
var bag = {}; | |
var result = visit(obj, schema, bag, options); | |
return { | |
entities: bag, | |
result: result | |
}; | |
} | |
/***/ }, | |
/* 2 */ | |
/***/ function(module, exports) { | |
'use strict'; | |
exports.__esModule = true; | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | |
var EntitySchema = (function () { | |
function EntitySchema(key) { | |
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
_classCallCheck(this, EntitySchema); | |
if (!key || typeof key !== 'string') { | |
throw new Error('A string non-empty key is required'); | |
} | |
this._key = key; | |
var idAttribute = options.idAttribute || 'id'; | |
this._getId = typeof idAttribute === 'function' ? idAttribute : function (x) { | |
return x[idAttribute]; | |
}; | |
this._idAttribute = idAttribute; | |
} | |
EntitySchema.prototype.getKey = function getKey() { | |
return this._key; | |
}; | |
EntitySchema.prototype.getId = function getId(entity) { | |
return this._getId(entity); | |
}; | |
EntitySchema.prototype.getIdAttribute = function getIdAttribute() { | |
return this._idAttribute; | |
}; | |
EntitySchema.prototype.define = function define(nestedSchema) { | |
for (var key in nestedSchema) { | |
if (nestedSchema.hasOwnProperty(key)) { | |
this[key] = nestedSchema[key]; | |
} | |
} | |
}; | |
return EntitySchema; | |
})(); | |
exports['default'] = EntitySchema; | |
module.exports = exports['default']; | |
/***/ }, | |
/* 3 */ | |
/***/ function(module, exports, __webpack_require__) { | |
'use strict'; | |
exports.__esModule = true; | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | |
var _lodashIsObject = __webpack_require__(4); | |
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject); | |
var _UnionSchema = __webpack_require__(5); | |
var _UnionSchema2 = _interopRequireDefault(_UnionSchema); | |
var ArraySchema = (function () { | |
function ArraySchema(itemSchema) { | |
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
_classCallCheck(this, ArraySchema); | |
if (!_lodashIsObject2['default'](itemSchema)) { | |
throw new Error('ArraySchema requires item schema to be an object.'); | |
} | |
if (options.schemaAttribute) { | |
var schemaAttribute = options.schemaAttribute; | |
this._itemSchema = new _UnionSchema2['default'](itemSchema, { schemaAttribute: schemaAttribute }); | |
} else { | |
this._itemSchema = itemSchema; | |
} | |
} | |
ArraySchema.prototype.getItemSchema = function getItemSchema() { | |
return this._itemSchema; | |
}; | |
return ArraySchema; | |
})(); | |
exports['default'] = ArraySchema; | |
module.exports = exports['default']; | |
/***/ }, | |
/* 4 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. | |
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is an object, else `false`. | |
* @example | |
* | |
* _.isObject({}); | |
* // => true | |
* | |
* _.isObject([1, 2, 3]); | |
* // => true | |
* | |
* _.isObject(_.noop); | |
* // => true | |
* | |
* _.isObject(null); | |
* // => false | |
*/ | |
function isObject(value) { | |
var type = typeof value; | |
return !!value && (type == 'object' || type == 'function'); | |
} | |
module.exports = isObject; | |
/***/ }, | |
/* 5 */ | |
/***/ function(module, exports, __webpack_require__) { | |
'use strict'; | |
exports.__esModule = true; | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | |
var _lodashIsObject = __webpack_require__(4); | |
var _lodashIsObject2 = _interopRequireDefault(_lodashIsObject); | |
var UnionSchema = (function () { | |
function UnionSchema(itemSchema, options) { | |
_classCallCheck(this, UnionSchema); | |
if (!_lodashIsObject2['default'](itemSchema)) { | |
throw new Error('UnionSchema requires item schema to be an object.'); | |
} | |
if (!options || !options.schemaAttribute) { | |
throw new Error('UnionSchema requires schemaAttribute option.'); | |
} | |
this._itemSchema = itemSchema; | |
var schemaAttribute = options.schemaAttribute; | |
this._getSchema = typeof schemaAttribute === 'function' ? schemaAttribute : function (x) { | |
return x[schemaAttribute]; | |
}; | |
} | |
UnionSchema.prototype.getItemSchema = function getItemSchema() { | |
return this._itemSchema; | |
}; | |
UnionSchema.prototype.getSchemaKey = function getSchemaKey(item) { | |
return this._getSchema(item); | |
}; | |
return UnionSchema; | |
})(); | |
exports['default'] = UnionSchema; | |
module.exports = exports['default']; | |
/***/ }, | |
/* 6 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseIsEqual = __webpack_require__(7); | |
/** | |
* Performs a deep comparison between two values to determine if they are | |
* equivalent. | |
* | |
* **Note:** This method supports comparing arrays, array buffers, booleans, | |
* date objects, error objects, maps, numbers, `Object` objects, regexes, | |
* sets, strings, symbols, and typed arrays. `Object` objects are compared | |
* by their own, not inherited, enumerable properties. Functions and DOM | |
* nodes are **not** supported. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to compare. | |
* @param {*} other The other value to compare. | |
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
* @example | |
* | |
* var object = { 'user': 'fred' }; | |
* var other = { 'user': 'fred' }; | |
* | |
* _.isEqual(object, other); | |
* // => true | |
* | |
* object === other; | |
* // => false | |
*/ | |
function isEqual(value, other) { | |
return baseIsEqual(value, other); | |
} | |
module.exports = isEqual; | |
/***/ }, | |
/* 7 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseIsEqualDeep = __webpack_require__(8), | |
isObject = __webpack_require__(4), | |
isObjectLike = __webpack_require__(28); | |
/** | |
* The base implementation of `_.isEqual` which supports partial comparisons | |
* and tracks traversed objects. | |
* | |
* @private | |
* @param {*} value The value to compare. | |
* @param {*} other The other value to compare. | |
* @param {Function} [customizer] The function to customize comparisons. | |
* @param {boolean} [bitmask] The bitmask of comparison flags. | |
* The bitmask may be composed of the following flags: | |
* 1 - Unordered comparison | |
* 2 - Partial comparison | |
* @param {Object} [stack] Tracks traversed `value` and `other` objects. | |
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
*/ | |
function baseIsEqual(value, other, customizer, bitmask, stack) { | |
if (value === other) { | |
return true; | |
} | |
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { | |
return value !== value && other !== other; | |
} | |
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); | |
} | |
module.exports = baseIsEqual; | |
/***/ }, | |
/* 8 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Stack = __webpack_require__(9), | |
equalArrays = __webpack_require__(43), | |
equalByTag = __webpack_require__(45), | |
equalObjects = __webpack_require__(50), | |
getTag = __webpack_require__(66), | |
isArray = __webpack_require__(62), | |
isHostObject = __webpack_require__(27), | |
isTypedArray = __webpack_require__(69); | |
/** Used to compose bitmasks for comparison styles. */ | |
var PARTIAL_COMPARE_FLAG = 2; | |
/** `Object#toString` result references. */ | |
var argsTag = '[object Arguments]', | |
arrayTag = '[object Array]', | |
objectTag = '[object Object]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** | |
* A specialized version of `baseIsEqual` for arrays and objects which performs | |
* deep comparisons and tracks traversed objects enabling objects with circular | |
* references to be compared. | |
* | |
* @private | |
* @param {Object} object The object to compare. | |
* @param {Object} other The other object to compare. | |
* @param {Function} equalFunc The function to determine equivalents of values. | |
* @param {Function} [customizer] The function to customize comparisons. | |
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` for more details. | |
* @param {Object} [stack] Tracks traversed `object` and `other` objects. | |
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
*/ | |
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { | |
var objIsArr = isArray(object), | |
othIsArr = isArray(other), | |
objTag = arrayTag, | |
othTag = arrayTag; | |
if (!objIsArr) { | |
objTag = getTag(object); | |
objTag = objTag == argsTag ? objectTag : objTag; | |
} | |
if (!othIsArr) { | |
othTag = getTag(other); | |
othTag = othTag == argsTag ? objectTag : othTag; | |
} | |
var objIsObj = objTag == objectTag && !isHostObject(object), | |
othIsObj = othTag == objectTag && !isHostObject(other), | |
isSameTag = objTag == othTag; | |
if (isSameTag && !objIsObj) { | |
stack || (stack = new Stack); | |
return (objIsArr || isTypedArray(object)) | |
? equalArrays(object, other, equalFunc, customizer, bitmask, stack) | |
: equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); | |
} | |
if (!(bitmask & PARTIAL_COMPARE_FLAG)) { | |
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), | |
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); | |
if (objIsWrapped || othIsWrapped) { | |
stack || (stack = new Stack); | |
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, bitmask, stack); | |
} | |
} | |
if (!isSameTag) { | |
return false; | |
} | |
stack || (stack = new Stack); | |
return equalObjects(object, other, equalFunc, customizer, bitmask, stack); | |
} | |
module.exports = baseIsEqualDeep; | |
/***/ }, | |
/* 9 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var stackClear = __webpack_require__(10), | |
stackDelete = __webpack_require__(11), | |
stackGet = __webpack_require__(15), | |
stackHas = __webpack_require__(17), | |
stackSet = __webpack_require__(19); | |
/** | |
* Creates a stack cache object to store key-value pairs. | |
* | |
* @private | |
* @constructor | |
* @param {Array} [values] The values to cache. | |
*/ | |
function Stack(values) { | |
var index = -1, | |
length = values ? values.length : 0; | |
this.clear(); | |
while (++index < length) { | |
var entry = values[index]; | |
this.set(entry[0], entry[1]); | |
} | |
} | |
// Add functions to the `Stack` cache. | |
Stack.prototype.clear = stackClear; | |
Stack.prototype['delete'] = stackDelete; | |
Stack.prototype.get = stackGet; | |
Stack.prototype.has = stackHas; | |
Stack.prototype.set = stackSet; | |
module.exports = Stack; | |
/***/ }, | |
/* 10 */ | |
/***/ function(module, exports) { | |
/** | |
* Removes all key-value entries from the stack. | |
* | |
* @private | |
* @name clear | |
* @memberOf Stack | |
*/ | |
function stackClear() { | |
this.__data__ = { 'array': [], 'map': null }; | |
} | |
module.exports = stackClear; | |
/***/ }, | |
/* 11 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocDelete = __webpack_require__(12); | |
/** | |
* Removes `key` and its value from the stack. | |
* | |
* @private | |
* @name delete | |
* @memberOf Stack | |
* @param {string} key The key of the value to remove. | |
* @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
*/ | |
function stackDelete(key) { | |
var data = this.__data__, | |
array = data.array; | |
return array ? assocDelete(array, key) : data.map['delete'](key); | |
} | |
module.exports = stackDelete; | |
/***/ }, | |
/* 12 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocIndexOf = __webpack_require__(13); | |
/** Used for built-in method references. */ | |
var arrayProto = Array.prototype; | |
/** Built-in value references. */ | |
var splice = arrayProto.splice; | |
/** | |
* Removes `key` and its value from the associative array. | |
* | |
* @private | |
* @param {Array} array The array to query. | |
* @param {string} key The key of the value to remove. | |
* @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
*/ | |
function assocDelete(array, key) { | |
var index = assocIndexOf(array, key); | |
if (index < 0) { | |
return false; | |
} | |
var lastIndex = array.length - 1; | |
if (index == lastIndex) { | |
array.pop(); | |
} else { | |
splice.call(array, index, 1); | |
} | |
return true; | |
} | |
module.exports = assocDelete; | |
/***/ }, | |
/* 13 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var eq = __webpack_require__(14); | |
/** | |
* Gets the index at which the first occurrence of `key` is found in `array` | |
* of key-value pairs. | |
* | |
* @private | |
* @param {Array} array The array to search. | |
* @param {*} key The key to search for. | |
* @returns {number} Returns the index of the matched value, else `-1`. | |
*/ | |
function assocIndexOf(array, key) { | |
var length = array.length; | |
while (length--) { | |
if (eq(array[length][0], key)) { | |
return length; | |
} | |
} | |
return -1; | |
} | |
module.exports = assocIndexOf; | |
/***/ }, | |
/* 14 */ | |
/***/ function(module, exports) { | |
/** | |
* Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) | |
* comparison between two values to determine if they are equivalent. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to compare. | |
* @param {*} other The other value to compare. | |
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. | |
* @example | |
* | |
* var object = { 'user': 'fred' }; | |
* var other = { 'user': 'fred' }; | |
* | |
* _.eq(object, object); | |
* // => true | |
* | |
* _.eq(object, other); | |
* // => false | |
* | |
* _.eq('a', 'a'); | |
* // => true | |
* | |
* _.eq('a', Object('a')); | |
* // => false | |
* | |
* _.eq(NaN, NaN); | |
* // => true | |
*/ | |
function eq(value, other) { | |
return value === other || (value !== value && other !== other); | |
} | |
module.exports = eq; | |
/***/ }, | |
/* 15 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocGet = __webpack_require__(16); | |
/** | |
* Gets the stack value for `key`. | |
* | |
* @private | |
* @name get | |
* @memberOf Stack | |
* @param {string} key The key of the value to get. | |
* @returns {*} Returns the entry value. | |
*/ | |
function stackGet(key) { | |
var data = this.__data__, | |
array = data.array; | |
return array ? assocGet(array, key) : data.map.get(key); | |
} | |
module.exports = stackGet; | |
/***/ }, | |
/* 16 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocIndexOf = __webpack_require__(13); | |
/** | |
* Gets the associative array value for `key`. | |
* | |
* @private | |
* @param {Array} array The array to query. | |
* @param {string} key The key of the value to get. | |
* @returns {*} Returns the entry value. | |
*/ | |
function assocGet(array, key) { | |
var index = assocIndexOf(array, key); | |
return index < 0 ? undefined : array[index][1]; | |
} | |
module.exports = assocGet; | |
/***/ }, | |
/* 17 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocHas = __webpack_require__(18); | |
/** | |
* Checks if a stack value for `key` exists. | |
* | |
* @private | |
* @name has | |
* @memberOf Stack | |
* @param {string} key The key of the entry to check. | |
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
*/ | |
function stackHas(key) { | |
var data = this.__data__, | |
array = data.array; | |
return array ? assocHas(array, key) : data.map.has(key); | |
} | |
module.exports = stackHas; | |
/***/ }, | |
/* 18 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocIndexOf = __webpack_require__(13); | |
/** | |
* Checks if an associative array value for `key` exists. | |
* | |
* @private | |
* @param {Array} array The array to query. | |
* @param {string} key The key of the entry to check. | |
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
*/ | |
function assocHas(array, key) { | |
return assocIndexOf(array, key) > -1; | |
} | |
module.exports = assocHas; | |
/***/ }, | |
/* 19 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var MapCache = __webpack_require__(20), | |
assocSet = __webpack_require__(41); | |
/** Used as the size to enable large array optimizations. */ | |
var LARGE_ARRAY_SIZE = 200; | |
/** | |
* Sets the stack `key` to `value`. | |
* | |
* @private | |
* @name set | |
* @memberOf Stack | |
* @param {string} key The key of the value to set. | |
* @param {*} value The value to set. | |
* @returns {Object} Returns the stack cache object. | |
*/ | |
function stackSet(key, value) { | |
var data = this.__data__, | |
array = data.array; | |
if (array) { | |
if (array.length < (LARGE_ARRAY_SIZE - 1)) { | |
assocSet(array, key, value); | |
} else { | |
data.array = null; | |
data.map = new MapCache(array); | |
} | |
} | |
var map = data.map; | |
if (map) { | |
map.set(key, value); | |
} | |
return this; | |
} | |
module.exports = stackSet; | |
/***/ }, | |
/* 20 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var mapClear = __webpack_require__(21), | |
mapDelete = __webpack_require__(33), | |
mapGet = __webpack_require__(37), | |
mapHas = __webpack_require__(39), | |
mapSet = __webpack_require__(40); | |
/** | |
* Creates a map cache object to store key-value pairs. | |
* | |
* @private | |
* @constructor | |
* @param {Array} [values] The values to cache. | |
*/ | |
function MapCache(values) { | |
var index = -1, | |
length = values ? values.length : 0; | |
this.clear(); | |
while (++index < length) { | |
var entry = values[index]; | |
this.set(entry[0], entry[1]); | |
} | |
} | |
// Add functions to the `MapCache`. | |
MapCache.prototype.clear = mapClear; | |
MapCache.prototype['delete'] = mapDelete; | |
MapCache.prototype.get = mapGet; | |
MapCache.prototype.has = mapHas; | |
MapCache.prototype.set = mapSet; | |
module.exports = MapCache; | |
/***/ }, | |
/* 21 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Hash = __webpack_require__(22), | |
Map = __webpack_require__(29); | |
/** | |
* Removes all key-value entries from the map. | |
* | |
* @private | |
* @name clear | |
* @memberOf MapCache | |
*/ | |
function mapClear() { | |
this.__data__ = { | |
'hash': new Hash, | |
'map': Map ? new Map : [], | |
'string': new Hash | |
}; | |
} | |
module.exports = mapClear; | |
/***/ }, | |
/* 22 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var nativeCreate = __webpack_require__(23); | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Creates an hash object. | |
* | |
* @private | |
* @constructor | |
* @returns {Object} Returns the new hash object. | |
*/ | |
function Hash() {} | |
// Avoid inheriting from `Object.prototype` when possible. | |
Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto; | |
module.exports = Hash; | |
/***/ }, | |
/* 23 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var getNative = __webpack_require__(24); | |
/* Built-in method references that are verified to be native. */ | |
var nativeCreate = getNative(Object, 'create'); | |
module.exports = nativeCreate; | |
/***/ }, | |
/* 24 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isNative = __webpack_require__(25); | |
/** | |
* Gets the native function at `key` of `object`. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {string} key The key of the method to get. | |
* @returns {*} Returns the function if it's native, else `undefined`. | |
*/ | |
function getNative(object, key) { | |
var value = object[key]; | |
return isNative(value) ? value : undefined; | |
} | |
module.exports = getNative; | |
/***/ }, | |
/* 25 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isFunction = __webpack_require__(26), | |
isHostObject = __webpack_require__(27), | |
isObjectLike = __webpack_require__(28); | |
/** Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns). */ | |
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; | |
/** Used to detect host constructors (Safari > 5). */ | |
var reIsHostCtor = /^\[object .+?Constructor\]$/; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to resolve the decompiled source of functions. */ | |
var funcToString = Function.prototype.toString; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** Used to detect if a method is native. */ | |
var reIsNative = RegExp('^' + | |
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') | |
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' | |
); | |
/** | |
* Checks if `value` is a native function. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is a native function, else `false`. | |
* @example | |
* | |
* _.isNative(Array.prototype.push); | |
* // => true | |
* | |
* _.isNative(_); | |
* // => false | |
*/ | |
function isNative(value) { | |
if (value == null) { | |
return false; | |
} | |
if (isFunction(value)) { | |
return reIsNative.test(funcToString.call(value)); | |
} | |
return isObjectLike(value) && | |
(isHostObject(value) ? reIsNative : reIsHostCtor).test(value); | |
} | |
module.exports = isNative; | |
/***/ }, | |
/* 26 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isObject = __webpack_require__(4); | |
/** `Object#toString` result references. */ | |
var funcTag = '[object Function]', | |
genTag = '[object GeneratorFunction]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** | |
* Checks if `value` is classified as a `Function` object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isFunction(_); | |
* // => true | |
* | |
* _.isFunction(/abc/); | |
* // => false | |
*/ | |
function isFunction(value) { | |
// The use of `Object#toString` avoids issues with the `typeof` operator | |
// in Safari 8 which returns 'object' for typed array and weak map constructors, | |
// and PhantomJS 1.9 which returns 'function' for `NodeList` instances. | |
var tag = isObject(value) ? objectToString.call(value) : ''; | |
return tag == funcTag || tag == genTag; | |
} | |
module.exports = isFunction; | |
/***/ }, | |
/* 27 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is a host object in IE < 9. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is a host object, else `false`. | |
*/ | |
function isHostObject(value) { | |
// Many host objects are `Object` objects that can coerce to strings | |
// despite having improperly defined `toString` methods. | |
var result = false; | |
if (value != null && typeof value.toString != 'function') { | |
try { | |
result = !!(value + ''); | |
} catch (e) {} | |
} | |
return result; | |
} | |
module.exports = isHostObject; | |
/***/ }, | |
/* 28 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is object-like. A value is object-like if it's not `null` | |
* and has a `typeof` result of "object". | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. | |
* @example | |
* | |
* _.isObjectLike({}); | |
* // => true | |
* | |
* _.isObjectLike([1, 2, 3]); | |
* // => true | |
* | |
* _.isObjectLike(_.noop); | |
* // => false | |
* | |
* _.isObjectLike(null); | |
* // => false | |
*/ | |
function isObjectLike(value) { | |
return !!value && typeof value == 'object'; | |
} | |
module.exports = isObjectLike; | |
/***/ }, | |
/* 29 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var getNative = __webpack_require__(24), | |
root = __webpack_require__(30); | |
/* Built-in method references that are verified to be native. */ | |
var Map = getNative(root, 'Map'); | |
module.exports = Map; | |
/***/ }, | |
/* 30 */ | |
/***/ function(module, exports, __webpack_require__) { | |
/* WEBPACK VAR INJECTION */(function(module, global) {var checkGlobal = __webpack_require__(32); | |
/** Used to determine if values are of the language type `Object`. */ | |
var objectTypes = { | |
'function': true, | |
'object': true | |
}; | |
/** Detect free variable `exports`. */ | |
var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) | |
? exports | |
: undefined; | |
/** Detect free variable `module`. */ | |
var freeModule = (objectTypes[typeof module] && module && !module.nodeType) | |
? module | |
: undefined; | |
/** Detect free variable `global` from Node.js. */ | |
var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global); | |
/** Detect free variable `self`. */ | |
var freeSelf = checkGlobal(objectTypes[typeof self] && self); | |
/** Detect free variable `window`. */ | |
var freeWindow = checkGlobal(objectTypes[typeof window] && window); | |
/** Detect `this` as the global object. */ | |
var thisGlobal = checkGlobal(objectTypes[typeof this] && this); | |
/** | |
* Used as a reference to the global object. | |
* | |
* The `this` value is used if it's the global object to avoid Greasemonkey's | |
* restricted `window` object, otherwise the `window` object is used. | |
*/ | |
var root = freeGlobal || | |
((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || | |
freeSelf || thisGlobal || Function('return this')(); | |
module.exports = root; | |
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(31)(module), (function() { return this; }()))) | |
/***/ }, | |
/* 31 */ | |
/***/ function(module, exports) { | |
module.exports = function(module) { | |
if(!module.webpackPolyfill) { | |
module.deprecate = function() {}; | |
module.paths = []; | |
// module.parent = undefined by default | |
module.children = []; | |
module.webpackPolyfill = 1; | |
} | |
return module; | |
} | |
/***/ }, | |
/* 32 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is a global object. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @returns {null|Object} Returns `value` if it's a global object, else `null`. | |
*/ | |
function checkGlobal(value) { | |
return (value && value.Object === Object) ? value : null; | |
} | |
module.exports = checkGlobal; | |
/***/ }, | |
/* 33 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Map = __webpack_require__(29), | |
assocDelete = __webpack_require__(12), | |
hashDelete = __webpack_require__(34), | |
isKeyable = __webpack_require__(36); | |
/** | |
* Removes `key` and its value from the map. | |
* | |
* @private | |
* @name delete | |
* @memberOf MapCache | |
* @param {string} key The key of the value to remove. | |
* @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
*/ | |
function mapDelete(key) { | |
var data = this.__data__; | |
if (isKeyable(key)) { | |
return hashDelete(typeof key == 'string' ? data.string : data.hash, key); | |
} | |
return Map ? data.map['delete'](key) : assocDelete(data.map, key); | |
} | |
module.exports = mapDelete; | |
/***/ }, | |
/* 34 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var hashHas = __webpack_require__(35); | |
/** | |
* Removes `key` and its value from the hash. | |
* | |
* @private | |
* @param {Object} hash The hash to modify. | |
* @param {string} key The key of the value to remove. | |
* @returns {boolean} Returns `true` if the entry was removed, else `false`. | |
*/ | |
function hashDelete(hash, key) { | |
return hashHas(hash, key) && delete hash[key]; | |
} | |
module.exports = hashDelete; | |
/***/ }, | |
/* 35 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var nativeCreate = __webpack_require__(23); | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** | |
* Checks if a hash value for `key` exists. | |
* | |
* @private | |
* @param {Object} hash The hash to query. | |
* @param {string} key The key of the entry to check. | |
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
*/ | |
function hashHas(hash, key) { | |
return nativeCreate ? hash[key] !== undefined : hasOwnProperty.call(hash, key); | |
} | |
module.exports = hashHas; | |
/***/ }, | |
/* 36 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is suitable for use as unique object key. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is suitable, else `false`. | |
*/ | |
function isKeyable(value) { | |
var type = typeof value; | |
return type == 'number' || type == 'boolean' || | |
(type == 'string' && value != '__proto__') || value == null; | |
} | |
module.exports = isKeyable; | |
/***/ }, | |
/* 37 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Map = __webpack_require__(29), | |
assocGet = __webpack_require__(16), | |
hashGet = __webpack_require__(38), | |
isKeyable = __webpack_require__(36); | |
/** | |
* Gets the map value for `key`. | |
* | |
* @private | |
* @name get | |
* @memberOf MapCache | |
* @param {string} key The key of the value to get. | |
* @returns {*} Returns the entry value. | |
*/ | |
function mapGet(key) { | |
var data = this.__data__; | |
if (isKeyable(key)) { | |
return hashGet(typeof key == 'string' ? data.string : data.hash, key); | |
} | |
return Map ? data.map.get(key) : assocGet(data.map, key); | |
} | |
module.exports = mapGet; | |
/***/ }, | |
/* 38 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var nativeCreate = __webpack_require__(23); | |
/** Used to stand-in for `undefined` hash values. */ | |
var HASH_UNDEFINED = '__lodash_hash_undefined__'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** | |
* Gets the hash value for `key`. | |
* | |
* @private | |
* @param {Object} hash The hash to query. | |
* @param {string} key The key of the value to get. | |
* @returns {*} Returns the entry value. | |
*/ | |
function hashGet(hash, key) { | |
if (nativeCreate) { | |
var result = hash[key]; | |
return result === HASH_UNDEFINED ? undefined : result; | |
} | |
return hasOwnProperty.call(hash, key) ? hash[key] : undefined; | |
} | |
module.exports = hashGet; | |
/***/ }, | |
/* 39 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Map = __webpack_require__(29), | |
assocHas = __webpack_require__(18), | |
hashHas = __webpack_require__(35), | |
isKeyable = __webpack_require__(36); | |
/** | |
* Checks if a map value for `key` exists. | |
* | |
* @private | |
* @name has | |
* @memberOf MapCache | |
* @param {string} key The key of the entry to check. | |
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. | |
*/ | |
function mapHas(key) { | |
var data = this.__data__; | |
if (isKeyable(key)) { | |
return hashHas(typeof key == 'string' ? data.string : data.hash, key); | |
} | |
return Map ? data.map.has(key) : assocHas(data.map, key); | |
} | |
module.exports = mapHas; | |
/***/ }, | |
/* 40 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Map = __webpack_require__(29), | |
assocSet = __webpack_require__(41), | |
hashSet = __webpack_require__(42), | |
isKeyable = __webpack_require__(36); | |
/** | |
* Sets the map `key` to `value`. | |
* | |
* @private | |
* @name set | |
* @memberOf MapCache | |
* @param {string} key The key of the value to set. | |
* @param {*} value The value to set. | |
* @returns {Object} Returns the map cache object. | |
*/ | |
function mapSet(key, value) { | |
var data = this.__data__; | |
if (isKeyable(key)) { | |
hashSet(typeof key == 'string' ? data.string : data.hash, key, value); | |
} else if (Map) { | |
data.map.set(key, value); | |
} else { | |
assocSet(data.map, key, value); | |
} | |
return this; | |
} | |
module.exports = mapSet; | |
/***/ }, | |
/* 41 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var assocIndexOf = __webpack_require__(13); | |
/** | |
* Sets the associative array `key` to `value`. | |
* | |
* @private | |
* @param {Array} array The array to modify. | |
* @param {string} key The key of the value to set. | |
* @param {*} value The value to set. | |
*/ | |
function assocSet(array, key, value) { | |
var index = assocIndexOf(array, key); | |
if (index < 0) { | |
array.push([key, value]); | |
} else { | |
array[index][1] = value; | |
} | |
} | |
module.exports = assocSet; | |
/***/ }, | |
/* 42 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var nativeCreate = __webpack_require__(23); | |
/** Used to stand-in for `undefined` hash values. */ | |
var HASH_UNDEFINED = '__lodash_hash_undefined__'; | |
/** | |
* Sets the hash `key` to `value`. | |
* | |
* @private | |
* @param {Object} hash The hash to modify. | |
* @param {string} key The key of the value to set. | |
* @param {*} value The value to set. | |
*/ | |
function hashSet(hash, key, value) { | |
hash[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; | |
} | |
module.exports = hashSet; | |
/***/ }, | |
/* 43 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var arraySome = __webpack_require__(44); | |
/** Used to compose bitmasks for comparison styles. */ | |
var UNORDERED_COMPARE_FLAG = 1, | |
PARTIAL_COMPARE_FLAG = 2; | |
/** | |
* A specialized version of `baseIsEqualDeep` for arrays with support for | |
* partial deep comparisons. | |
* | |
* @private | |
* @param {Array} array The array to compare. | |
* @param {Array} other The other array to compare. | |
* @param {Function} equalFunc The function to determine equivalents of values. | |
* @param {Function} customizer The function to customize comparisons. | |
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. | |
* @param {Object} stack Tracks traversed `array` and `other` objects. | |
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. | |
*/ | |
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { | |
var index = -1, | |
isPartial = bitmask & PARTIAL_COMPARE_FLAG, | |
isUnordered = bitmask & UNORDERED_COMPARE_FLAG, | |
arrLength = array.length, | |
othLength = other.length; | |
if (arrLength != othLength && !(isPartial && othLength > arrLength)) { | |
return false; | |
} | |
// Assume cyclic values are equal. | |
var stacked = stack.get(array); | |
if (stacked) { | |
return stacked == other; | |
} | |
var result = true; | |
stack.set(array, other); | |
// Ignore non-index properties. | |
while (++index < arrLength) { | |
var arrValue = array[index], | |
othValue = other[index]; | |
if (customizer) { | |
var compared = isPartial | |
? customizer(othValue, arrValue, index, other, array, stack) | |
: customizer(arrValue, othValue, index, array, other, stack); | |
} | |
if (compared !== undefined) { | |
if (compared) { | |
continue; | |
} | |
result = false; | |
break; | |
} | |
// Recursively compare arrays (susceptible to call stack limits). | |
if (isUnordered) { | |
if (!arraySome(other, function(othValue) { | |
return arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack); | |
})) { | |
result = false; | |
break; | |
} | |
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { | |
result = false; | |
break; | |
} | |
} | |
stack['delete'](array); | |
return result; | |
} | |
module.exports = equalArrays; | |
/***/ }, | |
/* 44 */ | |
/***/ function(module, exports) { | |
/** | |
* A specialized version of `_.some` for arrays without support for iteratee | |
* shorthands. | |
* | |
* @private | |
* @param {Array} array The array to iterate over. | |
* @param {Function} predicate The function invoked per iteration. | |
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`. | |
*/ | |
function arraySome(array, predicate) { | |
var index = -1, | |
length = array.length; | |
while (++index < length) { | |
if (predicate(array[index], index, array)) { | |
return true; | |
} | |
} | |
return false; | |
} | |
module.exports = arraySome; | |
/***/ }, | |
/* 45 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Symbol = __webpack_require__(46), | |
Uint8Array = __webpack_require__(47), | |
equalArrays = __webpack_require__(43), | |
mapToArray = __webpack_require__(48), | |
setToArray = __webpack_require__(49); | |
/** Used to compose bitmasks for comparison styles. */ | |
var UNORDERED_COMPARE_FLAG = 1, | |
PARTIAL_COMPARE_FLAG = 2; | |
/** `Object#toString` result references. */ | |
var boolTag = '[object Boolean]', | |
dateTag = '[object Date]', | |
errorTag = '[object Error]', | |
mapTag = '[object Map]', | |
numberTag = '[object Number]', | |
regexpTag = '[object RegExp]', | |
setTag = '[object Set]', | |
stringTag = '[object String]', | |
symbolTag = '[object Symbol]'; | |
var arrayBufferTag = '[object ArrayBuffer]'; | |
/** Used to convert symbols to primitives and strings. */ | |
var symbolProto = Symbol ? Symbol.prototype : undefined, | |
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; | |
/** | |
* A specialized version of `baseIsEqualDeep` for comparing objects of | |
* the same `toStringTag`. | |
* | |
* **Note:** This function only supports comparing values with tags of | |
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. | |
* | |
* @private | |
* @param {Object} object The object to compare. | |
* @param {Object} other The other object to compare. | |
* @param {string} tag The `toStringTag` of the objects to compare. | |
* @param {Function} equalFunc The function to determine equivalents of values. | |
* @param {Function} customizer The function to customize comparisons. | |
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. | |
* @param {Object} stack Tracks traversed `object` and `other` objects. | |
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
*/ | |
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { | |
switch (tag) { | |
case arrayBufferTag: | |
if ((object.byteLength != other.byteLength) || | |
!equalFunc(new Uint8Array(object), new Uint8Array(other))) { | |
return false; | |
} | |
return true; | |
case boolTag: | |
case dateTag: | |
// Coerce dates and booleans to numbers, dates to milliseconds and booleans | |
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal. | |
return +object == +other; | |
case errorTag: | |
return object.name == other.name && object.message == other.message; | |
case numberTag: | |
// Treat `NaN` vs. `NaN` as equal. | |
return (object != +object) ? other != +other : object == +other; | |
case regexpTag: | |
case stringTag: | |
// Coerce regexes to strings and treat strings primitives and string | |
// objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. | |
return object == (other + ''); | |
case mapTag: | |
var convert = mapToArray; | |
case setTag: | |
var isPartial = bitmask & PARTIAL_COMPARE_FLAG; | |
convert || (convert = setToArray); | |
if (object.size != other.size && !isPartial) { | |
return false; | |
} | |
// Assume cyclic values are equal. | |
var stacked = stack.get(object); | |
if (stacked) { | |
return stacked == other; | |
} | |
// Recursively compare objects (susceptible to call stack limits). | |
return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask | UNORDERED_COMPARE_FLAG, stack.set(object, other)); | |
case symbolTag: | |
if (symbolValueOf) { | |
return symbolValueOf.call(object) == symbolValueOf.call(other); | |
} | |
} | |
return false; | |
} | |
module.exports = equalByTag; | |
/***/ }, | |
/* 46 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var root = __webpack_require__(30); | |
/** Built-in value references. */ | |
var Symbol = root.Symbol; | |
module.exports = Symbol; | |
/***/ }, | |
/* 47 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var root = __webpack_require__(30); | |
/** Built-in value references. */ | |
var Uint8Array = root.Uint8Array; | |
module.exports = Uint8Array; | |
/***/ }, | |
/* 48 */ | |
/***/ function(module, exports) { | |
/** | |
* Converts `map` to an array. | |
* | |
* @private | |
* @param {Object} map The map to convert. | |
* @returns {Array} Returns the converted array. | |
*/ | |
function mapToArray(map) { | |
var index = -1, | |
result = Array(map.size); | |
map.forEach(function(value, key) { | |
result[++index] = [key, value]; | |
}); | |
return result; | |
} | |
module.exports = mapToArray; | |
/***/ }, | |
/* 49 */ | |
/***/ function(module, exports) { | |
/** | |
* Converts `set` to an array. | |
* | |
* @private | |
* @param {Object} set The set to convert. | |
* @returns {Array} Returns the converted array. | |
*/ | |
function setToArray(set) { | |
var index = -1, | |
result = Array(set.size); | |
set.forEach(function(value) { | |
result[++index] = value; | |
}); | |
return result; | |
} | |
module.exports = setToArray; | |
/***/ }, | |
/* 50 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseHas = __webpack_require__(51), | |
keys = __webpack_require__(52); | |
/** Used to compose bitmasks for comparison styles. */ | |
var PARTIAL_COMPARE_FLAG = 2; | |
/** | |
* A specialized version of `baseIsEqualDeep` for objects with support for | |
* partial deep comparisons. | |
* | |
* @private | |
* @param {Object} object The object to compare. | |
* @param {Object} other The other object to compare. | |
* @param {Function} equalFunc The function to determine equivalents of values. | |
* @param {Function} customizer The function to customize comparisons. | |
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. | |
* @param {Object} stack Tracks traversed `object` and `other` objects. | |
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | |
*/ | |
function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { | |
var isPartial = bitmask & PARTIAL_COMPARE_FLAG, | |
objProps = keys(object), | |
objLength = objProps.length, | |
othProps = keys(other), | |
othLength = othProps.length; | |
if (objLength != othLength && !isPartial) { | |
return false; | |
} | |
var index = objLength; | |
while (index--) { | |
var key = objProps[index]; | |
if (!(isPartial ? key in other : baseHas(other, key))) { | |
return false; | |
} | |
} | |
// Assume cyclic values are equal. | |
var stacked = stack.get(object); | |
if (stacked) { | |
return stacked == other; | |
} | |
var result = true; | |
stack.set(object, other); | |
var skipCtor = isPartial; | |
while (++index < objLength) { | |
key = objProps[index]; | |
var objValue = object[key], | |
othValue = other[key]; | |
if (customizer) { | |
var compared = isPartial | |
? customizer(othValue, objValue, key, other, object, stack) | |
: customizer(objValue, othValue, key, object, other, stack); | |
} | |
// Recursively compare objects (susceptible to call stack limits). | |
if (!(compared === undefined | |
? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) | |
: compared | |
)) { | |
result = false; | |
break; | |
} | |
skipCtor || (skipCtor = key == 'constructor'); | |
} | |
if (result && !skipCtor) { | |
var objCtor = object.constructor, | |
othCtor = other.constructor; | |
// Non `Object` object instances with different constructors are not equal. | |
if (objCtor != othCtor && | |
('constructor' in object && 'constructor' in other) && | |
!(typeof objCtor == 'function' && objCtor instanceof objCtor && | |
typeof othCtor == 'function' && othCtor instanceof othCtor)) { | |
result = false; | |
} | |
} | |
stack['delete'](object); | |
return result; | |
} | |
module.exports = equalObjects; | |
/***/ }, | |
/* 51 */ | |
/***/ function(module, exports) { | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** Built-in value references. */ | |
var getPrototypeOf = Object.getPrototypeOf; | |
/** | |
* The base implementation of `_.has` without support for deep paths. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array|string} key The key to check. | |
* @returns {boolean} Returns `true` if `key` exists, else `false`. | |
*/ | |
function baseHas(object, key) { | |
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`, | |
// that are composed entirely of index properties, return `false` for | |
// `hasOwnProperty` checks of them. | |
return hasOwnProperty.call(object, key) || | |
(typeof object == 'object' && key in object && getPrototypeOf(object) === null); | |
} | |
module.exports = baseHas; | |
/***/ }, | |
/* 52 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseHas = __webpack_require__(51), | |
baseKeys = __webpack_require__(53), | |
indexKeys = __webpack_require__(54), | |
isArrayLike = __webpack_require__(58), | |
isIndex = __webpack_require__(64), | |
isPrototype = __webpack_require__(65); | |
/** | |
* Creates an array of the own enumerable property names of `object`. | |
* | |
* **Note:** Non-object values are coerced to objects. See the | |
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) | |
* for more details. | |
* | |
* @static | |
* @memberOf _ | |
* @category Object | |
* @param {Object} object The object to query. | |
* @returns {Array} Returns the array of property names. | |
* @example | |
* | |
* function Foo() { | |
* this.a = 1; | |
* this.b = 2; | |
* } | |
* | |
* Foo.prototype.c = 3; | |
* | |
* _.keys(new Foo); | |
* // => ['a', 'b'] (iteration order is not guaranteed) | |
* | |
* _.keys('hi'); | |
* // => ['0', '1'] | |
*/ | |
function keys(object) { | |
var isProto = isPrototype(object); | |
if (!(isProto || isArrayLike(object))) { | |
return baseKeys(object); | |
} | |
var indexes = indexKeys(object), | |
skipIndexes = !!indexes, | |
result = indexes || [], | |
length = result.length; | |
for (var key in object) { | |
if (baseHas(object, key) && | |
!(skipIndexes && (key == 'length' || isIndex(key, length))) && | |
!(isProto && key == 'constructor')) { | |
result.push(key); | |
} | |
} | |
return result; | |
} | |
module.exports = keys; | |
/***/ }, | |
/* 53 */ | |
/***/ function(module, exports) { | |
/* Built-in method references for those with the same name as other `lodash` methods. */ | |
var nativeKeys = Object.keys; | |
/** | |
* The base implementation of `_.keys` which doesn't skip the constructor | |
* property of prototypes or treat sparse arrays as dense. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @returns {Array} Returns the array of property names. | |
*/ | |
function baseKeys(object) { | |
return nativeKeys(Object(object)); | |
} | |
module.exports = baseKeys; | |
/***/ }, | |
/* 54 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseTimes = __webpack_require__(55), | |
isArguments = __webpack_require__(56), | |
isArray = __webpack_require__(62), | |
isLength = __webpack_require__(61), | |
isString = __webpack_require__(63); | |
/** | |
* Creates an array of index keys for `object` values of arrays, | |
* `arguments` objects, and strings, otherwise `null` is returned. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @returns {Array|null} Returns index keys, else `null`. | |
*/ | |
function indexKeys(object) { | |
var length = object ? object.length : undefined; | |
if (isLength(length) && | |
(isArray(object) || isString(object) || isArguments(object))) { | |
return baseTimes(length, String); | |
} | |
return null; | |
} | |
module.exports = indexKeys; | |
/***/ }, | |
/* 55 */ | |
/***/ function(module, exports) { | |
/** | |
* The base implementation of `_.times` without support for iteratee shorthands | |
* or max array length checks. | |
* | |
* @private | |
* @param {number} n The number of times to invoke `iteratee`. | |
* @param {Function} iteratee The function invoked per iteration. | |
* @returns {Array} Returns the array of results. | |
*/ | |
function baseTimes(n, iteratee) { | |
var index = -1, | |
result = Array(n); | |
while (++index < n) { | |
result[index] = iteratee(index); | |
} | |
return result; | |
} | |
module.exports = baseTimes; | |
/***/ }, | |
/* 56 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isArrayLikeObject = __webpack_require__(57); | |
/** `Object#toString` result references. */ | |
var argsTag = '[object Arguments]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to check objects for own properties. */ | |
var hasOwnProperty = objectProto.hasOwnProperty; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** Built-in value references. */ | |
var propertyIsEnumerable = objectProto.propertyIsEnumerable; | |
/** | |
* Checks if `value` is likely an `arguments` object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isArguments(function() { return arguments; }()); | |
* // => true | |
* | |
* _.isArguments([1, 2, 3]); | |
* // => false | |
*/ | |
function isArguments(value) { | |
// Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode. | |
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && | |
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); | |
} | |
module.exports = isArguments; | |
/***/ }, | |
/* 57 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isArrayLike = __webpack_require__(58), | |
isObjectLike = __webpack_require__(28); | |
/** | |
* This method is like `_.isArrayLike` except that it also checks if `value` | |
* is an object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. | |
* @example | |
* | |
* _.isArrayLikeObject([1, 2, 3]); | |
* // => true | |
* | |
* _.isArrayLikeObject(document.body.children); | |
* // => true | |
* | |
* _.isArrayLikeObject('abc'); | |
* // => false | |
* | |
* _.isArrayLikeObject(_.noop); | |
* // => false | |
*/ | |
function isArrayLikeObject(value) { | |
return isObjectLike(value) && isArrayLike(value); | |
} | |
module.exports = isArrayLikeObject; | |
/***/ }, | |
/* 58 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var getLength = __webpack_require__(59), | |
isFunction = __webpack_require__(26), | |
isLength = __webpack_require__(61); | |
/** | |
* Checks if `value` is array-like. A value is considered array-like if it's | |
* not a function and has a `value.length` that's an integer greater than or | |
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is array-like, else `false`. | |
* @example | |
* | |
* _.isArrayLike([1, 2, 3]); | |
* // => true | |
* | |
* _.isArrayLike(document.body.children); | |
* // => true | |
* | |
* _.isArrayLike('abc'); | |
* // => true | |
* | |
* _.isArrayLike(_.noop); | |
* // => false | |
*/ | |
function isArrayLike(value) { | |
return value != null && isLength(getLength(value)) && !isFunction(value); | |
} | |
module.exports = isArrayLike; | |
/***/ }, | |
/* 59 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseProperty = __webpack_require__(60); | |
/** | |
* Gets the "length" property value of `object`. | |
* | |
* **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) | |
* that affects Safari on at least iOS 8.1-8.3 ARM64. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @returns {*} Returns the "length" value. | |
*/ | |
var getLength = baseProperty('length'); | |
module.exports = getLength; | |
/***/ }, | |
/* 60 */ | |
/***/ function(module, exports) { | |
/** | |
* The base implementation of `_.property` without support for deep paths. | |
* | |
* @private | |
* @param {string} key The key of the property to get. | |
* @returns {Function} Returns the new function. | |
*/ | |
function baseProperty(key) { | |
return function(object) { | |
return object == null ? undefined : object[key]; | |
}; | |
} | |
module.exports = baseProperty; | |
/***/ }, | |
/* 61 */ | |
/***/ function(module, exports) { | |
/** Used as references for various `Number` constants. */ | |
var MAX_SAFE_INTEGER = 9007199254740991; | |
/** | |
* Checks if `value` is a valid array-like length. | |
* | |
* **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`. | |
* @example | |
* | |
* _.isLength(3); | |
* // => true | |
* | |
* _.isLength(Number.MIN_VALUE); | |
* // => false | |
* | |
* _.isLength(Infinity); | |
* // => false | |
* | |
* _.isLength('3'); | |
* // => false | |
*/ | |
function isLength(value) { | |
return typeof value == 'number' && | |
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; | |
} | |
module.exports = isLength; | |
/***/ }, | |
/* 62 */ | |
/***/ function(module, exports) { | |
/** | |
* Checks if `value` is classified as an `Array` object. | |
* | |
* @static | |
* @memberOf _ | |
* @type {Function} | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isArray([1, 2, 3]); | |
* // => true | |
* | |
* _.isArray(document.body.children); | |
* // => false | |
* | |
* _.isArray('abc'); | |
* // => false | |
* | |
* _.isArray(_.noop); | |
* // => false | |
*/ | |
var isArray = Array.isArray; | |
module.exports = isArray; | |
/***/ }, | |
/* 63 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isArray = __webpack_require__(62), | |
isObjectLike = __webpack_require__(28); | |
/** `Object#toString` result references. */ | |
var stringTag = '[object String]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** | |
* Checks if `value` is classified as a `String` primitive or object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isString('abc'); | |
* // => true | |
* | |
* _.isString(1); | |
* // => false | |
*/ | |
function isString(value) { | |
return typeof value == 'string' || | |
(!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag); | |
} | |
module.exports = isString; | |
/***/ }, | |
/* 64 */ | |
/***/ function(module, exports) { | |
/** Used as references for various `Number` constants. */ | |
var MAX_SAFE_INTEGER = 9007199254740991; | |
/** Used to detect unsigned integer values. */ | |
var reIsUint = /^(?:0|[1-9]\d*)$/; | |
/** | |
* Checks if `value` is a valid array-like index. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. | |
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`. | |
*/ | |
function isIndex(value, length) { | |
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; | |
length = length == null ? MAX_SAFE_INTEGER : length; | |
return value > -1 && value % 1 == 0 && value < length; | |
} | |
module.exports = isIndex; | |
/***/ }, | |
/* 65 */ | |
/***/ function(module, exports) { | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Checks if `value` is likely a prototype object. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`. | |
*/ | |
function isPrototype(value) { | |
var Ctor = value && value.constructor, | |
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; | |
return value === proto; | |
} | |
module.exports = isPrototype; | |
/***/ }, | |
/* 66 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Map = __webpack_require__(29), | |
Set = __webpack_require__(67), | |
WeakMap = __webpack_require__(68); | |
/** `Object#toString` result references. */ | |
var mapTag = '[object Map]', | |
objectTag = '[object Object]', | |
setTag = '[object Set]', | |
weakMapTag = '[object WeakMap]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** Used to resolve the decompiled source of functions. */ | |
var funcToString = Function.prototype.toString; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** Used to detect maps, sets, and weakmaps. */ | |
var mapCtorString = Map ? funcToString.call(Map) : '', | |
setCtorString = Set ? funcToString.call(Set) : '', | |
weakMapCtorString = WeakMap ? funcToString.call(WeakMap) : ''; | |
/** | |
* Gets the `toStringTag` of `value`. | |
* | |
* @private | |
* @param {*} value The value to query. | |
* @returns {string} Returns the `toStringTag`. | |
*/ | |
function getTag(value) { | |
return objectToString.call(value); | |
} | |
// Fallback for IE 11 providing `toStringTag` values for maps, sets, and weakmaps. | |
if ((Map && getTag(new Map) != mapTag) || | |
(Set && getTag(new Set) != setTag) || | |
(WeakMap && getTag(new WeakMap) != weakMapTag)) { | |
getTag = function(value) { | |
var result = objectToString.call(value), | |
Ctor = result == objectTag ? value.constructor : null, | |
ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : ''; | |
if (ctorString) { | |
switch (ctorString) { | |
case mapCtorString: return mapTag; | |
case setCtorString: return setTag; | |
case weakMapCtorString: return weakMapTag; | |
} | |
} | |
return result; | |
}; | |
} | |
module.exports = getTag; | |
/***/ }, | |
/* 67 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var getNative = __webpack_require__(24), | |
root = __webpack_require__(30); | |
/* Built-in method references that are verified to be native. */ | |
var Set = getNative(root, 'Set'); | |
module.exports = Set; | |
/***/ }, | |
/* 68 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var getNative = __webpack_require__(24), | |
root = __webpack_require__(30); | |
/* Built-in method references that are verified to be native. */ | |
var WeakMap = getNative(root, 'WeakMap'); | |
module.exports = WeakMap; | |
/***/ }, | |
/* 69 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isLength = __webpack_require__(61), | |
isObjectLike = __webpack_require__(28); | |
/** `Object#toString` result references. */ | |
var argsTag = '[object Arguments]', | |
arrayTag = '[object Array]', | |
boolTag = '[object Boolean]', | |
dateTag = '[object Date]', | |
errorTag = '[object Error]', | |
funcTag = '[object Function]', | |
mapTag = '[object Map]', | |
numberTag = '[object Number]', | |
objectTag = '[object Object]', | |
regexpTag = '[object RegExp]', | |
setTag = '[object Set]', | |
stringTag = '[object String]', | |
weakMapTag = '[object WeakMap]'; | |
var arrayBufferTag = '[object ArrayBuffer]', | |
float32Tag = '[object Float32Array]', | |
float64Tag = '[object Float64Array]', | |
int8Tag = '[object Int8Array]', | |
int16Tag = '[object Int16Array]', | |
int32Tag = '[object Int32Array]', | |
uint8Tag = '[object Uint8Array]', | |
uint8ClampedTag = '[object Uint8ClampedArray]', | |
uint16Tag = '[object Uint16Array]', | |
uint32Tag = '[object Uint32Array]'; | |
/** Used to identify `toStringTag` values of typed arrays. */ | |
var typedArrayTags = {}; | |
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = | |
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = | |
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = | |
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = | |
typedArrayTags[uint32Tag] = true; | |
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = | |
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = | |
typedArrayTags[dateTag] = typedArrayTags[errorTag] = | |
typedArrayTags[funcTag] = typedArrayTags[mapTag] = | |
typedArrayTags[numberTag] = typedArrayTags[objectTag] = | |
typedArrayTags[regexpTag] = typedArrayTags[setTag] = | |
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** | |
* Checks if `value` is classified as a typed array. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isTypedArray(new Uint8Array); | |
* // => true | |
* | |
* _.isTypedArray([]); | |
* // => false | |
*/ | |
function isTypedArray(value) { | |
return isObjectLike(value) && | |
isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; | |
} | |
module.exports = isTypedArray; | |
/***/ }, | |
/* 70 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseForOwn = __webpack_require__(71), | |
baseIteratee = __webpack_require__(74); | |
/** | |
* Creates an object with the same keys as `object` and values generated by | |
* running each own enumerable property of `object` through `iteratee`. The | |
* iteratee is invoked with three arguments: (value, key, object). | |
* | |
* @static | |
* @memberOf _ | |
* @category Object | |
* @param {Object} object The object to iterate over. | |
* @param {Function|Object|string} [iteratee=_.identity] The function invoked per iteration. | |
* @returns {Object} Returns the new mapped object. | |
* @example | |
* | |
* var users = { | |
* 'fred': { 'user': 'fred', 'age': 40 }, | |
* 'pebbles': { 'user': 'pebbles', 'age': 1 } | |
* }; | |
* | |
* _.mapValues(users, function(o) { return o.age; }); | |
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) | |
* | |
* // The `_.property` iteratee shorthand. | |
* _.mapValues(users, 'age'); | |
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) | |
*/ | |
function mapValues(object, iteratee) { | |
var result = {}; | |
iteratee = baseIteratee(iteratee, 3); | |
baseForOwn(object, function(value, key, object) { | |
result[key] = iteratee(value, key, object); | |
}); | |
return result; | |
} | |
module.exports = mapValues; | |
/***/ }, | |
/* 71 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseFor = __webpack_require__(72), | |
keys = __webpack_require__(52); | |
/** | |
* The base implementation of `_.forOwn` without support for iteratee shorthands. | |
* | |
* @private | |
* @param {Object} object The object to iterate over. | |
* @param {Function} iteratee The function invoked per iteration. | |
* @returns {Object} Returns `object`. | |
*/ | |
function baseForOwn(object, iteratee) { | |
return object && baseFor(object, iteratee, keys); | |
} | |
module.exports = baseForOwn; | |
/***/ }, | |
/* 72 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var createBaseFor = __webpack_require__(73); | |
/** | |
* The base implementation of `baseForIn` and `baseForOwn` which iterates | |
* over `object` properties returned by `keysFunc` invoking `iteratee` for | |
* each property. Iteratee functions may exit iteration early by explicitly | |
* returning `false`. | |
* | |
* @private | |
* @param {Object} object The object to iterate over. | |
* @param {Function} iteratee The function invoked per iteration. | |
* @param {Function} keysFunc The function to get the keys of `object`. | |
* @returns {Object} Returns `object`. | |
*/ | |
var baseFor = createBaseFor(); | |
module.exports = baseFor; | |
/***/ }, | |
/* 73 */ | |
/***/ function(module, exports) { | |
/** | |
* Creates a base function for methods like `_.forIn`. | |
* | |
* @private | |
* @param {boolean} [fromRight] Specify iterating from right to left. | |
* @returns {Function} Returns the new base function. | |
*/ | |
function createBaseFor(fromRight) { | |
return function(object, iteratee, keysFunc) { | |
var index = -1, | |
iterable = Object(object), | |
props = keysFunc(object), | |
length = props.length; | |
while (length--) { | |
var key = props[fromRight ? length : ++index]; | |
if (iteratee(iterable[key], key, iterable) === false) { | |
break; | |
} | |
} | |
return object; | |
}; | |
} | |
module.exports = createBaseFor; | |
/***/ }, | |
/* 74 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseMatches = __webpack_require__(75), | |
baseMatchesProperty = __webpack_require__(82), | |
identity = __webpack_require__(96), | |
isArray = __webpack_require__(62), | |
property = __webpack_require__(97); | |
/** | |
* The base implementation of `_.iteratee`. | |
* | |
* @private | |
* @param {*} [value=_.identity] The value to convert to an iteratee. | |
* @returns {Function} Returns the iteratee. | |
*/ | |
function baseIteratee(value) { | |
var type = typeof value; | |
if (type == 'function') { | |
return value; | |
} | |
if (value == null) { | |
return identity; | |
} | |
if (type == 'object') { | |
return isArray(value) | |
? baseMatchesProperty(value[0], value[1]) | |
: baseMatches(value); | |
} | |
return property(value); | |
} | |
module.exports = baseIteratee; | |
/***/ }, | |
/* 75 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseIsMatch = __webpack_require__(76), | |
getMatchData = __webpack_require__(77); | |
/** | |
* The base implementation of `_.matches` which doesn't clone `source`. | |
* | |
* @private | |
* @param {Object} source The object of property values to match. | |
* @returns {Function} Returns the new function. | |
*/ | |
function baseMatches(source) { | |
var matchData = getMatchData(source); | |
if (matchData.length == 1 && matchData[0][2]) { | |
var key = matchData[0][0], | |
value = matchData[0][1]; | |
return function(object) { | |
if (object == null) { | |
return false; | |
} | |
return object[key] === value && | |
(value !== undefined || (key in Object(object))); | |
}; | |
} | |
return function(object) { | |
return object === source || baseIsMatch(object, source, matchData); | |
}; | |
} | |
module.exports = baseMatches; | |
/***/ }, | |
/* 76 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Stack = __webpack_require__(9), | |
baseIsEqual = __webpack_require__(7); | |
/** Used to compose bitmasks for comparison styles. */ | |
var UNORDERED_COMPARE_FLAG = 1, | |
PARTIAL_COMPARE_FLAG = 2; | |
/** | |
* The base implementation of `_.isMatch` without support for iteratee shorthands. | |
* | |
* @private | |
* @param {Object} object The object to inspect. | |
* @param {Object} source The object of property values to match. | |
* @param {Array} matchData The property names, values, and compare flags to match. | |
* @param {Function} [customizer] The function to customize comparisons. | |
* @returns {boolean} Returns `true` if `object` is a match, else `false`. | |
*/ | |
function baseIsMatch(object, source, matchData, customizer) { | |
var index = matchData.length, | |
length = index, | |
noCustomizer = !customizer; | |
if (object == null) { | |
return !length; | |
} | |
object = Object(object); | |
while (index--) { | |
var data = matchData[index]; | |
if ((noCustomizer && data[2]) | |
? data[1] !== object[data[0]] | |
: !(data[0] in object) | |
) { | |
return false; | |
} | |
} | |
while (++index < length) { | |
data = matchData[index]; | |
var key = data[0], | |
objValue = object[key], | |
srcValue = data[1]; | |
if (noCustomizer && data[2]) { | |
if (objValue === undefined && !(key in object)) { | |
return false; | |
} | |
} else { | |
var stack = new Stack, | |
result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined; | |
if (!(result === undefined | |
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) | |
: result | |
)) { | |
return false; | |
} | |
} | |
} | |
return true; | |
} | |
module.exports = baseIsMatch; | |
/***/ }, | |
/* 77 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isStrictComparable = __webpack_require__(78), | |
toPairs = __webpack_require__(79); | |
/** | |
* Gets the property names, values, and compare flags of `object`. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @returns {Array} Returns the match data of `object`. | |
*/ | |
function getMatchData(object) { | |
var result = toPairs(object), | |
length = result.length; | |
while (length--) { | |
result[length][2] = isStrictComparable(result[length][1]); | |
} | |
return result; | |
} | |
module.exports = getMatchData; | |
/***/ }, | |
/* 78 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isObject = __webpack_require__(4); | |
/** | |
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` if suitable for strict | |
* equality comparisons, else `false`. | |
*/ | |
function isStrictComparable(value) { | |
return value === value && !isObject(value); | |
} | |
module.exports = isStrictComparable; | |
/***/ }, | |
/* 79 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseToPairs = __webpack_require__(80), | |
keys = __webpack_require__(52); | |
/** | |
* Creates an array of own enumerable key-value pairs for `object` which | |
* can be consumed by `_.fromPairs`. | |
* | |
* @static | |
* @memberOf _ | |
* @category Object | |
* @param {Object} object The object to query. | |
* @returns {Array} Returns the new array of key-value pairs. | |
* @example | |
* | |
* function Foo() { | |
* this.a = 1; | |
* this.b = 2; | |
* } | |
* | |
* Foo.prototype.c = 3; | |
* | |
* _.toPairs(new Foo); | |
* // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) | |
*/ | |
function toPairs(object) { | |
return baseToPairs(object, keys(object)); | |
} | |
module.exports = toPairs; | |
/***/ }, | |
/* 80 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var arrayMap = __webpack_require__(81); | |
/** | |
* The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array | |
* of key-value pairs for `object` corresponding to the property names of `props`. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array} props The property names to get values for. | |
* @returns {Object} Returns the new array of key-value pairs. | |
*/ | |
function baseToPairs(object, props) { | |
return arrayMap(props, function(key) { | |
return [key, object[key]]; | |
}); | |
} | |
module.exports = baseToPairs; | |
/***/ }, | |
/* 81 */ | |
/***/ function(module, exports) { | |
/** | |
* A specialized version of `_.map` for arrays without support for iteratee | |
* shorthands. | |
* | |
* @private | |
* @param {Array} array The array to iterate over. | |
* @param {Function} iteratee The function invoked per iteration. | |
* @returns {Array} Returns the new mapped array. | |
*/ | |
function arrayMap(array, iteratee) { | |
var index = -1, | |
length = array.length, | |
result = Array(length); | |
while (++index < length) { | |
result[index] = iteratee(array[index], index, array); | |
} | |
return result; | |
} | |
module.exports = arrayMap; | |
/***/ }, | |
/* 82 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseIsEqual = __webpack_require__(7), | |
get = __webpack_require__(83), | |
hasIn = __webpack_require__(90); | |
/** Used to compose bitmasks for comparison styles. */ | |
var UNORDERED_COMPARE_FLAG = 1, | |
PARTIAL_COMPARE_FLAG = 2; | |
/** | |
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. | |
* | |
* @private | |
* @param {string} path The path of the property to get. | |
* @param {*} srcValue The value to match. | |
* @returns {Function} Returns the new function. | |
*/ | |
function baseMatchesProperty(path, srcValue) { | |
return function(object) { | |
var objValue = get(object, path); | |
return (objValue === undefined && objValue === srcValue) | |
? hasIn(object, path) | |
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); | |
}; | |
} | |
module.exports = baseMatchesProperty; | |
/***/ }, | |
/* 83 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseGet = __webpack_require__(84); | |
/** | |
* Gets the value at `path` of `object`. If the resolved value is | |
* `undefined` the `defaultValue` is used in its place. | |
* | |
* @static | |
* @memberOf _ | |
* @category Object | |
* @param {Object} object The object to query. | |
* @param {Array|string} path The path of the property to get. | |
* @param {*} [defaultValue] The value returned if the resolved value is `undefined`. | |
* @returns {*} Returns the resolved value. | |
* @example | |
* | |
* var object = { 'a': [{ 'b': { 'c': 3 } }] }; | |
* | |
* _.get(object, 'a[0].b.c'); | |
* // => 3 | |
* | |
* _.get(object, ['a', '0', 'b', 'c']); | |
* // => 3 | |
* | |
* _.get(object, 'a.b.c', 'default'); | |
* // => 'default' | |
*/ | |
function get(object, path, defaultValue) { | |
var result = object == null ? undefined : baseGet(object, path); | |
return result === undefined ? defaultValue : result; | |
} | |
module.exports = get; | |
/***/ }, | |
/* 84 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseCastPath = __webpack_require__(85), | |
isKey = __webpack_require__(89); | |
/** | |
* The base implementation of `_.get` without support for default values. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array|string} path The path of the property to get. | |
* @returns {*} Returns the resolved value. | |
*/ | |
function baseGet(object, path) { | |
path = isKey(path, object) ? [path + ''] : baseCastPath(path); | |
var index = 0, | |
length = path.length; | |
while (object != null && index < length) { | |
object = object[path[index++]]; | |
} | |
return (index && index == length) ? object : undefined; | |
} | |
module.exports = baseGet; | |
/***/ }, | |
/* 85 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isArray = __webpack_require__(62), | |
stringToPath = __webpack_require__(86); | |
/** | |
* Casts `value` to a path array if it's not one. | |
* | |
* @private | |
* @param {*} value The value to inspect. | |
* @returns {Array} Returns the cast property path array. | |
*/ | |
function baseCastPath(value) { | |
return isArray(value) ? value : stringToPath(value); | |
} | |
module.exports = baseCastPath; | |
/***/ }, | |
/* 86 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var toString = __webpack_require__(87); | |
/** Used to match property names within property paths. */ | |
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g; | |
/** Used to match backslashes in property paths. */ | |
var reEscapeChar = /\\(\\)?/g; | |
/** | |
* Converts `string` to a property path array. | |
* | |
* @private | |
* @param {string} string The string to convert. | |
* @returns {Array} Returns the property path array. | |
*/ | |
function stringToPath(string) { | |
var result = []; | |
toString(string).replace(rePropName, function(match, number, quote, string) { | |
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); | |
}); | |
return result; | |
} | |
module.exports = stringToPath; | |
/***/ }, | |
/* 87 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var Symbol = __webpack_require__(46), | |
isSymbol = __webpack_require__(88); | |
/** Used as references for various `Number` constants. */ | |
var INFINITY = 1 / 0; | |
/** Used to convert symbols to primitives and strings. */ | |
var symbolProto = Symbol ? Symbol.prototype : undefined, | |
symbolToString = symbolProto ? symbolProto.toString : undefined; | |
/** | |
* Converts `value` to a string if it's not one. An empty string is returned | |
* for `null` and `undefined` values. The sign of `-0` is preserved. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to process. | |
* @returns {string} Returns the string. | |
* @example | |
* | |
* _.toString(null); | |
* // => '' | |
* | |
* _.toString(-0); | |
* // => '-0' | |
* | |
* _.toString([1, 2, 3]); | |
* // => '1,2,3' | |
*/ | |
function toString(value) { | |
// Exit early for strings to avoid a performance hit in some environments. | |
if (typeof value == 'string') { | |
return value; | |
} | |
if (value == null) { | |
return ''; | |
} | |
if (isSymbol(value)) { | |
return symbolToString ? symbolToString.call(value) : ''; | |
} | |
var result = (value + ''); | |
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; | |
} | |
module.exports = toString; | |
/***/ }, | |
/* 88 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isObjectLike = __webpack_require__(28); | |
/** `Object#toString` result references. */ | |
var symbolTag = '[object Symbol]'; | |
/** Used for built-in method references. */ | |
var objectProto = Object.prototype; | |
/** | |
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | |
* of values. | |
*/ | |
var objectToString = objectProto.toString; | |
/** | |
* Checks if `value` is classified as a `Symbol` primitive or object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Lang | |
* @param {*} value The value to check. | |
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | |
* @example | |
* | |
* _.isSymbol(Symbol.iterator); | |
* // => true | |
* | |
* _.isSymbol('abc'); | |
* // => false | |
*/ | |
function isSymbol(value) { | |
return typeof value == 'symbol' || | |
(isObjectLike(value) && objectToString.call(value) == symbolTag); | |
} | |
module.exports = isSymbol; | |
/***/ }, | |
/* 89 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var isArray = __webpack_require__(62); | |
/** Used to match property names within property paths. */ | |
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, | |
reIsPlainProp = /^\w*$/; | |
/** | |
* Checks if `value` is a property name and not a property path. | |
* | |
* @private | |
* @param {*} value The value to check. | |
* @param {Object} [object] The object to query keys on. | |
* @returns {boolean} Returns `true` if `value` is a property name, else `false`. | |
*/ | |
function isKey(value, object) { | |
if (typeof value == 'number') { | |
return true; | |
} | |
return !isArray(value) && | |
(reIsPlainProp.test(value) || !reIsDeepProp.test(value) || | |
(object != null && value in Object(object))); | |
} | |
module.exports = isKey; | |
/***/ }, | |
/* 90 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseHasIn = __webpack_require__(91), | |
hasPath = __webpack_require__(92); | |
/** | |
* Checks if `path` is a direct or inherited property of `object`. | |
* | |
* @static | |
* @memberOf _ | |
* @category Object | |
* @param {Object} object The object to query. | |
* @param {Array|string} path The path to check. | |
* @returns {boolean} Returns `true` if `path` exists, else `false`. | |
* @example | |
* | |
* var object = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) }); | |
* | |
* _.hasIn(object, 'a'); | |
* // => true | |
* | |
* _.hasIn(object, 'a.b.c'); | |
* // => true | |
* | |
* _.hasIn(object, ['a', 'b', 'c']); | |
* // => true | |
* | |
* _.hasIn(object, 'b'); | |
* // => false | |
*/ | |
function hasIn(object, path) { | |
return hasPath(object, path, baseHasIn); | |
} | |
module.exports = hasIn; | |
/***/ }, | |
/* 91 */ | |
/***/ function(module, exports) { | |
/** | |
* The base implementation of `_.hasIn` without support for deep paths. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array|string} key The key to check. | |
* @returns {boolean} Returns `true` if `key` exists, else `false`. | |
*/ | |
function baseHasIn(object, key) { | |
return key in Object(object); | |
} | |
module.exports = baseHasIn; | |
/***/ }, | |
/* 92 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseCastPath = __webpack_require__(85), | |
isArguments = __webpack_require__(56), | |
isArray = __webpack_require__(62), | |
isIndex = __webpack_require__(64), | |
isKey = __webpack_require__(89), | |
isLength = __webpack_require__(61), | |
isString = __webpack_require__(63), | |
last = __webpack_require__(93), | |
parent = __webpack_require__(94); | |
/** | |
* Checks if `path` exists on `object`. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array|string} path The path to check. | |
* @param {Function} hasFunc The function to check properties. | |
* @returns {boolean} Returns `true` if `path` exists, else `false`. | |
*/ | |
function hasPath(object, path, hasFunc) { | |
if (object == null) { | |
return false; | |
} | |
var result = hasFunc(object, path); | |
if (!result && !isKey(path)) { | |
path = baseCastPath(path); | |
object = parent(object, path); | |
if (object != null) { | |
path = last(path); | |
result = hasFunc(object, path); | |
} | |
} | |
var length = object ? object.length : undefined; | |
return result || ( | |
!!length && isLength(length) && isIndex(path, length) && | |
(isArray(object) || isString(object) || isArguments(object)) | |
); | |
} | |
module.exports = hasPath; | |
/***/ }, | |
/* 93 */ | |
/***/ function(module, exports) { | |
/** | |
* Gets the last element of `array`. | |
* | |
* @static | |
* @memberOf _ | |
* @category Array | |
* @param {Array} array The array to query. | |
* @returns {*} Returns the last element of `array`. | |
* @example | |
* | |
* _.last([1, 2, 3]); | |
* // => 3 | |
*/ | |
function last(array) { | |
var length = array ? array.length : 0; | |
return length ? array[length - 1] : undefined; | |
} | |
module.exports = last; | |
/***/ }, | |
/* 94 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseSlice = __webpack_require__(95), | |
get = __webpack_require__(83); | |
/** | |
* Gets the parent value at `path` of `object`. | |
* | |
* @private | |
* @param {Object} object The object to query. | |
* @param {Array} path The path to get the parent value of. | |
* @returns {*} Returns the parent value. | |
*/ | |
function parent(object, path) { | |
return path.length == 1 ? object : get(object, baseSlice(path, 0, -1)); | |
} | |
module.exports = parent; | |
/***/ }, | |
/* 95 */ | |
/***/ function(module, exports) { | |
/** | |
* The base implementation of `_.slice` without an iteratee call guard. | |
* | |
* @private | |
* @param {Array} array The array to slice. | |
* @param {number} [start=0] The start position. | |
* @param {number} [end=array.length] The end position. | |
* @returns {Array} Returns the slice of `array`. | |
*/ | |
function baseSlice(array, start, end) { | |
var index = -1, | |
length = array.length; | |
if (start < 0) { | |
start = -start > length ? 0 : (length + start); | |
} | |
end = end > length ? length : end; | |
if (end < 0) { | |
end += length; | |
} | |
length = start > end ? 0 : ((end - start) >>> 0); | |
start >>>= 0; | |
var result = Array(length); | |
while (++index < length) { | |
result[index] = array[index + start]; | |
} | |
return result; | |
} | |
module.exports = baseSlice; | |
/***/ }, | |
/* 96 */ | |
/***/ function(module, exports) { | |
/** | |
* This method returns the first argument given to it. | |
* | |
* @static | |
* @memberOf _ | |
* @category Util | |
* @param {*} value Any value. | |
* @returns {*} Returns `value`. | |
* @example | |
* | |
* var object = { 'user': 'fred' }; | |
* | |
* _.identity(object) === object; | |
* // => true | |
*/ | |
function identity(value) { | |
return value; | |
} | |
module.exports = identity; | |
/***/ }, | |
/* 97 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseProperty = __webpack_require__(60), | |
basePropertyDeep = __webpack_require__(98), | |
isKey = __webpack_require__(89); | |
/** | |
* Creates a function that returns the value at `path` of a given object. | |
* | |
* @static | |
* @memberOf _ | |
* @category Util | |
* @param {Array|string} path The path of the property to get. | |
* @returns {Function} Returns the new function. | |
* @example | |
* | |
* var objects = [ | |
* { 'a': { 'b': { 'c': 2 } } }, | |
* { 'a': { 'b': { 'c': 1 } } } | |
* ]; | |
* | |
* _.map(objects, _.property('a.b.c')); | |
* // => [2, 1] | |
* | |
* _.map(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); | |
* // => [1, 2] | |
*/ | |
function property(path) { | |
return isKey(path) ? baseProperty(path) : basePropertyDeep(path); | |
} | |
module.exports = property; | |
/***/ }, | |
/* 98 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var baseGet = __webpack_require__(84); | |
/** | |
* A specialized version of `baseProperty` which supports deep paths. | |
* | |
* @private | |
* @param {Array|string} path The path of the property to get. | |
* @returns {Function} Returns the new function. | |
*/ | |
function basePropertyDeep(path) { | |
return function(object) { | |
return baseGet(object, path); | |
}; | |
} | |
module.exports = basePropertyDeep; | |
/***/ }, | |
/* 99 */ | |
/***/ function(module, exports, __webpack_require__) { | |
var normalizr = __webpack_require__(1); | |
var User = new normalizr.Schema('users', { idAttribute: 'id_str' }); | |
var Tweet = new normalizr.Schema('tweets', { idAttribute: 'id_str' }); | |
Tweet.define({ | |
card: { | |
users: normalizr.arrayOf(User) | |
}, | |
quoted_status: Tweet, | |
retweeted_status: Tweet, | |
user: User | |
}); | |
var RichTimeline = { | |
twitter_objects: { | |
tweets: normalizr.arrayOf(Tweet), | |
users: normalizr.arrayOf(User), | |
} | |
}; | |
module.exports = RichTimeline; | |
/***/ } | |
/******/ ]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!doctype html> | |
<html> | |
<head> | |
<title>Safri Repro Error</title> | |
</head> | |
<body> | |
<div id="log"></div> | |
<script src="bundle.js"></script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var normalizr = require('normalizr'); | |
var richTimelineSchema = require('./schema'); | |
function appendResult(msg) { | |
var logNode = document.getElementById('log'); | |
var entry = document.createElement('p'); | |
var text = document.createTextNode((new Date).toISOString() + ' ' + msg); | |
entry.appendChild(text); | |
logNode.appendChild(entry); | |
} | |
function getTimeline(callback) { | |
var xhr = new XMLHttpRequest(); | |
xhr.open('GET', 'twitter_timeline.json'); | |
xhr.onreadystatechange = function () { | |
if (xhr.readyState === 4) { | |
callback(xhr.responseText); | |
} | |
} | |
xhr.send(); | |
} | |
function assert(predicate, msg) { | |
if (!predicate) { throw new Error(msg); } | |
} | |
function verifyNormalized(raw, normed) { | |
if (!normed.entities.tweets) { | |
appendResult('missing entities.tweets'); | |
} else if (!normed.entities.users) { | |
appendResult('missing entities.users'); | |
} else { | |
appendResult('looks okay'); | |
} | |
} | |
document.addEventListener('DOMContentLoaded', function () { | |
console.log('here'); | |
appendResult('loaded'); | |
setInterval(function () { | |
getTimeline(function (text) { | |
var body = JSON.parse(text); | |
var normalized = normalizr.normalize(body, richTimelineSchema); | |
verifyNormalized(body, normalized); | |
}); | |
}, 5000) | |
}, false); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "safari-repro", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"keywords": [], | |
"author": "", | |
"license": "ISC", | |
"dependencies": { | |
"normalizr": "^2.0.0" | |
}, | |
"devDependencies": { | |
"webpack": "^1.12.14" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var normalizr = require('normalizr'); | |
var User = new normalizr.Schema('users', { idAttribute: 'id_str' }); | |
var Tweet = new normalizr.Schema('tweets', { idAttribute: 'id_str' }); | |
Tweet.define({ | |
card: { | |
users: normalizr.arrayOf(User) | |
}, | |
quoted_status: Tweet, | |
retweeted_status: Tweet, | |
user: User | |
}); | |
var RichTimeline = { | |
twitter_objects: { | |
tweets: normalizr.arrayOf(Tweet), | |
users: normalizr.arrayOf(User), | |
} | |
}; | |
module.exports = RichTimeline; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"twitter_objects":{"tweets":{"712036553414078466":{"created_at":"Mon Mar 21 22:01:57 +0000 2016","id":712036553414078466,"id_str":"712036553414078466","text":"Thank you Twitter for letting me take today off, and not paging me yet #LoveTwitter","entities":{"hashtags":[{"text":"LoveTwitter","indices":[71,83]}],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":9,"conversation_id":712036553414078466,"favorited":false,"retweeted":false,"lang":"en"},"712421685735981057":{"created_at":"Tue Mar 22 23:32:20 +0000 2016","id":712421685735981057,"id_str":"712421685735981057","text":"reminder for everyone blaming that one guy for unpublishing his modules and breaking their build: https:\/\/t.co\/XATtMIhxzh","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/XATtMIhxzh","expanded_url":"http:\/\/www.whoownsmyavailability.com\/","display_url":"whoownsmyavailability.com","indices":[98,121]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":99,"favorite_count":87,"conversation_id":712421685735981057,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"709154664332177408":{"created_at":"Sun Mar 13 23:10:22 +0000 2016","id":709154664332177408,"id_str":"709154664332177408","text":"Preparing tax documents, or \"downloading the software I deleted last April\"","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":709154664332177408,"favorited":false,"retweeted":false,"lang":"en"},"709854827879096320":{"created_at":"Tue Mar 15 21:32:34 +0000 2016","id":709854827879096320,"id_str":"709854827879096320","text":"Today in \"cognitive biases are a bitch\": https:\/\/t.co\/O8ZMLm9Shv","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/O8ZMLm9Shv","expanded_url":"https:\/\/en.wikipedia.org\/wiki\/Choice-supportive_bias","display_url":"en.wikipedia.org\/wiki\/Choice-su\u2026","indices":[41,64]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":709854827879096320,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705477603608506368":{"created_at":"Thu Mar 03 19:39:02 +0000 2016","id":705477603608506368,"id_str":"705477603608506368","text":"clearly, the best way to configure a watch for the vision impaired is by poking a paper clip into a recessed sensor https:\/\/t.co\/VeMrzkCIxm","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/VeMrzkCIxm","expanded_url":"https:\/\/youtu.be\/aRYZCRZ0UG0?t=126","display_url":"youtu.be\/aRYZCRZ0UG0?t=\u2026","indices":[116,139]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":1,"favorite_count":3,"conversation_id":705477603608506368,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"709446797945536512":{"created_at":"Mon Mar 14 18:31:12 +0000 2016","id":709446797945536512,"id_str":"709446797945536512","text":"OH: \"Reached the point where everything compiled and all the tests in macaw-swift failed\"","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":3,"conversation_id":709446797945536512,"favorited":false,"retweeted":false,"lang":"en"},"713481205845372928":{"created_at":"Fri Mar 25 21:42:29 +0000 2016","id":713481205845372928,"id_str":"713481205845372928","text":"Don't worry everyone, the website's still up! https:\/\/t.co\/LbHhTEsTzf https:\/\/t.co\/pD6DAH2Blq","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/LbHhTEsTzf","expanded_url":"http:\/\/status.hipchat.com","display_url":"status.hipchat.com","indices":[46,69]}],"media":[{"id":713481205287497728,"id_str":"713481205287497728","indices":[70,93],"media_url":"http:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","url":"https:\/\/t.co\/pD6DAH2Blq","display_url":"pic.twitter.com\/pD6DAH2Blq","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713481205845372928\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":352,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":199,"resize":"fit"},"large":{"w":1024,"h":600,"resize":"fit"}},"features":{"orig":{"faces":[{"x":61,"y":552,"h":186,"w":186}]},"medium":{"faces":[{"x":21,"y":190,"h":64,"w":64}]},"small":{"faces":[{"x":11,"y":107,"h":36,"w":36}]},"large":{"faces":[{"x":35,"y":324,"h":109,"w":109}]}}}]},"extended_entities":{"media":[{"id":713481205287497728,"id_str":"713481205287497728","indices":[70,93],"media_url":"http:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CebLYEMUMAAmUnT.jpg","url":"https:\/\/t.co\/pD6DAH2Blq","display_url":"pic.twitter.com\/pD6DAH2Blq","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713481205845372928\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":352,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":199,"resize":"fit"},"large":{"w":1024,"h":600,"resize":"fit"}},"features":{"orig":{"faces":[{"x":61,"y":552,"h":186,"w":186}]},"medium":{"faces":[{"x":21,"y":190,"h":64,"w":64}]},"small":{"faces":[{"x":11,"y":107,"h":36,"w":36}]},"large":{"faces":[{"x":35,"y":324,"h":109,"w":109}]}}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":713481205845372928,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"714267325541654528":{"created_at":"Mon Mar 28 01:46:15 +0000 2016","id":714267325541654528,"id_str":"714267325541654528","text":"The muted response to that tweet suggests a lot of followers are in the pocket of big TP.","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":713912592201199616,"in_reply_to_status_id_str":"713912592201199616","in_reply_to_user_id":15990366,"in_reply_to_user_id_str":"15990366","in_reply_to_screen_name":"alunny","user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":3,"conversation_id":713912592201199616,"favorited":false,"retweeted":false,"lang":"en"},"706612586582667264":{"created_at":"Sun Mar 06 22:49:03 +0000 2016","id":706612586582667264,"id_str":"706612586582667264","text":"TFW you get paged for a service you didn't know exists.","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":1,"favorite_count":10,"conversation_id":706612586582667264,"favorited":false,"retweeted":false,"lang":"en"},"710895576758374400":{"created_at":"Fri Mar 18 18:28:07 +0000 2016","id":710895576758374400,"id_str":"710895576758374400","text":"Presets:\n Offline (0 kb\/s \u2b06 0 kb\/s \u2b07 0ms RTT) https:\/\/t.co\/9oMUH0AAv8","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[],"media":[{"id":710895510207344641,"id_str":"710895510207344641","indices":[47,70],"media_url":"http:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","media_url_https":"https:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","url":"https:\/\/t.co\/9oMUH0AAv8","display_url":"pic.twitter.com\/9oMUH0AAv8","expanded_url":"http:\/\/twitter.com\/alunny\/status\/710895576758374400\/photo\/1","type":"photo","sizes":{"large":{"w":498,"h":338,"resize":"fit"},"medium":{"w":498,"h":338,"resize":"fit"},"small":{"w":340,"h":231,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"}},"features":{}}]},"extended_entities":{"media":[{"id":710895510207344641,"id_str":"710895510207344641","indices":[47,70],"media_url":"http:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","media_url_https":"https:\/\/pbs.twimg.com\/tweet_video_thumb\/Cd2bszZUMAEWZtR.jpg","url":"https:\/\/t.co\/9oMUH0AAv8","display_url":"pic.twitter.com\/9oMUH0AAv8","expanded_url":"http:\/\/twitter.com\/alunny\/status\/710895576758374400\/photo\/1","type":"animated_gif","sizes":{"large":{"w":498,"h":338,"resize":"fit"},"medium":{"w":498,"h":338,"resize":"fit"},"small":{"w":340,"h":231,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"}},"video_info":{"aspect_ratio":[249,169],"variants":[{"bitrate":0,"content_type":"video\/mp4","url":"https:\/\/pbs.twimg.com\/tweet_video\/Cd2bszZUMAEWZtR.mp4"}]},"features":{}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":710895576758374400,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705898768818896896":{"created_at":"Fri Mar 04 23:32:36 +0000 2016","id":705898768818896896,"id_str":"705898768818896896","text":"\"the outcome generally only goes as far as a loss in quality of life\" ~~cool story~~ https:\/\/t.co\/nfIskHSm1C","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/nfIskHSm1C","expanded_url":"http:\/\/www.cbc.ca\/news\/canada\/british-columbia\/bc-allergy-season-1.3475617?utm_content=bufferbdb38&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer","display_url":"cbc.ca\/news\/canada\/br\u2026","indices":[85,108]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":705898768818896896,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"705815825018707968":{"created_at":"Fri Mar 04 18:03:00 +0000 2016","id":705815825018707968,"id_str":"705815825018707968","text":"This web page was very disappointing: https:\/\/t.co\/xscppwyQW5","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[{"url":"https:\/\/t.co\/xscppwyQW5","expanded_url":"http:\/\/adjective1.com\/for-soup\/","display_url":"adjective1.com\/for-soup\/","indices":[38,61]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":705815825018707968,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"712011567919837188":{"created_at":"Mon Mar 21 20:22:40 +0000 2016","id":712011567919837188,"id_str":"712011567919837188","text":"RT @biz: watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"biz","name":"Biz Stone","id":13,"id_str":"13","indices":[3,7]}],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Sun Apr 09 03:55:08 +0000 2006","id":1637,"id_str":"1637","text":"watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":13,"id_str":"13"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":10,"favorite_count":8,"conversation_id":1637,"favorited":false,"retweeted":true,"lang":"en"},"is_quote_status":false,"retweet_count":10,"favorite_count":0,"conversation_id":712011567919837188,"favorited":false,"retweeted":true,"lang":"en"},"713255109015175170":{"created_at":"Fri Mar 25 06:44:04 +0000 2016","id":713255109015175170,"id_str":"713255109015175170","text":"Putting scraps of paper on your cat's head without her noticing: the true meaning of Good Friday. https:\/\/t.co\/u4jxZrIE8E","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[],"media":[{"id":713255092225314818,"id_str":"713255092225314818","indices":[98,121],"media_url":"http:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","url":"https:\/\/t.co\/u4jxZrIE8E","display_url":"pic.twitter.com\/u4jxZrIE8E","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713255109015175170\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":693,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":393,"resize":"fit"},"large":{"w":1024,"h":1183,"resize":"fit"}},"features":{"orig":{"faces":[]},"medium":{"faces":[]},"small":{"faces":[]},"large":{"faces":[]}}}]},"extended_entities":{"media":[{"id":713255092225314818,"id_str":"713255092225314818","indices":[98,121],"media_url":"http:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/CeX9ujZUEAI5NUP.jpg","url":"https:\/\/t.co\/u4jxZrIE8E","display_url":"pic.twitter.com\/u4jxZrIE8E","expanded_url":"http:\/\/twitter.com\/alunny\/status\/713255109015175170\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":693,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":393,"resize":"fit"},"large":{"w":1024,"h":1183,"resize":"fit"}},"features":{"orig":{"faces":[]},"medium":{"faces":[]},"small":{"faces":[]},"large":{"faces":[]}}}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":5,"conversation_id":713255109015175170,"favorited":false,"retweeted":false,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"714704904825266176":{"created_at":"Tue Mar 29 06:45:02 +0000 2016","id":714704904825266176,"id_str":"714704904825266176","text":"A fun thing to do is to stay up late drinking whisky aggregating the number of days you spent in the US for the past three years for tax pur","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":5,"conversation_id":714704904825266176,"favorited":false,"retweeted":false,"lang":"en"},"713063516408643584":{"created_at":"Thu Mar 24 18:02:45 +0000 2016","id":713063516408643584,"id_str":"713063516408643584","text":"RT @JFriedhoff: The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\u2026","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"JFriedhoff","name":"jane frie(n)dhoff","id":379875798,"id_str":"379875798","indices":[3,14]},{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[68,84]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[139,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Thu Mar 24 13:32:19 +0000 2016","id":712995459892174848,"id_str":"712995459892174848","text":"The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\/\/t.co\/bmoRuN0tHi","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[52,68]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[117,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":379875798,"id_str":"379875798"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":141,"favorite_count":104,"conversation_id":712995459892174848,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"is_quote_status":false,"retweet_count":141,"favorite_count":0,"conversation_id":713063516408643584,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"lang":"en"},"1637":{"created_at":"Sun Apr 09 03:55:08 +0000 2006","id":1637,"id_str":"1637","text":"watching jack nicholson in wolf","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":13,"id_str":"13"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":10,"favorite_count":8,"conversation_id":1637,"favorited":false,"retweeted":true,"current_user_retweet":{"id":712011567919837188,"id_str":"712011567919837188"},"lang":"en"},"707670300083642368":{"created_at":"Wed Mar 09 20:52:02 +0000 2016","id":707670300083642368,"id_str":"707670300083642368","text":"achievement unlocked: built and launched chromium for iOS","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":1,"conversation_id":707670300083642368,"favorited":false,"retweeted":false,"lang":"en"},"706981235910782982":{"created_at":"Mon Mar 07 23:13:56 +0000 2016","id":706981235910782982,"id_str":"706981235910782982","text":"ReferenceError: undefine is not defined","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":706981235910782982,"favorited":false,"retweeted":false,"lang":"en"},"713912592201199616":{"created_at":"Sun Mar 27 02:16:40 +0000 2016","id":713912592201199616,"id_str":"713912592201199616","text":"Biggest joke in retail: n double rolls = 2n single rolls","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":15990366,"id_str":"15990366"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":4,"conversation_id":713912592201199616,"favorited":false,"retweeted":false,"lang":"en"},"712995459892174848":{"created_at":"Thu Mar 24 13:32:19 +0000 2016","id":712995459892174848,"id_str":"712995459892174848","text":"The Tay disaster reminds me of this v smart post by @tinysubversions on basic transphobic joke prevention in his bot https:\/\/t.co\/bmoRuN0tHi","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"tinysubversions","name":"Darius Kazemi","id":14475298,"id_str":"14475298","indices":[52,68]}],"urls":[{"url":"https:\/\/t.co\/bmoRuN0tHi","expanded_url":"http:\/\/tinysubversions.com\/notes\/transphobic-joke-detection\/","display_url":"tinysubversions.com\/notes\/transpho\u2026","indices":[117,140]}]},"truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":379875798,"id_str":"379875798"},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":141,"favorite_count":104,"conversation_id":712995459892174848,"favorited":false,"retweeted":true,"possibly_sensitive":false,"possibly_sensitive_appealable":false,"current_user_retweet":{"id":713063516408643584,"id_str":"713063516408643584"},"lang":"en"}},"users":{"55323056":{"id":55323056,"id_str":"55323056","counts":{"saved_searches":0,"lists":{"subscribed":3,"owned":17}},"name":"City of Vancouver","screen_name":"CityofVancouver","location":"Vancouver, BC, Canada","description":"Tweeting news, events, and more about the beautiful City of Vancouver in British Columbia, Canada. For urgent requests, please call 3-1-1!","url":"http:\/\/t.co\/pdOVEWp6y7","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/pdOVEWp6y7","expanded_url":"http:\/\/vancouver.ca","display_url":"vancouver.ca","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":112056,"friends_count":3573,"listed_count":1692,"created_at":"Thu Jul 09 18:47:58 +0000 2009","favourites_count":1970,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":true,"statuses_count":21481,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"005582","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/471072671325630464\/mJgDamTa.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/471072671325630464\/mJgDamTa.jpeg","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/610511664748695552\/g2OBM_H3_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/610511664748695552\/g2OBM_H3_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/55323056\/1458750908","profile_link_color":"005582","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"85C335","profile_text_color":"444444","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"13":{"id":13,"id_str":"13","counts":{"saved_searches":0,"lists":{"subscribed":1,"owned":2}},"name":"Biz Stone","screen_name":"biz","location":"San Francisco, CA","description":"Co-founder Twitter, Medium, and now Co-founder and CEO of https:\/\/t.co\/r8cfF8q2u5","url":"https:\/\/t.co\/Z0lDe7sSrF","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/Z0lDe7sSrF","expanded_url":"http:\/\/www.jelly.co","display_url":"jelly.co","indices":[0,23]}]},"description":{"urls":[{"url":"https:\/\/t.co\/r8cfF8q2u5","expanded_url":"http:\/\/Askjelly.com","display_url":"Askjelly.com","indices":[58,81]}]}},"protected":false,"followers_count":2716335,"friends_count":693,"listed_count":21208,"created_at":"Tue Mar 21 20:51:43 +0000 2006","favourites_count":2692,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":true,"statuses_count":6214,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"022330","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/679561536243761153\/Hbf3WwO6_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/679561536243761153\/Hbf3WwO6_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/13\/1349568220","profile_link_color":"0084B4","profile_sidebar_border_color":"A8C7F7","profile_sidebar_fill_color":"C0DFEC","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"15990366":{"id":15990366,"id_str":"15990366","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Andrew Lunny","screen_name":"alunny","location":"Vancouver","description":"recovering gooner, @twitter curmudgeon","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":1523,"friends_count":401,"listed_count":112,"created_at":"Tue Aug 26 01:09:08 +0000 2008","favourites_count":2418,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":5232,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/627594097847472128\/Nzzt0Ykc_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/627594097847472128\/Nzzt0Ykc_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/15990366\/1428389769","profile_link_color":"066B4D","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"50653645":{"id":50653645,"id_str":"50653645","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":3}},"name":"James Broadhead","screen_name":"jamesbroadhead","location":"Londres, Angleterre","description":"Gentooist, pythonista and oboist. Working on @tweetdeck for @twitter.","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":948,"friends_count":1114,"listed_count":46,"created_at":"Thu Jun 25 14:04:30 +0000 2009","favourites_count":6891,"utc_offset":-21600,"time_zone":"America\/Denver","geo_enabled":true,"verified":false,"statuses_count":9113,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3339716823\/ad833e14175b3caa6f21299519342087_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3339716823\/ad833e14175b3caa6f21299519342087_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/50653645\/1352981524","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"17198118":{"id":17198118,"id_str":"17198118","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Sam Saccone","screen_name":"samccone","location":"Mountain View, CA","description":"Software Engineer @google","url":"https:\/\/t.co\/t4VuIXcHYa","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/t4VuIXcHYa","expanded_url":"http:\/\/github.com\/samccone","display_url":"github.com\/samccone","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":2793,"friends_count":97,"listed_count":110,"created_at":"Wed Nov 05 21:30:36 +0000 2008","favourites_count":6519,"utc_offset":-18000,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":10204,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"050505","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3275266259\/5ceb1b3f831115bd62e85b24ba5d8e4f_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3275266259\/5ceb1b3f831115bd62e85b24ba5d8e4f_normal.jpeg","profile_link_color":"9266CC","profile_sidebar_border_color":"E07B00","profile_sidebar_fill_color":"10181C","profile_text_color":"ADADAD","profile_use_background_image":false,"has_extended_profile":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"4745674136":{"id":4745674136,"id_str":"4745674136","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"Begin","screen_name":"begin","location":"San Francisco, CA","description":"Happier people and stronger teams don't do the most work \u2014 they do their best work.","url":"https:\/\/t.co\/Rh0KwyVp0K","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/Rh0KwyVp0K","expanded_url":"https:\/\/begin.com\/","display_url":"begin.com","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":376,"friends_count":6,"listed_count":3,"created_at":"Tue Jan 12 00:43:55 +0000 2016","favourites_count":2,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":29,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/710924965894160384\/pYEkHc8D_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/710924965894160384\/pYEkHc8D_normal.jpg","profile_link_color":"F2AC03","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"379875798":{"id":379875798,"id_str":"379875798","counts":{"saved_searches":0,"lists":{"subscribed":0,"owned":0}},"name":"jane frie(n)dhoff","screen_name":"JFriedhoff","location":"github.com\/friej715","description":"riot grrl gamedev | creative researcher @The_O_C_R | alumna @nytimes | @slamcityoracles | cofounder @codeliberation | member @DBAArcade | underslept&overexcited","url":"https:\/\/t.co\/llehUW59d5","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/llehUW59d5","expanded_url":"http:\/\/janefriedhoff.com\/","display_url":"janefriedhoff.com","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":1326,"friends_count":470,"listed_count":80,"created_at":"Sun Sep 25 18:16:22 +0000 2011","favourites_count":12307,"utc_offset":-18000,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":8267,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"00728F","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/545666727\/interactive_glitter_1.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/545666727\/interactive_glitter_1.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/708800158591377408\/Qaw9iIOW_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/708800158591377408\/Qaw9iIOW_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/379875798\/1446149702","profile_link_color":"045F80","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":false,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"308665722":{"id":308665722,"id_str":"308665722","counts":{"saved_searches":0,"lists":{"subscribed":1,"owned":0}},"name":"Nolan Lawson","screen_name":"nolanlawson","location":"NYC","description":"Dual-wield Webomancer\/Android paladin. Currently: @Squarespace and @PouchDB. Formerly: CatLog, KeepScore, Pok\u00e9droid. Opinions expressed are mine.","url":"http:\/\/t.co\/B4s57WuWZL","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/B4s57WuWZL","expanded_url":"http:\/\/nolanlawson.com","display_url":"nolanlawson.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":2760,"friends_count":593,"listed_count":131,"created_at":"Tue May 31 19:59:13 +0000 2011","favourites_count":3273,"utc_offset":-14400,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":5400,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"BADFCD","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme12\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme12\/bg.gif","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/432810491988041728\/v_2KkjCm_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/432810491988041728\/v_2KkjCm_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/308665722\/1428343824","profile_link_color":"FF0000","profile_sidebar_border_color":"F2E195","profile_sidebar_fill_color":"FFF7CC","profile_text_color":"0C3E53","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false}},"custom_timelines":{},"moments":{}},"response":{"timeline":[{"entity_id":{"type":"tweet","ids":["1459233902542"]},"sort_index":"714704904825266176","tweet":{"id":"714704904825266176"}},{"entity_id":{"type":"tweet","ids":["1459129575511"]},"sort_index":"714267325541654528","tweet":{"id":"714267325541654528"}},{"entity_id":{"type":"tweet","ids":["1459045000492"]},"sort_index":"713912592201199616","tweet":{"id":"713912592201199616"}},{"entity_id":{"type":"tweet","ids":["1458942149970"]},"sort_index":"713481205845372928","tweet":{"id":"713481205845372928"}},{"entity_id":{"type":"tweet","ids":["1458888244285"]},"sort_index":"713255109015175170","tweet":{"id":"713255109015175170"}},{"entity_id":{"type":"tweet","ids":["1458842565048"]},"sort_index":"713063516408643584","tweet":{"id":"713063516408643584"}},{"entity_id":{"type":"tweet","ids":["1458689540691"]},"sort_index":"712421685735981057","tweet":{"id":"712421685735981057"}},{"entity_id":{"type":"tweet","ids":["1458597717990"]},"sort_index":"712036553414078466","tweet":{"id":"712036553414078466"}},{"entity_id":{"type":"tweet","ids":["1458591760984"]},"sort_index":"712011567919837188","tweet":{"id":"712011567919837188"}},{"entity_id":{"type":"tweet","ids":["1458325687957"]},"sort_index":"710895576758374400","tweet":{"id":"710895576758374400"}},{"entity_id":{"type":"tweet","ids":["1458077554088"]},"sort_index":"709854827879096320","tweet":{"id":"709854827879096320"}},{"entity_id":{"type":"tweet","ids":["1457980272171"]},"sort_index":"709446797945536512","tweet":{"id":"709446797945536512"}},{"entity_id":{"type":"tweet","ids":["1457910622090"]},"sort_index":"709154664332177408","tweet":{"id":"709154664332177408"}},{"entity_id":{"type":"tweet","ids":["1457556722075"]},"sort_index":"707670300083642368","tweet":{"id":"707670300083642368"}},{"follow_activity":{"user_id":"15990366","following_user_ids":["50653645","55323056","308665722","4745674136","17198118"]}},{"entity_id":{"type":"tweet","ids":["1457392436374"]},"sort_index":"706981235910782982","tweet":{"id":"706981235910782982"}},{"entity_id":{"type":"tweet","ids":["1457304543525"]},"sort_index":"706612586582667264","tweet":{"id":"706612586582667264"}},{"entity_id":{"type":"tweet","ids":["1457134356108"]},"sort_index":"705898768818896896","tweet":{"id":"705898768818896896"}},{"entity_id":{"type":"tweet","ids":["1457114580765"]},"sort_index":"705815825018707968","tweet":{"id":"705815825018707968"}},{"entity_id":{"type":"tweet","ids":["1457033942497"]},"sort_index":"705477603608506368","tweet":{"id":"705477603608506368"}}],"cursor":{"top":"1459233902542","bottom":"1457033942497","gaps":["bottom"]}}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment