diff --git a/.babelrc b/.babelrc index 12571d1c..b774a156 100644 --- a/.babelrc +++ b/.babelrc @@ -2,7 +2,7 @@ "presets": [ ["env", { "targets": { - "browsers": ["ie >= 6"] + "browsers": ["ie >= 9"] }, "modules": false }] diff --git a/.gitignore b/.gitignore index 8959b90c..524e6a55 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ npm-debug.log build dist .DS_Store +*.crt +*.key +amplitude.nocompat.js +amplitude.nocompat.min.js diff --git a/.jshintrc b/.jshintrc index 55204b7c..312464d4 100644 --- a/.jshintrc +++ b/.jshintrc @@ -67,7 +67,7 @@ "browserify" : false, // Browserify (node.js code in the browser) "couch" : false, // CouchDB "devel" : true, // Development/debugging (alert, confirm, etc) - "esversion" : 6, // Support ES version 6 syntax + "esversion" : 9, // Support ES version 9 syntax "dojo" : false, // Dojo Toolkit "jasmine" : false, // Jasmine "jquery" : false, // jQuery @@ -84,5 +84,9 @@ "yui" : false, // Yahoo User Interface // Custom Globals - "globals" : {} // additional predefined global variables + "globals" : { // additional predefined global variables + "BUILD_COMPAT_2_0": true, + "BUILD_COMPAT_SNIPPET": true, + "BUILD_COMPAT_LOCAL_STORAGE": true + } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 11c475d6..753a845d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### 4.6.0 (February 25, 2018) + +* Add support for unsetting utm params when a new session is created +* Update dependencies to pass yarn audit +* Bugfix: Allow logLevel to be set to disabled. +* Bugfix: Update ua-parser to work in quirks mode in older internet explorer versions +* Fetch ua-parsers-js from npm instead of github +* Add `secureCookie` option to add a secure flag to the cookie + ### 4.5.2 (November 10, 2018) * Bugfix: Default groupProperties to empty object in logEvent. diff --git a/Makefile b/Makefile index 61f5a83e..329c7bf9 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,9 @@ README.md: $(SNIPPET_OUT) version $(OUT): node_modules $(SRC) version rollup.config.js rollup.min.js @$(JSHINT) --verbose $(SRC) @NODE_ENV=production $(ROLLUP) --config rollup.config.js + @NODE_ENV=production $(ROLLUP) --config rollup.nocompat.js @NODE_ENV=production $(ROLLUP) --config rollup.min.js + @NODE_ENV=production $(ROLLUP) --config rollup.nocompat.min.js # # Target for minified `amplitude-snippet.js` file. diff --git a/README.md b/README.md index 5530946b..de019a48 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Please see our [installation guide](https://amplitude.zendesk.com/hc/en-us/artic [![npm version](https://badge.fury.io/js/amplitude-js.svg)](https://badge.fury.io/js/amplitude-js) [![Bower version](https://badge.fury.io/bo/amplitude-js.svg)](https://badge.fury.io/bo/amplitude-js) -[4.5.2 - Released on November 10, 2018](https://github.com/amplitude/Amplitude-JavaScript/releases/latest) +[4.6.0 - Released on February 25, 2019](https://github.com/amplitude/Amplitude-JavaScript/releases/latest) # JavaScript SDK Reference # diff --git a/amplitude-snippet.min.js b/amplitude-snippet.min.js index 4e008312..54e629f4 100644 --- a/amplitude-snippet.min.js +++ b/amplitude-snippet.min.js @@ -1,6 +1,6 @@ (function(e,t){var n=e.amplitude||{_q:[],_iq:{}};var r=t.createElement("script") ;r.type="text/javascript";r.async=true -;r.src="https://cdn.amplitude.com/libs/amplitude-4.5.2-min.gz.js" +;r.src="https://cdn.amplitude.com/libs/amplitude-4.6.0-min.gz.js" ;r.onload=function(){if(e.amplitude.runQueuedFunctions){ e.amplitude.runQueuedFunctions()}else{ console.log("[Amplitude] Error: could not load SDK")}} diff --git a/amplitude.js b/amplitude.js index 61185930..3d9cd7d9 100644 --- a/amplitude.js +++ b/amplitude.js @@ -6,16 +6,11 @@ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - - - function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var json3 = createCommonjsModule(function (module, exports) { -/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ (function () { // Detect the `define` function exposed by asynchronous module loaders. The // strict `define` check is necessary for compatibility with `r.js`. @@ -538,7 +533,7 @@ var json3 = createCommonjsModule(function (module, exports) { } else if (className == arrayClass) { // Convert the property names array into a makeshift set. properties = {}; - for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1)); + for (var index = 0, length = filter.length, value; index < length; value = filter[index++], (className = getClass.call(value), className == stringClass || className == numberClass) && (properties[value] = 1)); } } if (width) { @@ -681,19 +676,19 @@ var json3 = createCommonjsModule(function (module, exports) { // Parse an integer or floating-point value. if (charCode >= 48 && charCode <= 57) { // Leading zeroes are interpreted as octal literals. - if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) { + if (charCode == 48 && (charCode = source.charCodeAt(Index + 1), charCode >= 48 && charCode <= 57)) { // Illegal octal literal. abort(); } isSigned = false; // Parse the integer component. - for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++); + for (; Index < length && (charCode = source.charCodeAt(Index), charCode >= 48 && charCode <= 57); Index++); // Floats cannot contain a leading decimal point; however, this // case is already accounted for by the parser. if (source.charCodeAt(Index) == 46) { position = ++Index; // Parse the decimal component. - for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + for (; position < length && (charCode = source.charCodeAt(position), charCode >= 48 && charCode <= 57); position++); if (position == Index) { // Illegal trailing decimal. abort(); @@ -711,7 +706,7 @@ var json3 = createCommonjsModule(function (module, exports) { Index++; } // Parse the exponential component. - for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); + for (position = Index; position < length && (charCode = source.charCodeAt(position), charCode >= 48 && charCode <= 57); position++); if (position == Index) { // Illegal empty exponent. abort(); @@ -1015,7 +1010,6 @@ var UTF8 = { }; /* jshint bitwise: false */ -/* global escape, unescape */ /* * Base64 encoder/decoder @@ -1106,4398 +1100,1578 @@ var Base64 = { } }; -var componentUrl = createCommonjsModule(function (module, exports) { -/** - * Parse the given `url`. - * - * @param {String} str - * @return {Object} - * @api public - */ - -exports.parse = function(url){ - var a = document.createElement('a'); - a.href = url; - return { - href: a.href, - host: a.host || location.host, - port: ('0' === a.port || '' === a.port) ? port(a.protocol) : a.port, - hash: a.hash, - hostname: a.hostname || location.hostname, - pathname: a.pathname.charAt(0) != '/' ? '/' + a.pathname : a.pathname, - protocol: !a.protocol || ':' == a.protocol ? location.protocol : a.protocol, - search: a.search, - query: a.search.slice(1) - }; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; -/** - * Check if `url` is absolute. - * - * @param {String} url - * @return {Boolean} - * @api public - */ +var defineProperty = function (obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } -exports.isAbsolute = function(url){ - return 0 == url.indexOf('//') || !!~url.indexOf('://'); + return obj; }; -/** - * Check if `url` is relative. - * - * @param {String} url - * @return {Boolean} - * @api public - */ - -exports.isRelative = function(url){ - return !exports.isAbsolute(url); -}; +var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; -/** - * Check if `url` is cross domain. - * - * @param {String} url - * @return {Boolean} - * @api public - */ + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } -exports.isCrossDomain = function(url){ - url = exports.parse(url); - var location = exports.parse(window.location.href); - return url.hostname !== location.hostname - || url.port !== location.port - || url.protocol !== location.protocol; + return target; }; /** - * Return default port for `protocol`. - * - * @param {String} protocol - * @return {String} - * @api private - */ -function port (protocol){ - switch (protocol) { - case 'http:': - return 80; - case 'https:': - return 443; - default: - return location.port; - } -} -}); - -/** - * Helpers. + * toString ref. + * @private */ -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; +var toString = Object.prototype.toString; /** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} + * Return the type of `val`. + * @private + * @param {Mixed} val + * @return {String} * @api public */ -var ms = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse$1(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse$1(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; +function type (val) { + switch (toString.call(val)) { + case '[object Date]': + return 'date'; + case '[object RegExp]': + return 'regexp'; + case '[object Arguments]': + return 'arguments'; + case '[object Array]': + return 'array'; + case '[object Error]': + return 'error'; } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; + if (val === null) { + return 'null'; } - if (ms >= h) { - return Math.round(ms / h) + 'h'; + if (val === undefined) { + return 'undefined'; } - if (ms >= m) { - return Math.round(ms / m) + 'm'; + if (val !== val) { + return 'nan'; } - if (ms >= s) { - return Math.round(ms / s) + 's'; + if (val && val.nodeType === 1) { + return 'element'; } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; + if (typeof Buffer !== 'undefined' && typeof Buffer.isBuffer === 'function' && Buffer.isBuffer(val)) { + return 'buffer'; } - return Math.ceil(ms / n) + ' ' + name + 's'; -} - -var debug$1 = createCommonjsModule(function (module, exports) { -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = ms; - -/** - * Active `debug` instances. - */ -exports.instances = []; -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; + val = val.valueOf ? val.valueOf() : Object.prototype.valueOf.apply(val); + return typeof val === 'undefined' ? 'undefined' : _typeof(val); +} -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ +var logLevels = { + DISABLE: 0, + ERROR: 1, + WARN: 2, + INFO: 3 +}; -function selectColor(namespace) { - var hash = 0, i; +var logLevel = logLevels.WARN; - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer +var setLogLevel = function setLogLevel(logLevelName) { + if (logLevels.hasOwnProperty(logLevelName)) { + logLevel = logLevels[logLevelName]; } +}; - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ +var getLogLevel = function getLogLevel() { + return logLevel; +}; -function createDebug(namespace) { +var log = { + error: function error(s) { + if (logLevel >= logLevels.ERROR) { + _log(s); + } + }, - var prevTime; + warn: function warn(s) { + if (logLevel >= logLevels.WARN) { + _log(s); + } + }, - function debug() { - // disabled? - if (!debug.enabled) return; + info: function info(s) { + if (logLevel >= logLevels.INFO) { + _log(s); + } + } +}; - var self = debug; +var _log = function _log(s) { + try { + console.log('[Amplitude] ' + s); + } catch (e) { + // console logging not available + } +}; - // set `diff` timestamp - var curr = +new Date(); - var ms$$1 = curr - (prevTime || curr); - self.diff = ms$$1; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; +var isEmptyString = function isEmptyString(str) { + return !str || str.length === 0; +}; - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; +var sessionStorageEnabled = function sessionStorageEnabled() { + try { + if (window.sessionStorage) { + return true; } + } catch (e) {} // sessionStorage disabled + return false; +}; - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); +// truncate string values in event and user properties so that request size does not get too large +var truncate = function truncate(value) { + if (type(value) === 'array') { + for (var i = 0; i < value.length; i++) { + value[i] = truncate(value[i]); } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; + } else if (type(value) === 'object') { + for (var key in value) { + if (value.hasOwnProperty(key)) { + value[key] = truncate(value[key]); } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); + } + } else { + value = _truncateValue(value); } - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; + return value; +}; - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); +var _truncateValue = function _truncateValue(value) { + if (type(value) === 'string') { + return value.length > constants.MAX_STRING_LENGTH ? value.substring(0, constants.MAX_STRING_LENGTH) : value; } + return value; +}; - exports.instances.push(debug); - - return debug; -} - -function destroy () { - var index = exports.instances.indexOf(this); - if (index !== -1) { - exports.instances.splice(index, 1); - return true; - } else { +var validateInput = function validateInput(input, name, expectedType) { + if (type(input) !== expectedType) { + log.error('Invalid ' + name + ' input type. Expected ' + expectedType + ' but received ' + type(input)); return false; } -} + return true; +}; -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ +// do some basic sanitization and type checking, also catch property dicts with more than 1000 key/value pairs +var validateProperties = function validateProperties(properties) { + var propsType = type(properties); + if (propsType !== 'object') { + log.error('Error: invalid properties format. Expecting Javascript object, received ' + propsType + ', ignoring'); + return {}; + } -function enable(namespaces) { - exports.save(namespaces); + if (Object.keys(properties).length > constants.MAX_PROPERTY_KEYS) { + log.error('Error: too many properties (more than 1000), ignoring'); + return {}; + } - exports.names = []; - exports.skips = []; + var copy = {}; // create a copy with all of the valid properties + for (var property in properties) { + if (!properties.hasOwnProperty(property)) { + continue; + } - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; + // validate key + var key = property; + var keyType = type(key); + if (keyType !== 'string') { + key = String(key); + log.warn('WARNING: Non-string property key, received type ' + keyType + ', coercing to string "' + key + '"'); + } - for (i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); + // validate value + var value = validatePropertyValue(key, properties[property]); + if (value === null) { + continue; } + copy[key] = value; } + return copy; +}; - for (i = 0; i < exports.instances.length; i++) { - var instance = exports.instances[i]; - instance.enabled = exports.enabled(instance.namespace); - } -} +var invalidValueTypes = ['null', 'nan', 'undefined', 'function', 'arguments', 'regexp', 'element']; -/** - * Disable debug output. - * - * @api public - */ +var validatePropertyValue = function validatePropertyValue(key, value) { + var valueType = type(value); + if (invalidValueTypes.indexOf(valueType) !== -1) { + log.warn('WARNING: Property key "' + key + '" with invalid value type ' + valueType + ', ignoring'); + value = null; + } else if (valueType === 'error') { + value = String(value); + log.warn('WARNING: Property key "' + key + '" with value type error, coercing to ' + value); + } else if (valueType === 'array') { + // check for nested arrays or objects + var arrayCopy = []; + for (var i = 0; i < value.length; i++) { + var element = value[i]; + var elemType = type(element); + if (elemType === 'array' || elemType === 'object') { + log.warn('WARNING: Cannot have ' + elemType + ' nested in an array property value, skipping'); + continue; + } + arrayCopy.push(validatePropertyValue(key, element)); + } + value = arrayCopy; + } else if (valueType === 'object') { + value = validateProperties(value); + } + return value; +}; -function disable() { - exports.enable(''); -} +var validateGroups = function validateGroups(groups) { + var groupsType = type(groups); + if (groupsType !== 'object') { + log.error('Error: invalid groups format. Expecting Javascript object, received ' + groupsType + ', ignoring'); + return {}; + } -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ + var copy = {}; // create a copy with all of the valid properties + for (var group in groups) { + if (!groups.hasOwnProperty(group)) { + continue; + } -function enabled(name) { - if (name[name.length - 1] === '*') { - return true; + // validate key + var key = group; + var keyType = type(key); + if (keyType !== 'string') { + key = String(key); + log.warn('WARNING: Non-string groupType, received type ' + keyType + ', coercing to string "' + key + '"'); + } + + // validate value + var value = validateGroupName(key, groups[group]); + if (value === null) { + continue; + } + copy[key] = value; + } + return copy; +}; + +var validateGroupName = function validateGroupName(key, groupName) { + var groupNameType = type(groupName); + if (groupNameType === 'string') { + return groupName; + } + if (groupNameType === 'date' || groupNameType === 'number' || groupNameType === 'boolean') { + groupName = String(groupName); + log.warn('WARNING: Non-string groupName, received type ' + groupNameType + ', coercing to string "' + groupName + '"'); + return groupName; } - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; + if (groupNameType === 'array') { + // check for nested arrays or objects + var arrayCopy = []; + for (var i = 0; i < groupName.length; i++) { + var element = groupName[i]; + var elemType = type(element); + if (elemType === 'array' || elemType === 'object') { + log.warn('WARNING: Skipping nested ' + elemType + ' in array groupName'); + continue; + } else if (elemType === 'string') { + arrayCopy.push(element); + } else if (elemType === 'date' || elemType === 'number' || elemType === 'boolean') { + element = String(element); + log.warn('WARNING: Non-string groupName, received type ' + elemType + ', coercing to string "' + element + '"'); + arrayCopy.push(element); + } } + return arrayCopy; } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; + log.warn('WARNING: Non-string groupName, received type ' + groupNameType + '. Please use strings or array of strings for groupName'); +}; + +// parses the value of a url param (for example ?gclid=1234&...) +var getQueryParam = function getQueryParam(name, query) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); + var results = regex.exec(query); + return results === null ? undefined : decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + +var utils = { + setLogLevel: setLogLevel, + getLogLevel: getLogLevel, + logLevels: logLevels, + log: log, + isEmptyString: isEmptyString, + getQueryParam: getQueryParam, + sessionStorageEnabled: sessionStorageEnabled, + truncate: truncate, + validateGroups: validateGroups, + validateInput: validateInput, + validateProperties: validateProperties +}; + +var getLocation = function getLocation() { + return window.location; +}; + +var get = function get(name) { + try { + var ca = document.cookie.split(';'); + var value = null; + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + if (c.indexOf(name) === 0) { + value = c.substring(name.length, c.length); + break; + } } + + return value; + } catch (e) { + return null; } - return false; -} +}; -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ +var set = function set(name, value, opts) { + var expires = value !== null ? opts.expirationDays : -1; + if (expires) { + var date = new Date(); + date.setTime(date.getTime() + expires * 24 * 60 * 60 * 1000); + expires = date; + } + var str = name + '=' + value; + if (expires) { + str += '; expires=' + expires.toUTCString(); + } + str += '; path=/'; + if (opts.domain) { + str += '; domain=' + opts.domain; + } + if (opts.secure) { + str += '; Secure'; + } + document.cookie = str; +}; -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} -}); +var baseCookie = { + set: set, + get: get +}; -var browser = createCommonjsModule(function (module, exports) { -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. +/* + * Cookie data */ -exports = module.exports = debug$1; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); +var _options = { + expirationDays: undefined, + domain: undefined +}; -/** - * Colors. - */ +var reset = function reset() { + _options = { + expirationDays: undefined, + domain: undefined + }; +}; -exports.colors = [ - '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', - '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', - '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', - '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', - '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', - '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', - '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', - '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', - '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', - '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', - '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' -]; +var getHost = function getHost(url) { + var a = document.createElement('a'); + a.href = url; + return a.hostname || location.hostname; +}; -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ +var topDomain = function topDomain(url) { + var host = getHost(url); + var parts = host.split('.'); + var last = parts[parts.length - 1]; + var levels = []; -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; + if (parts.length === 4 && last === parseInt(last, 10)) { + return levels; } - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; + if (parts.length <= 1) { + return levels; } - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} + for (var i = parts.length - 2; i >= 0; --i) { + levels.push(parts.slice(i).join('.')); + } -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ + for (var _i = 0; _i < levels.length; ++_i) { + var cname = '__tld_test__'; + var domain = levels[_i]; + var opts = { domain: '.' + domain }; -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; + baseCookie.set(cname, 1, opts); + if (baseCookie.get(cname)) { + baseCookie.set(cname, null, opts); + return domain; + } } + + return ''; }; +var options = function options(opts) { + if (arguments.length === 0) { + return _options; + } -/** - * Colorize log arguments if enabled. - * - * @api public - */ + opts = opts || {}; -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); + _options.expirationDays = opts.expirationDays; + _options.secure = opts.secure; - args.splice(lastC, 0, c); -} + var domain = !utils.isEmptyString(opts.domain) ? opts.domain : '.' + topDomain(getLocation().href); + var token = Math.random(); + _options.domain = domain; + set$1('amplitude_test', token); + var stored = get$1('amplitude_test'); + if (!stored || stored !== token) { + domain = null; + } + remove('amplitude_test'); + _options.domain = domain; -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ + return _options; +}; -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} +var _domainSpecific = function _domainSpecific(name) { + // differentiate between cookies on different domains + var suffix = ''; + if (_options.domain) { + suffix = _options.domain.charAt(0) === '.' ? _options.domain.substring(1) : _options.domain; + } + return name + suffix; +}; -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ +var get$1 = function get(name) { + var nameEq = _domainSpecific(name) + '='; + var value = baseCookie.get(nameEq); -function save(namespaces) { try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; + if (value) { + return JSON.parse(Base64.decode(value)); } - } catch(e) {} -} + } catch (e) { + return null; + } -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ + return null; +}; -function load() { - var r; +var set$1 = function set(name, value) { try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; + baseCookie.set(_domainSpecific(name), Base64.encode(JSON.stringify(value)), _options); + return true; + } catch (e) { + return false; } +}; - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { +var remove = function remove(name) { try { - return window.localStorage; - } catch (e) {} -} -}); - -/** - * Module dependencies. - */ - -var debug = browser('cookie'); - -/** - * Set or get cookie `name` with `value` and `options` object. - * - * @param {String} name - * @param {String} value - * @param {Object} options - * @return {Mixed} - * @api public - */ - -var componentCookie = function(name, value, options){ - switch (arguments.length) { - case 3: - case 2: - return set$1(name, value, options); - case 1: - return get$1(name); - default: - return all(); + baseCookie.set(_domainSpecific(name), null, _options); + return true; + } catch (e) { + return false; } }; -/** - * Set cookie `name` to `value`. - * - * @param {String} name - * @param {String} value - * @param {Object} options - * @api private - */ - -function set$1(name, value, options) { - options = options || {}; - var str = encode(name) + '=' + encode(value); - - if (null == value) options.maxage = -1; - - if (options.maxage) { - options.expires = new Date(+new Date + options.maxage); - } +var Cookie = { + reset: reset, + options: options, + get: get$1, + set: set$1, + remove: remove +}; - if (options.path) str += '; path=' + options.path; - if (options.domain) str += '; domain=' + options.domain; - if (options.expires) str += '; expires=' + options.expires.toUTCString(); - if (options.secure) str += '; secure'; +/* jshint -W020, unused: false, noempty: false, boss: true */ - document.cookie = str; -} +{ + var localStorage; // jshint ignore:line -/** - * Return all cookies. - * - * @return {Object} - * @api private - */ + // test that Window.localStorage is available and works + var windowLocalStorageAvailable = function windowLocalStorageAvailable() { + var uid = new Date(); + var result; + try { + window.localStorage.setItem(uid, uid); + result = window.localStorage.getItem(uid) === String(uid); + window.localStorage.removeItem(uid); + return result; + } catch (e) { + // localStorage not available + } + return false; + }; -function all() { - var str; - try { - str = document.cookie; - } catch (err) { - if (typeof console !== 'undefined' && typeof console.error === 'function') { - console.error(err.stack || err); + if (windowLocalStorageAvailable()) { + localStorage = window.localStorage; + } else if (window.globalStorage) { + // Firefox 2-3 use globalStorage + // See https://developer.mozilla.org/en/dom/storage#globalStorage + try { + localStorage = window.globalStorage[window.location.hostname]; + } catch (e) { + // Something bad happened... + } + } else { + // IE 5-7 use userData + // See http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx + var div = document.createElement('div'), + attrKey = 'localStorage'; + div.style.display = 'none'; + document.getElementsByTagName('head')[0].appendChild(div); + if (div.addBehavior) { + div.addBehavior('#default#userdata'); + localStorage = { + length: 0, + setItem: function setItem(k, v) { + div.load(attrKey); + if (!div.getAttribute(k)) { + this.length++; + } + div.setAttribute(k, v); + div.save(attrKey); + }, + getItem: function getItem(k) { + div.load(attrKey); + return div.getAttribute(k); + }, + removeItem: function removeItem(k) { + div.load(attrKey); + if (div.getAttribute(k)) { + this.length--; + } + div.removeAttribute(k); + div.save(attrKey); + }, + clear: function clear() { + div.load(attrKey); + var i = 0; + var attr; + while (attr = div.XMLDocument.documentElement.attributes[i++]) { + div.removeAttribute(attr.name); + } + div.save(attrKey); + this.length = 0; + }, + key: function key(k) { + div.load(attrKey); + return div.XMLDocument.documentElement.attributes[k]; + } + }; + div.load(attrKey); + localStorage.length = div.XMLDocument.documentElement.attributes.length; + } else { + /* Nothing we can do ... */ } - return {}; } - return parse(str); -} - -/** - * Get cookie `name`. - * - * @param {String} name - * @return {String} - * @api private - */ - -function get$1(name) { - return all()[name]; + if (!localStorage) { + localStorage = { + length: 0, + setItem: function setItem(k, v) {}, + getItem: function getItem(k) {}, + removeItem: function removeItem(k) {}, + clear: function clear() {}, + key: function key(k) {} + }; + } } -/** - * Parse cookie `str`. - * - * @param {String} str - * @return {Object} - * @api private - */ +var localStorage$1 = localStorage; -function parse(str) { - var obj = {}; - var pairs = str.split(/ *; */); - var pair; - if ('' == pairs[0]) return obj; - for (var i = 0; i < pairs.length; ++i) { - pair = pairs[i].split('='); - obj[decode(pair[0])] = decode(pair[1]); - } - return obj; -} +/* jshint -W020, unused: false, noempty: false, boss: true */ -/** - * Encode. - */ +var cookieStorage = function cookieStorage() { + this.storage = null; +}; -function encode(value){ +// test that cookies are enabled - navigator.cookiesEnabled yields false positives in IE, need to test directly +cookieStorage.prototype._cookiesEnabled = function () { + var uid = String(new Date()); + var result; try { - return encodeURIComponent(value); + Cookie.set(constants.COOKIE_TEST, uid); + result = Cookie.get(constants.COOKIE_TEST) === uid; + Cookie.remove(constants.COOKIE_TEST); + return result; } catch (e) { - debug('error `encode(%o)` - %o', value, e); + // cookies are not enabled } -} - -/** - * Decode. - */ + return false; +}; -function decode(value) { - try { - return decodeURIComponent(value); - } catch (e) { - debug('error `decode(%o)` - %o', value, e); +cookieStorage.prototype.getStorage = function () { + if (this.storage !== null) { + return this.storage; } -} -var lib = createCommonjsModule(function (module, exports) { -'use strict'; + if (this._cookiesEnabled()) { + this.storage = Cookie; + } else { + // if cookies disabled, fallback to localstorage + // note: localstorage does not persist across subdomains + var keyPrefix = 'amp_cookiestore_'; + this.storage = { + _options: { + expirationDays: undefined, + domain: undefined, + secure: false + }, + reset: function reset() { + this._options = { + expirationDays: undefined, + domain: undefined, + secure: false + }; + }, + options: function options(opts) { + if (arguments.length === 0) { + return this._options; + } + opts = opts || {}; + this._options.expirationDays = opts.expirationDays || this._options.expirationDays; + // localStorage is specific to subdomains + this._options.domain = opts.domain || this._options.domain || window.location.hostname; + return this._options.secure = opts.secure || false; + }, + get: function get(name) { + try { + return JSON.parse(localStorage$1.getItem(keyPrefix + name)); + } catch (e) {} + return null; + }, + set: function set(name, value) { + try { + localStorage$1.setItem(keyPrefix + name, JSON.stringify(value)); + return true; + } catch (e) {} + return false; + }, + remove: function remove(name) { + try { + localStorage$1.removeItem(keyPrefix + name); + } catch (e) { + return false; + } + } + }; + } -/** - * Module dependencies. - */ + return this.storage; +}; -var parse = componentUrl.parse; +var getUtmData = function getUtmData(rawCookie, query) { + // Translate the utmz cookie format into url query string format. + var cookie = rawCookie ? '?' + rawCookie.split('.').slice(-1)[0].replace(/\|/g, '&') : ''; + var fetchParam = function fetchParam(queryName, query, cookieName, cookie) { + return utils.getQueryParam(queryName, query) || utils.getQueryParam(cookieName, cookie); + }; -/** - * Get the top domain. - * - * The function constructs the levels of domain and attempts to set a global - * cookie on each one when it succeeds it returns the top level domain. - * - * The method returns an empty string when the hostname is an ip or `localhost`. - * - * Example levels: - * - * domain.levels('http://www.google.co.uk'); - * // => ["co.uk", "google.co.uk", "www.google.co.uk"] - * - * Example: - * - * domain('http://localhost:3000/baz'); - * // => '' - * domain('http://dev:3000/baz'); - * // => '' - * domain('http://127.0.0.1:3000/baz'); - * // => '' - * domain('http://segment.io/baz'); - * // => 'segment.io' - * - * @param {string} url - * @return {string} - * @api public - */ -function domain(url) { - var cookie$$1 = exports.cookie; - var levels = exports.levels(url); - - // Lookup the real top level one. - for (var i = 0; i < levels.length; ++i) { - var cname = '__tld__'; - var domain = levels[i]; - var opts = { domain: '.' + domain }; + var utmSource = fetchParam(constants.UTM_SOURCE, query, 'utmcsr', cookie); + var utmMedium = fetchParam(constants.UTM_MEDIUM, query, 'utmcmd', cookie); + var utmCampaign = fetchParam(constants.UTM_CAMPAIGN, query, 'utmccn', cookie); + var utmTerm = fetchParam(constants.UTM_TERM, query, 'utmctr', cookie); + var utmContent = fetchParam(constants.UTM_CONTENT, query, 'utmcct', cookie); - cookie$$1(cname, 1, opts); - if (cookie$$1(cname)) { - cookie$$1(cname, null, opts); - return domain; + var utmData = {}; + var addIfNotNull = function addIfNotNull(key, value) { + if (!utils.isEmptyString(value)) { + utmData[key] = value; } - } - - return ''; -} - -/** - * Levels returns all levels of the given url. - * - * @param {string} url - * @return {Array} - * @api public - */ -domain.levels = function(url) { - var host = parse(url).hostname; - var parts = host.split('.'); - var last = parts[parts.length - 1]; - var levels = []; - - // Ip address. - if (parts.length === 4 && last === parseInt(last, 10)) { - return levels; - } - - // Localhost. - if (parts.length <= 1) { - return levels; - } + }; - // Create levels. - for (var i = parts.length - 2; i >= 0; --i) { - levels.push(parts.slice(i).join('.')); - } + addIfNotNull(constants.UTM_SOURCE, utmSource); + addIfNotNull(constants.UTM_MEDIUM, utmMedium); + addIfNotNull(constants.UTM_CAMPAIGN, utmCampaign); + addIfNotNull(constants.UTM_TERM, utmTerm); + addIfNotNull(constants.UTM_CONTENT, utmContent); - return levels; + return utmData; }; -/** - * Expose cookie on domain. - */ -domain.cookie = componentCookie; - /* - * Exports. + * Wrapper for a user properties JSON object that supports operations. + * Note: if a user property is used in multiple operations on the same Identify object, + * only the first operation will be saved, and the rest will be ignored. */ -exports = module.exports = domain; -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; +var AMP_OP_ADD = '$add'; +var AMP_OP_APPEND = '$append'; +var AMP_OP_CLEAR_ALL = '$clearAll'; +var AMP_OP_PREPEND = '$prepend'; +var AMP_OP_SET = '$set'; +var AMP_OP_SET_ONCE = '$setOnce'; +var AMP_OP_UNSET = '$unset'; /** - * toString ref. - * @private + * Identify API - instance constructor. Identify objects are a wrapper for user property operations. + * Each method adds a user property operation to the Identify object, and returns the same Identify object, + * allowing you to chain multiple method calls together. + * Note: if the same user property is used in multiple operations on a single Identify object, + * only the first operation on that property will be saved, and the rest will be ignored. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} + * for more information on the Identify API and user property operations. + * @constructor Identify + * @public + * @example var identify = new amplitude.Identify(); */ - -var toString = Object.prototype.toString; +var Identify = function Identify() { + this.userPropertiesOperations = {}; + this.properties = []; // keep track of keys that have been added +}; /** - * Return the type of `val`. - * @private - * @param {Mixed} val - * @return {String} - * @api public + * Increment a user property by a given value (can also be negative to decrement). + * If the user property does not have a value set yet, it will be initialized to 0 before being incremented. + * @public + * @param {string} property - The user property key. + * @param {number|string} value - The amount by which to increment the user property. Allows numbers as strings (ex: '123'). + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().add('karma', 1).add('friends', 1); + * amplitude.identify(identify); // send the Identify call */ - -var type = function (val) { - switch (toString.call(val)) { - case '[object Date]': - return 'date'; - case '[object RegExp]': - return 'regexp'; - case '[object Arguments]': - return 'arguments'; - case '[object Array]': - return 'array'; - case '[object Error]': - return 'error'; - } - - if (val === null) { - return 'null'; - } - if (val === undefined) { - return 'undefined'; - } - if (val !== val) { - return 'nan'; - } - if (val && val.nodeType === 1) { - return 'element'; - } - - if (typeof Buffer !== 'undefined' && typeof Buffer.isBuffer === 'function' && Buffer.isBuffer(val)) { - return 'buffer'; +Identify.prototype.add = function (property, value) { + if (type(value) === 'number' || type(value) === 'string') { + this._addOperation(AMP_OP_ADD, property, value); + } else { + utils.log.error('Unsupported type for value: ' + type(value) + ', expecting number or string'); } - - val = val.valueOf ? val.valueOf() : Object.prototype.valueOf.apply(val); - return typeof val === 'undefined' ? 'undefined' : _typeof(val); + return this; }; -var logLevels = { - DISABLE: 0, - ERROR: 1, - WARN: 2, - INFO: 3 +/** + * Append a value or values to a user property. + * If the user property does not have a value set yet, + * it will be initialized to an empty list before the new values are appended. + * If the user property has an existing value and it is not a list, + * the existing value will be converted into a list with the new values appended. + * @public + * @param {string} property - The user property key. + * @param {number|string|list|object} value - A value or values to append. + * Values can be numbers, strings, lists, or object (key:value dict will be flattened). + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().append('ab-tests', 'new-user-tests'); + * identify.append('some_list', [1, 2, 3, 4, 'values']); + * amplitude.identify(identify); // send the Identify call + */ +Identify.prototype.append = function (property, value) { + this._addOperation(AMP_OP_APPEND, property, value); + return this; }; -var logLevel = logLevels.WARN; - -var setLogLevel = function setLogLevel(logLevelName) { - if (logLevels.hasOwnProperty(logLevelName)) { - logLevel = logLevels[logLevelName]; +/** + * Clear all user properties for the current user. + * SDK user should instead call amplitude.clearUserProperties() instead of using this. + * $clearAll needs to be sent on its own Identify object. If there are already other operations, then don't add $clearAll. + * If $clearAll already in an Identify object, don't allow other operations to be added. + * @private + */ +Identify.prototype.clearAll = function () { + if (Object.keys(this.userPropertiesOperations).length > 0) { + if (!this.userPropertiesOperations.hasOwnProperty(AMP_OP_CLEAR_ALL)) { + utils.log.error('Need to send $clearAll on its own Identify object without any other operations, skipping $clearAll'); + } + return this; } + this.userPropertiesOperations[AMP_OP_CLEAR_ALL] = '-'; + return this; }; -var getLogLevel = function getLogLevel() { - return logLevel; -}; - -var log = { - error: function error(s) { - if (logLevel >= logLevels.ERROR) { - _log(s); - } - }, - - warn: function warn(s) { - if (logLevel >= logLevels.WARN) { - _log(s); - } - }, - - info: function info(s) { - if (logLevel >= logLevels.INFO) { - _log(s); - } - } +/** + * Prepend a value or values to a user property. + * Prepend means inserting the value or values at the front of a list. + * If the user property does not have a value set yet, + * it will be initialized to an empty list before the new values are prepended. + * If the user property has an existing value and it is not a list, + * the existing value will be converted into a list with the new values prepended. + * @public + * @param {string} property - The user property key. + * @param {number|string|list|object} value - A value or values to prepend. + * Values can be numbers, strings, lists, or object (key:value dict will be flattened). + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().prepend('ab-tests', 'new-user-tests'); + * identify.prepend('some_list', [1, 2, 3, 4, 'values']); + * amplitude.identify(identify); // send the Identify call + */ +Identify.prototype.prepend = function (property, value) { + this._addOperation(AMP_OP_PREPEND, property, value); + return this; }; -var _log = function _log(s) { - try { - console.log('[Amplitude] ' + s); - } catch (e) { - // console logging not available - } +/** + * Sets the value of a given user property. If a value already exists, it will be overwriten with the new value. + * @public + * @param {string} property - The user property key. + * @param {number|string|list|object} value - A value or values to set. + * Values can be numbers, strings, lists, or object (key:value dict will be flattened). + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().set('user_type', 'beta'); + * identify.set('name', {'first': 'John', 'last': 'Doe'}); // dict is flattened and becomes name.first: John, name.last: Doe + * amplitude.identify(identify); // send the Identify call + */ +Identify.prototype.set = function (property, value) { + this._addOperation(AMP_OP_SET, property, value); + return this; }; -var isEmptyString = function isEmptyString(str) { - return !str || str.length === 0; +/** + * Sets the value of a given user property only once. Subsequent setOnce operations on that user property will be ignored; + * however, that user property can still be modified through any of the other operations. + * Useful for capturing properties such as 'initial_signup_date', 'initial_referrer', etc. + * @public + * @param {string} property - The user property key. + * @param {number|string|list|object} value - A value or values to set once. + * Values can be numbers, strings, lists, or object (key:value dict will be flattened). + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().setOnce('sign_up_date', '2016-04-01'); + * amplitude.identify(identify); // send the Identify call + */ +Identify.prototype.setOnce = function (property, value) { + this._addOperation(AMP_OP_SET_ONCE, property, value); + return this; }; -var sessionStorageEnabled = function sessionStorageEnabled() { - try { - if (window.sessionStorage) { - return true; - } - } catch (e) {} // sessionStorage disabled - return false; +/** + * Unset and remove a user property. This user property will no longer show up in a user's profile. + * @public + * @param {string} property - The user property key. + * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. + * @example var identify = new amplitude.Identify().unset('user_type').unset('age'); + * amplitude.identify(identify); // send the Identify call + */ +Identify.prototype.unset = function (property) { + this._addOperation(AMP_OP_UNSET, property, '-'); + return this; }; -// truncate string values in event and user properties so that request size does not get too large -var truncate = function truncate(value) { - if (type(value) === 'array') { - for (var i = 0; i < value.length; i++) { - value[i] = truncate(value[i]); - } - } else if (type(value) === 'object') { - for (var key in value) { - if (value.hasOwnProperty(key)) { - value[key] = truncate(value[key]); - } - } - } else { - value = _truncateValue(value); +/** + * Helper function that adds operation to the Identify's object + * Handle's filtering of duplicate user property keys, and filtering for clearAll. + * @private + */ +Identify.prototype._addOperation = function (operation, property, value) { + // check that the identify doesn't already contain a clearAll + if (this.userPropertiesOperations.hasOwnProperty(AMP_OP_CLEAR_ALL)) { + utils.log.error('This identify already contains a $clearAll operation, skipping operation ' + operation); + return; } - return value; -}; - -var _truncateValue = function _truncateValue(value) { - if (type(value) === 'string') { - return value.length > constants.MAX_STRING_LENGTH ? value.substring(0, constants.MAX_STRING_LENGTH) : value; + // check that property wasn't already used in this Identify + if (this.properties.indexOf(property) !== -1) { + utils.log.error('User property "' + property + '" already used in this identify, skipping operation ' + operation); + return; } - return value; -}; -var validateInput = function validateInput(input, name, expectedType) { - if (type(input) !== expectedType) { - log.error('Invalid ' + name + ' input type. Expected ' + expectedType + ' but received ' + type(input)); - return false; + if (!this.userPropertiesOperations.hasOwnProperty(operation)) { + this.userPropertiesOperations[operation] = {}; } - return true; + this.userPropertiesOperations[operation][property] = value; + this.properties.push(property); }; -// do some basic sanitization and type checking, also catch property dicts with more than 1000 key/value pairs -var validateProperties = function validateProperties(properties) { - var propsType = type(properties); - if (propsType !== 'object') { - log.error('Error: invalid properties format. Expecting Javascript object, received ' + propsType + ', ignoring'); - return {}; +var md5 = createCommonjsModule(function (module) { +(function ($) { + + /* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + function safeAdd (x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff) } - if (Object.keys(properties).length > constants.MAX_PROPERTY_KEYS) { - log.error('Error: too many properties (more than 1000), ignoring'); - return {}; + /* + * Bitwise rotate a 32-bit number to the left. + */ + function bitRotateLeft (num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)) } - var copy = {}; // create a copy with all of the valid properties - for (var property in properties) { - if (!properties.hasOwnProperty(property)) { - continue; - } - - // validate key - var key = property; - var keyType = type(key); - if (keyType !== 'string') { - key = String(key); - log.warn('WARNING: Non-string property key, received type ' + keyType + ', coercing to string "' + key + '"'); - } - - // validate value - var value = validatePropertyValue(key, properties[property]); - if (value === null) { - continue; - } - copy[key] = value; - } - return copy; -}; - -var invalidValueTypes = ['null', 'nan', 'undefined', 'function', 'arguments', 'regexp', 'element']; - -var validatePropertyValue = function validatePropertyValue(key, value) { - var valueType = type(value); - if (invalidValueTypes.indexOf(valueType) !== -1) { - log.warn('WARNING: Property key "' + key + '" with invalid value type ' + valueType + ', ignoring'); - value = null; - } else if (valueType === 'error') { - value = String(value); - log.warn('WARNING: Property key "' + key + '" with value type error, coercing to ' + value); - } else if (valueType === 'array') { - // check for nested arrays or objects - var arrayCopy = []; - for (var i = 0; i < value.length; i++) { - var element = value[i]; - var elemType = type(element); - if (elemType === 'array' || elemType === 'object') { - log.warn('WARNING: Cannot have ' + elemType + ' nested in an array property value, skipping'); - continue; - } - arrayCopy.push(validatePropertyValue(key, element)); - } - value = arrayCopy; - } else if (valueType === 'object') { - value = validateProperties(value); - } - return value; -}; - -var validateGroups = function validateGroups(groups) { - var groupsType = type(groups); - if (groupsType !== 'object') { - log.error('Error: invalid groups format. Expecting Javascript object, received ' + groupsType + ', ignoring'); - return {}; - } - - var copy = {}; // create a copy with all of the valid properties - for (var group in groups) { - if (!groups.hasOwnProperty(group)) { - continue; - } - - // validate key - var key = group; - var keyType = type(key); - if (keyType !== 'string') { - key = String(key); - log.warn('WARNING: Non-string groupType, received type ' + keyType + ', coercing to string "' + key + '"'); - } - - // validate value - var value = validateGroupName(key, groups[group]); - if (value === null) { - continue; - } - copy[key] = value; - } - return copy; -}; - -var validateGroupName = function validateGroupName(key, groupName) { - var groupNameType = type(groupName); - if (groupNameType === 'string') { - return groupName; - } - if (groupNameType === 'date' || groupNameType === 'number' || groupNameType === 'boolean') { - groupName = String(groupName); - log.warn('WARNING: Non-string groupName, received type ' + groupNameType + ', coercing to string "' + groupName + '"'); - return groupName; - } - if (groupNameType === 'array') { - // check for nested arrays or objects - var arrayCopy = []; - for (var i = 0; i < groupName.length; i++) { - var element = groupName[i]; - var elemType = type(element); - if (elemType === 'array' || elemType === 'object') { - log.warn('WARNING: Skipping nested ' + elemType + ' in array groupName'); - continue; - } else if (elemType === 'string') { - arrayCopy.push(element); - } else if (elemType === 'date' || elemType === 'number' || elemType === 'boolean') { - element = String(element); - log.warn('WARNING: Non-string groupName, received type ' + elemType + ', coercing to string "' + element + '"'); - arrayCopy.push(element); - } - } - return arrayCopy; - } - log.warn('WARNING: Non-string groupName, received type ' + groupNameType + '. Please use strings or array of strings for groupName'); -}; - -// parses the value of a url param (for example ?gclid=1234&...) -var getQueryParam = function getQueryParam(name, query) { - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); - var results = regex.exec(query); - return results === null ? undefined : decodeURIComponent(results[1].replace(/\+/g, " ")); -}; - -var utils = { - setLogLevel: setLogLevel, - getLogLevel: getLogLevel, - logLevels: logLevels, - log: log, - isEmptyString: isEmptyString, - getQueryParam: getQueryParam, - sessionStorageEnabled: sessionStorageEnabled, - truncate: truncate, - validateGroups: validateGroups, - validateInput: validateInput, - validateProperties: validateProperties -}; - -/* - * Cookie data - */ - -var _options = { - expirationDays: undefined, - domain: undefined -}; - -var reset = function reset() { - _options = { - expirationDays: undefined, - domain: undefined - }; -}; - -var options = function options(opts) { - if (arguments.length === 0) { - return _options; - } - - opts = opts || {}; - - _options.expirationDays = opts.expirationDays; - - var domain = !utils.isEmptyString(opts.domain) ? opts.domain : '.' + lib(window.location.href); - var token = Math.random(); - _options.domain = domain; - set('amplitude_test', token); - var stored = get('amplitude_test'); - if (!stored || stored !== token) { - domain = null; - } - remove('amplitude_test'); - _options.domain = domain; -}; - -var _domainSpecific = function _domainSpecific(name) { - // differentiate between cookies on different domains - var suffix = ''; - if (_options.domain) { - suffix = _options.domain.charAt(0) === '.' ? _options.domain.substring(1) : _options.domain; - } - return name + suffix; -}; - -var get = function get(name) { - try { - var nameEq = _domainSpecific(name) + '='; - var ca = document.cookie.split(';'); - var value = null; - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) === ' ') { - c = c.substring(1, c.length); - } - if (c.indexOf(nameEq) === 0) { - value = c.substring(nameEq.length, c.length); - break; - } - } - - if (value) { - return JSON.parse(Base64.decode(value)); - } - return null; - } catch (e) { - return null; - } -}; - -var set = function set(name, value) { - try { - _set(_domainSpecific(name), Base64.encode(JSON.stringify(value)), _options); - return true; - } catch (e) { - return false; - } -}; - -var _set = function _set(name, value, opts) { - var expires = value !== null ? opts.expirationDays : -1; - if (expires) { - var date = new Date(); - date.setTime(date.getTime() + expires * 24 * 60 * 60 * 1000); - expires = date; - } - var str = name + '=' + value; - if (expires) { - str += '; expires=' + expires.toUTCString(); - } - str += '; path=/'; - if (opts.domain) { - str += '; domain=' + opts.domain; - } - document.cookie = str; -}; - -var remove = function remove(name) { - try { - _set(_domainSpecific(name), null, _options); - return true; - } catch (e) { - return false; - } -}; - -var Cookie = { - reset: reset, - options: options, - get: get, - set: set, - remove: remove - -}; - -/* jshint -W020, unused: false, noempty: false, boss: true */ - -/* - * Implement localStorage to support Firefox 2-3 and IE 5-7 - */ -var localStorage; // jshint ignore:line - -// test that Window.localStorage is available and works -function windowLocalStorageAvailable() { - var uid = new Date(); - var result; - try { - window.localStorage.setItem(uid, uid); - result = window.localStorage.getItem(uid) === String(uid); - window.localStorage.removeItem(uid); - return result; - } catch (e) { - // localStorage not available - } - return false; -} - -if (windowLocalStorageAvailable()) { - localStorage = window.localStorage; -} else if (window.globalStorage) { - // Firefox 2-3 use globalStorage - // See https://developer.mozilla.org/en/dom/storage#globalStorage - try { - localStorage = window.globalStorage[window.location.hostname]; - } catch (e) { - // Something bad happened... - } -} else { - // IE 5-7 use userData - // See http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx - var div = document.createElement('div'), - attrKey = 'localStorage'; - div.style.display = 'none'; - document.getElementsByTagName('head')[0].appendChild(div); - if (div.addBehavior) { - div.addBehavior('#default#userdata'); - localStorage = { - length: 0, - setItem: function setItem(k, v) { - div.load(attrKey); - if (!div.getAttribute(k)) { - this.length++; - } - div.setAttribute(k, v); - div.save(attrKey); - }, - getItem: function getItem(k) { - div.load(attrKey); - return div.getAttribute(k); - }, - removeItem: function removeItem(k) { - div.load(attrKey); - if (div.getAttribute(k)) { - this.length--; - } - div.removeAttribute(k); - div.save(attrKey); - }, - clear: function clear() { - div.load(attrKey); - var i = 0; - var attr; - while (attr = div.XMLDocument.documentElement.attributes[i++]) { - div.removeAttribute(attr.name); - } - div.save(attrKey); - this.length = 0; - }, - key: function key(k) { - div.load(attrKey); - return div.XMLDocument.documentElement.attributes[k]; - } - }; - div.load(attrKey); - localStorage.length = div.XMLDocument.documentElement.attributes.length; - } else { - /* Nothing we can do ... */ - } -} -if (!localStorage) { - localStorage = { - length: 0, - setItem: function setItem(k, v) {}, - getItem: function getItem(k) {}, - removeItem: function removeItem(k) {}, - clear: function clear() {}, - key: function key(k) {} - }; -} - -var localStorage$1 = localStorage; - -/* jshint -W020, unused: false, noempty: false, boss: true */ - -/* - * Abstraction layer for cookie storage. - * Uses cookie if available, otherwise fallback to localstorage. - */ - -var cookieStorage = function cookieStorage() { - this.storage = null; -}; - -// test that cookies are enabled - navigator.cookiesEnabled yields false positives in IE, need to test directly -cookieStorage.prototype._cookiesEnabled = function () { - var uid = String(new Date()); - var result; - try { - Cookie.set(constants.COOKIE_TEST, uid); - result = Cookie.get(constants.COOKIE_TEST) === uid; - Cookie.remove(constants.COOKIE_TEST); - return result; - } catch (e) { - // cookies are not enabled - } - return false; -}; - -cookieStorage.prototype.getStorage = function () { - if (this.storage !== null) { - return this.storage; - } - - if (this._cookiesEnabled()) { - this.storage = Cookie; - } else { - // if cookies disabled, fallback to localstorage - // note: localstorage does not persist across subdomains - var keyPrefix = 'amp_cookiestore_'; - this.storage = { - _options: { - expirationDays: undefined, - domain: undefined - }, - reset: function reset() { - this._options = { - expirationDays: undefined, - domain: undefined - }; - }, - options: function options(opts) { - if (arguments.length === 0) { - return this._options; - } - opts = opts || {}; - this._options.expirationDays = opts.expirationDays || this._options.expirationDays; - // localStorage is specific to subdomains - this._options.domain = opts.domain || this._options.domain || window.location.hostname; - return this._options; - }, - get: function get(name) { - try { - return JSON.parse(localStorage$1.getItem(keyPrefix + name)); - } catch (e) {} - return null; - }, - set: function set(name, value) { - try { - localStorage$1.setItem(keyPrefix + name, JSON.stringify(value)); - return true; - } catch (e) {} - return false; - }, - remove: function remove(name) { - try { - localStorage$1.removeItem(keyPrefix + name); - } catch (e) { - return false; - } - } - }; - } - - return this.storage; -}; - -var getUtmData = function getUtmData(rawCookie, query) { - // Translate the utmz cookie format into url query string format. - var cookie = rawCookie ? '?' + rawCookie.split('.').slice(-1)[0].replace(/\|/g, '&') : ''; - - var fetchParam = function fetchParam(queryName, query, cookieName, cookie) { - return utils.getQueryParam(queryName, query) || utils.getQueryParam(cookieName, cookie); - }; - - var utmSource = fetchParam(constants.UTM_SOURCE, query, 'utmcsr', cookie); - var utmMedium = fetchParam(constants.UTM_MEDIUM, query, 'utmcmd', cookie); - var utmCampaign = fetchParam(constants.UTM_CAMPAIGN, query, 'utmccn', cookie); - var utmTerm = fetchParam(constants.UTM_TERM, query, 'utmctr', cookie); - var utmContent = fetchParam(constants.UTM_CONTENT, query, 'utmcct', cookie); - - var utmData = {}; - var addIfNotNull = function addIfNotNull(key, value) { - if (!utils.isEmptyString(value)) { - utmData[key] = value; - } - }; - - addIfNotNull(constants.UTM_SOURCE, utmSource); - addIfNotNull(constants.UTM_MEDIUM, utmMedium); - addIfNotNull(constants.UTM_CAMPAIGN, utmCampaign); - addIfNotNull(constants.UTM_TERM, utmTerm); - addIfNotNull(constants.UTM_CONTENT, utmContent); - - return utmData; -}; - -/* - * Wrapper for a user properties JSON object that supports operations. - * Note: if a user property is used in multiple operations on the same Identify object, - * only the first operation will be saved, and the rest will be ignored. - */ - -var AMP_OP_ADD = '$add'; -var AMP_OP_APPEND = '$append'; -var AMP_OP_CLEAR_ALL = '$clearAll'; -var AMP_OP_PREPEND = '$prepend'; -var AMP_OP_SET = '$set'; -var AMP_OP_SET_ONCE = '$setOnce'; -var AMP_OP_UNSET = '$unset'; - -/** - * Identify API - instance constructor. Identify objects are a wrapper for user property operations. - * Each method adds a user property operation to the Identify object, and returns the same Identify object, - * allowing you to chain multiple method calls together. - * Note: if the same user property is used in multiple operations on a single Identify object, - * only the first operation on that property will be saved, and the rest will be ignored. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} - * for more information on the Identify API and user property operations. - * @constructor Identify - * @public - * @example var identify = new amplitude.Identify(); - */ -var Identify = function Identify() { - this.userPropertiesOperations = {}; - this.properties = []; // keep track of keys that have been added -}; - -/** - * Increment a user property by a given value (can also be negative to decrement). - * If the user property does not have a value set yet, it will be initialized to 0 before being incremented. - * @public - * @param {string} property - The user property key. - * @param {number|string} value - The amount by which to increment the user property. Allows numbers as strings (ex: '123'). - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().add('karma', 1).add('friends', 1); - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.add = function (property, value) { - if (type(value) === 'number' || type(value) === 'string') { - this._addOperation(AMP_OP_ADD, property, value); - } else { - utils.log.error('Unsupported type for value: ' + type(value) + ', expecting number or string'); - } - return this; -}; - -/** - * Append a value or values to a user property. - * If the user property does not have a value set yet, - * it will be initialized to an empty list before the new values are appended. - * If the user property has an existing value and it is not a list, - * the existing value will be converted into a list with the new values appended. - * @public - * @param {string} property - The user property key. - * @param {number|string|list|object} value - A value or values to append. - * Values can be numbers, strings, lists, or object (key:value dict will be flattened). - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().append('ab-tests', 'new-user-tests'); - * identify.append('some_list', [1, 2, 3, 4, 'values']); - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.append = function (property, value) { - this._addOperation(AMP_OP_APPEND, property, value); - return this; -}; - -/** - * Clear all user properties for the current user. - * SDK user should instead call amplitude.clearUserProperties() instead of using this. - * $clearAll needs to be sent on its own Identify object. If there are already other operations, then don't add $clearAll. - * If $clearAll already in an Identify object, don't allow other operations to be added. - * @private - */ -Identify.prototype.clearAll = function () { - if (Object.keys(this.userPropertiesOperations).length > 0) { - if (!this.userPropertiesOperations.hasOwnProperty(AMP_OP_CLEAR_ALL)) { - utils.log.error('Need to send $clearAll on its own Identify object without any other operations, skipping $clearAll'); - } - return this; - } - this.userPropertiesOperations[AMP_OP_CLEAR_ALL] = '-'; - return this; -}; - -/** - * Prepend a value or values to a user property. - * Prepend means inserting the value or values at the front of a list. - * If the user property does not have a value set yet, - * it will be initialized to an empty list before the new values are prepended. - * If the user property has an existing value and it is not a list, - * the existing value will be converted into a list with the new values prepended. - * @public - * @param {string} property - The user property key. - * @param {number|string|list|object} value - A value or values to prepend. - * Values can be numbers, strings, lists, or object (key:value dict will be flattened). - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().prepend('ab-tests', 'new-user-tests'); - * identify.prepend('some_list', [1, 2, 3, 4, 'values']); - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.prepend = function (property, value) { - this._addOperation(AMP_OP_PREPEND, property, value); - return this; -}; - -/** - * Sets the value of a given user property. If a value already exists, it will be overwriten with the new value. - * @public - * @param {string} property - The user property key. - * @param {number|string|list|object} value - A value or values to set. - * Values can be numbers, strings, lists, or object (key:value dict will be flattened). - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().set('user_type', 'beta'); - * identify.set('name', {'first': 'John', 'last': 'Doe'}); // dict is flattened and becomes name.first: John, name.last: Doe - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.set = function (property, value) { - this._addOperation(AMP_OP_SET, property, value); - return this; -}; - -/** - * Sets the value of a given user property only once. Subsequent setOnce operations on that user property will be ignored; - * however, that user property can still be modified through any of the other operations. - * Useful for capturing properties such as 'initial_signup_date', 'initial_referrer', etc. - * @public - * @param {string} property - The user property key. - * @param {number|string|list|object} value - A value or values to set once. - * Values can be numbers, strings, lists, or object (key:value dict will be flattened). - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().setOnce('sign_up_date', '2016-04-01'); - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.setOnce = function (property, value) { - this._addOperation(AMP_OP_SET_ONCE, property, value); - return this; -}; - -/** - * Unset and remove a user property. This user property will no longer show up in a user's profile. - * @public - * @param {string} property - The user property key. - * @return {Identify} Returns the same Identify object, allowing you to chain multiple method calls together. - * @example var identify = new amplitude.Identify().unset('user_type').unset('age'); - * amplitude.identify(identify); // send the Identify call - */ -Identify.prototype.unset = function (property) { - this._addOperation(AMP_OP_UNSET, property, '-'); - return this; -}; - -/** - * Helper function that adds operation to the Identify's object - * Handle's filtering of duplicate user property keys, and filtering for clearAll. - * @private - */ -Identify.prototype._addOperation = function (operation, property, value) { - // check that the identify doesn't already contain a clearAll - if (this.userPropertiesOperations.hasOwnProperty(AMP_OP_CLEAR_ALL)) { - utils.log.error('This identify already contains a $clearAll operation, skipping operation ' + operation); - return; - } - - // check that property wasn't already used in this Identify - if (this.properties.indexOf(property) !== -1) { - utils.log.error('User property "' + property + '" already used in this identify, skipping operation ' + operation); - return; - } - - if (!this.userPropertiesOperations.hasOwnProperty(operation)) { - this.userPropertiesOperations[operation] = {}; - } - this.userPropertiesOperations[operation][property] = value; - this.properties.push(property); -}; - -var md5 = createCommonjsModule(function (module) { -/* - * JavaScript MD5 - * https://github.com/blueimp/JavaScript-MD5 - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - * - * Based on - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -/* global define */ - -(function ($) { - 'use strict'; - - /* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - function safeAdd (x, y) { - var lsw = (x & 0xffff) + (y & 0xffff); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xffff) - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - function bitRotateLeft (num, cnt) { - return (num << cnt) | (num >>> (32 - cnt)) - } - - /* - * These functions implement the four basic operations the algorithm uses. - */ - function md5cmn (q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) - } - function md5ff (a, b, c, d, x, s, t) { - return md5cmn((b & c) | (~b & d), a, b, x, s, t) - } - function md5gg (a, b, c, d, x, s, t) { - return md5cmn((b & d) | (c & ~d), a, b, x, s, t) - } - function md5hh (a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t) - } - function md5ii (a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | ~d), a, b, x, s, t) - } - - /* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - function binlMD5 (x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << (len % 32); - x[((len + 64) >>> 9 << 4) + 14] = len; - - var i; - var olda; - var oldb; - var oldc; - var oldd; - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - - a = md5ff(a, b, c, d, x[i], 7, -680876936); - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); - - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5gg(b, c, d, a, x[i], 20, -373897302); - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); - - a = md5hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5hh(d, a, b, c, x[i], 11, -358537222); - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); - - a = md5ii(a, b, c, d, x[i], 6, -198630844); - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); - - a = safeAdd(a, olda); - b = safeAdd(b, oldb); - c = safeAdd(c, oldc); - d = safeAdd(d, oldd); - } - return [a, b, c, d] - } - - /* - * Convert an array of little-endian words to a string - */ - function binl2rstr (input) { - var i; - var output = ''; - var length32 = input.length * 32; - for (i = 0; i < length32; i += 8) { - output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); - } - return output - } - - /* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - function rstr2binl (input) { - var i; - var output = []; - output[(input.length >> 2) - 1] = undefined; - for (i = 0; i < output.length; i += 1) { - output[i] = 0; - } - var length8 = input.length * 8; - for (i = 0; i < length8; i += 8) { - output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); - } - return output - } - - /* - * Calculate the MD5 of a raw string - */ - function rstrMD5 (s) { - return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)) - } - - /* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ - function rstrHMACMD5 (key, data) { - var i; - var bkey = rstr2binl(key); - var ipad = []; - var opad = []; - var hash; - ipad[15] = opad[15] = undefined; - if (bkey.length > 16) { - bkey = binlMD5(bkey, key.length * 8); - } - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5c5c5c5c; - } - hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)) - } - - /* - * Convert a raw string to a hex string - */ - function rstr2hex (input) { - var hexTab = '0123456789abcdef'; - var output = ''; - var x; - var i; - for (i = 0; i < input.length; i += 1) { - x = input.charCodeAt(i); - output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); - } - return output - } - - /* - * Encode a string as utf-8 - */ - function str2rstrUTF8 (input) { - return unescape(encodeURIComponent(input)) - } - - /* - * Take string arguments and return either raw or hex encoded strings - */ - function rawMD5 (s) { - return rstrMD5(str2rstrUTF8(s)) - } - function hexMD5 (s) { - return rstr2hex(rawMD5(s)) - } - function rawHMACMD5 (k, d) { - return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)) - } - function hexHMACMD5 (k, d) { - return rstr2hex(rawHMACMD5(k, d)) - } - - function md5 (string, key, raw) { - if (!key) { - if (!raw) { - return hexMD5(string) - } - return rawMD5(string) - } - if (!raw) { - return hexHMACMD5(key, string) - } - return rawHMACMD5(key, string) - } - - if (typeof undefined === 'function' && undefined.amd) { - undefined(function () { - return md5 - }); - } else if ('object' === 'object' && module.exports) { - module.exports = md5; - } else { - $.md5 = md5; - } -})(commonjsGlobal); -}); - -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; - this.size = 0; -} - -var _listCacheClear = listCacheClear; - -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @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 = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.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); -} - -var eq_1 = eq; - -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @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_1(array[length][0], key)) { - return length; - } - } - return -1; -} - -var _assocIndexOf = assocIndexOf; - -/** 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 list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - --this.size; - return true; -} - -var _listCacheDelete = listCacheDelete; - -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; -} - -var _listCacheGet = listCacheGet; - -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return _assocIndexOf(this.__data__, key) > -1; -} - -var _listCacheHas = listCacheHas; - -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; -} - -var _listCacheSet = listCacheSet; - -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `ListCache`. -ListCache.prototype.clear = _listCacheClear; -ListCache.prototype['delete'] = _listCacheDelete; -ListCache.prototype.get = _listCacheGet; -ListCache.prototype.has = _listCacheHas; -ListCache.prototype.set = _listCacheSet; - -var _ListCache = ListCache; - -/** - * Removes all key-value entries from the stack. - * - * @private - * @name clear - * @memberOf Stack - */ -function stackClear() { - this.__data__ = new _ListCache; - this.size = 0; -} - -var _stackClear = stackClear; - -/** - * 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__, - result = data['delete'](key); - - this.size = data.size; - return result; -} - -var _stackDelete = stackDelete; - -/** - * 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) { - return this.__data__.get(key); -} - -var _stackGet = stackGet; - -/** - * 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) { - return this.__data__.has(key); -} - -var _stackHas = stackHas; - -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; - -var _freeGlobal = freeGlobal; - -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - -/** Used as a reference to the global object. */ -var root = _freeGlobal || freeSelf || Function('return this')(); - -var _root = root; - -/** Built-in value references. */ -var Symbol$1 = _root.Symbol; - -var _Symbol = Symbol$1; - -/** Used for built-in method references. */ -var objectProto$1 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$1 = objectProto$1.hasOwnProperty; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto$1.toString; - -/** Built-in value references. */ -var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; - -/** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ -function getRawTag(value) { - var isOwn = hasOwnProperty$1.call(value, symToStringTag$1), - tag = value[symToStringTag$1]; - - try { - value[symToStringTag$1] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag$1] = tag; - } else { - delete value[symToStringTag$1]; - } - } - return result; -} - -var _getRawTag = getRawTag; - -/** Used for built-in method references. */ -var objectProto$2 = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString$1 = objectProto$2.toString; - -/** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ -function objectToString(value) { - return nativeObjectToString$1.call(value); -} - -var _objectToString = objectToString; - -/** `Object#toString` result references. */ -var nullTag = '[object Null]'; -var undefinedTag = '[object Undefined]'; - -/** Built-in value references. */ -var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; - -/** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag && symToStringTag in Object(value)) - ? _getRawTag(value) - : _objectToString(value); -} - -var _baseGetTag = baseGetTag; - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @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 != null && (type == 'object' || type == 'function'); -} - -var isObject_1 = isObject; - -/** `Object#toString` result references. */ -var asyncTag = '[object AsyncFunction]'; -var funcTag = '[object Function]'; -var genTag = '[object GeneratorFunction]'; -var proxyTag = '[object Proxy]'; - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - if (!isObject_1(value)) { - return false; - } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = _baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; -} - -var isFunction_1 = isFunction; - -/** Used to detect overreaching core-js shims. */ -var coreJsData = _root['__core-js_shared__']; - -var _coreJsData = coreJsData; - -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); - -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} - -var _isMasked = isMasked; - -/** Used for built-in method references. */ -var funcProto$1 = Function.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString$1 = funcProto$1.toString; - -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to convert. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString$1.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} - -var _toSource = toSource; - -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; - -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; - -/** Used for built-in method references. */ -var funcProto = Function.prototype; -var objectProto = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.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.*?') + '$' -); - -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject_1(value) || _isMasked(value)) { - return false; - } - var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; - return pattern.test(_toSource(value)); -} - -var _baseIsNative = baseIsNative; - -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} - -var _getValue = getValue; - -/** - * 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 = _getValue(object, key); - return _baseIsNative(value) ? value : undefined; -} - -var _getNative = getNative; - -/* Built-in method references that are verified to be native. */ -var Map = _getNative(_root, 'Map'); - -var _Map = Map; - -/* Built-in method references that are verified to be native. */ -var nativeCreate = _getNative(Object, 'create'); - -var _nativeCreate = nativeCreate; - -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; - this.size = 0; -} - -var _hashClear = hashClear; - -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @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(key) { - var result = this.has(key) && delete this.__data__[key]; - this.size -= result ? 1 : 0; - return result; -} - -var _hashDelete = hashDelete; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; - -/** Used for built-in method references. */ -var objectProto$3 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$2 = objectProto$3.hasOwnProperty; - -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (_nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; - } - return hasOwnProperty$2.call(data, key) ? data[key] : undefined; -} - -var _hashGet = hashGet; - -/** Used for built-in method references. */ -var objectProto$4 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$3 = objectProto$4.hasOwnProperty; - -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key); -} - -var _hashHas = hashHas; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; - -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value; - return this; -} - -var _hashSet = hashSet; - -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `Hash`. -Hash.prototype.clear = _hashClear; -Hash.prototype['delete'] = _hashDelete; -Hash.prototype.get = _hashGet; -Hash.prototype.has = _hashHas; -Hash.prototype.set = _hashSet; - -var _Hash = Hash; - -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.size = 0; - this.__data__ = { - 'hash': new _Hash, - 'map': new (_Map || _ListCache), - 'string': new _Hash - }; -} - -var _mapCacheClear = mapCacheClear; - -/** - * 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 == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} - -var _isKeyable = isKeyable; - -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return _isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} - -var _getMapData = getMapData; - -/** - * 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 mapCacheDelete(key) { - var result = _getMapData(this, key)['delete'](key); - this.size -= result ? 1 : 0; - return result; -} - -var _mapCacheDelete = mapCacheDelete; - -/** - * 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 mapCacheGet(key) { - return _getMapData(this, key).get(key); -} - -var _mapCacheGet = mapCacheGet; - -/** - * 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 mapCacheHas(key) { - return _getMapData(this, key).has(key); -} - -var _mapCacheHas = mapCacheHas; - -/** - * 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 instance. - */ -function mapCacheSet(key, value) { - var data = _getMapData(this, key), - size = data.size; - - data.set(key, value); - this.size += data.size == size ? 0 : 1; - return this; -} - -var _mapCacheSet = mapCacheSet; - -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `MapCache`. -MapCache.prototype.clear = _mapCacheClear; -MapCache.prototype['delete'] = _mapCacheDelete; -MapCache.prototype.get = _mapCacheGet; -MapCache.prototype.has = _mapCacheHas; -MapCache.prototype.set = _mapCacheSet; - -var _MapCache = MapCache; - -/** 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 instance. - */ -function stackSet(key, value) { - var data = this.__data__; - if (data instanceof _ListCache) { - var pairs = data.__data__; - if (!_Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { - pairs.push([key, value]); - this.size = ++data.size; - return this; - } - data = this.__data__ = new _MapCache(pairs); - } - data.set(key, value); - this.size = data.size; - return this; -} - -var _stackSet = stackSet; - -/** - * Creates a stack cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Stack(entries) { - var data = this.__data__ = new _ListCache(entries); - this.size = data.size; -} - -// Add methods to `Stack`. -Stack.prototype.clear = _stackClear; -Stack.prototype['delete'] = _stackDelete; -Stack.prototype.get = _stackGet; -Stack.prototype.has = _stackHas; -Stack.prototype.set = _stackSet; - -var _Stack = Stack; - -var defineProperty = (function() { - try { - var func = _getNative(Object, 'defineProperty'); - func({}, '', {}); - return func; - } catch (e) {} -}()); - -var _defineProperty$1 = defineProperty; - -/** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function baseAssignValue(object, key, value) { - if (key == '__proto__' && _defineProperty$1) { - _defineProperty$1(object, key, { - 'configurable': true, - 'enumerable': true, - 'value': value, - 'writable': true - }); - } else { - object[key] = value; - } -} - -var _baseAssignValue = baseAssignValue; - -/** - * This function is like `assignValue` except that it doesn't assign - * `undefined` values. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignMergeValue(object, key, value) { - if ((value !== undefined && !eq_1(object[key], value)) || - (value === undefined && !(key in object))) { - _baseAssignValue(object, key, value); - } -} - -var _assignMergeValue = assignMergeValue; - -/** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @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; - }; -} - -var _createBaseFor = createBaseFor; - -/** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `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(); - -var _baseFor = baseFor; - -var _cloneBuffer = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = 'object' == 'object' && exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Built-in value references. */ -var Buffer = moduleExports ? _root.Buffer : undefined, - allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; - -/** - * Creates a clone of `buffer`. - * - * @private - * @param {Buffer} buffer The buffer to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Buffer} Returns the cloned buffer. - */ -function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); - } - var length = buffer.length, - result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - - buffer.copy(result); - return result; -} - -module.exports = cloneBuffer; -}); - -/** Built-in value references. */ -var Uint8Array = _root.Uint8Array; - -var _Uint8Array = Uint8Array; - -/** - * Creates a clone of `arrayBuffer`. - * - * @private - * @param {ArrayBuffer} arrayBuffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ -function cloneArrayBuffer(arrayBuffer) { - var result = new arrayBuffer.constructor(arrayBuffer.byteLength); - new _Uint8Array(result).set(new _Uint8Array(arrayBuffer)); - return result; -} - -var _cloneArrayBuffer = cloneArrayBuffer; - -/** - * Creates a clone of `typedArray`. - * - * @private - * @param {Object} typedArray The typed array to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned typed array. - */ -function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep ? _cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; - return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); -} - -var _cloneTypedArray = cloneTypedArray; - -/** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ -function copyArray(source, array) { - var index = -1, - length = source.length; - - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; - } - return array; -} - -var _copyArray = copyArray; - -/** Built-in value references. */ -var objectCreate = Object.create; - -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ -var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject_1(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; -}()); - -var _baseCreate = baseCreate; - -/** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ -function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; -} - -var _overArg = overArg; - -/** Built-in value references. */ -var getPrototype = _overArg(Object.getPrototypeOf, Object); - -var _getPrototype = getPrototype; - -/** Used for built-in method references. */ -var objectProto$5 = 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$5; - - return value === proto; -} - -var _isPrototype = isPrototype; - -/** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneObject(object) { - return (typeof object.constructor == 'function' && !_isPrototype(object)) - ? _baseCreate(_getPrototype(object)) - : {}; -} - -var _initCloneObject = initCloneObject; - -/** - * 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 _ - * @since 4.0.0 - * @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 != null && typeof value == 'object'; -} - -var isObjectLike_1 = isObjectLike; - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]'; - -/** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ -function baseIsArguments(value) { - return isObjectLike_1(value) && _baseGetTag(value) == argsTag; -} - -var _baseIsArguments = baseIsArguments; - -/** Used for built-in method references. */ -var objectProto$6 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$4 = objectProto$6.hasOwnProperty; - -/** Built-in value references. */ -var propertyIsEnumerable = objectProto$6.propertyIsEnumerable; - -/** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ -var isArguments = _baseIsArguments(function() { return arguments; }()) ? _baseIsArguments : function(value) { - return isObjectLike_1(value) && hasOwnProperty$4.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee'); -}; - -var isArguments_1 = isArguments; - -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ -var isArray = Array.isArray; - -var isArray_1 = isArray; - -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @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; -} - -var isLength_1 = isLength; - -/** - * 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 _ - * @since 4.0.0 - * @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_1(value.length) && !isFunction_1(value); -} - -var isArrayLike_1 = isArrayLike; - -/** - * This method is like `_.isArrayLike` except that it also checks if `value` - * is an object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @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_1(value) && isArrayLike_1(value); -} - -var isArrayLikeObject_1 = isArrayLikeObject; - -/** - * This method returns `false`. - * - * @static - * @memberOf _ - * @since 4.13.0 - * @category Util - * @returns {boolean} Returns `false`. - * @example - * - * _.times(2, _.stubFalse); - * // => [false, false] - */ -function stubFalse() { - return false; -} - -var stubFalse_1 = stubFalse; - -var isBuffer_1 = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = 'object' == 'object' && exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Built-in value references. */ -var Buffer = moduleExports ? _root.Buffer : undefined; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; - -/** - * Checks if `value` is a buffer. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. - * @example - * - * _.isBuffer(new Buffer(2)); - * // => true - * - * _.isBuffer(new Uint8Array(2)); - * // => false - */ -var isBuffer = nativeIsBuffer || stubFalse_1; - -module.exports = isBuffer; -}); - -/** `Object#toString` result references. */ -var objectTag = '[object Object]'; - -/** Used for built-in method references. */ -var funcProto$2 = Function.prototype; -var objectProto$7 = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString$2 = funcProto$2.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty$5 = objectProto$7.hasOwnProperty; - -/** Used to infer the `Object` constructor. */ -var objectCtorString = funcToString$2.call(Object); - -/** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. - * - * @static - * @memberOf _ - * @since 0.8.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * _.isPlainObject(new Foo); - * // => false - * - * _.isPlainObject([1, 2, 3]); - * // => false - * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true - * - * _.isPlainObject(Object.create(null)); - * // => true - */ -function isPlainObject(value) { - if (!isObjectLike_1(value) || _baseGetTag(value) != objectTag) { - return false; + /* + * These functions implement the four basic operations the algorithm uses. + */ + function md5cmn (q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) } - var proto = _getPrototype(value); - if (proto === null) { - return true; + function md5ff (a, b, c, d, x, s, t) { + return md5cmn((b & c) | (~b & d), a, b, x, s, t) + } + function md5gg (a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & ~d), a, b, x, s, t) + } + function md5hh (a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t) + } + function md5ii (a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t) } - var Ctor = hasOwnProperty$5.call(proto, 'constructor') && proto.constructor; - return typeof Ctor == 'function' && Ctor instanceof Ctor && - funcToString$2.call(Ctor) == objectCtorString; -} - -var isPlainObject_1 = isPlainObject; - -/** `Object#toString` result references. */ -var argsTag$1 = '[object Arguments]'; -var arrayTag = '[object Array]'; -var boolTag = '[object Boolean]'; -var dateTag = '[object Date]'; -var errorTag = '[object Error]'; -var funcTag$1 = '[object Function]'; -var mapTag = '[object Map]'; -var numberTag = '[object Number]'; -var objectTag$1 = '[object Object]'; -var regexpTag = '[object RegExp]'; -var setTag = '[object Set]'; -var stringTag = '[object String]'; -var weakMapTag = '[object WeakMap]'; - -var arrayBufferTag = '[object ArrayBuffer]'; -var dataViewTag = '[object DataView]'; -var float32Tag = '[object Float32Array]'; -var float64Tag = '[object Float64Array]'; -var int8Tag = '[object Int8Array]'; -var int16Tag = '[object Int16Array]'; -var int32Tag = '[object Int32Array]'; -var uint8Tag = '[object Uint8Array]'; -var uint8ClampedTag = '[object Uint8ClampedArray]'; -var uint16Tag = '[object Uint16Array]'; -var 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$1] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = -typedArrayTags[errorTag] = typedArrayTags[funcTag$1] = -typedArrayTags[mapTag] = typedArrayTags[numberTag] = -typedArrayTags[objectTag$1] = typedArrayTags[regexpTag] = -typedArrayTags[setTag] = typedArrayTags[stringTag] = -typedArrayTags[weakMapTag] = false; - -/** - * The base implementation of `_.isTypedArray` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - */ -function baseIsTypedArray(value) { - return isObjectLike_1(value) && - isLength_1(value.length) && !!typedArrayTags[_baseGetTag(value)]; -} - -var _baseIsTypedArray = baseIsTypedArray; - -/** - * The base implementation of `_.unary` without support for storing metadata. - * - * @private - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - */ -function baseUnary(func) { - return function(value) { - return func(value); - }; -} - -var _baseUnary = baseUnary; - -var _nodeUtil = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = 'object' == 'object' && exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Detect free variable `process` from Node.js. */ -var freeProcess = moduleExports && _freeGlobal.process; -/** Used to access faster Node.js helpers. */ -var nodeUtil = (function() { - try { - return freeProcess && freeProcess.binding && freeProcess.binding('util'); - } catch (e) {} -}()); + /* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + function binlMD5 (x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[((len + 64) >>> 9 << 4) + 14] = len; -module.exports = nodeUtil; -}); + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; -/* Node.js helper references. */ -var nodeIsTypedArray = _nodeUtil && _nodeUtil.isTypedArray; + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; -/** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ -var isTypedArray = nodeIsTypedArray ? _baseUnary(nodeIsTypedArray) : _baseIsTypedArray; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); -var isTypedArray_1 = isTypedArray; + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); -/** Used for built-in method references. */ -var objectProto$8 = Object.prototype; + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); -/** Used to check objects for own properties. */ -var hasOwnProperty$6 = objectProto$8.hasOwnProperty; + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); -/** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty$6.call(object, key) && eq_1(objValue, value)) || - (value === undefined && !(key in object))) { - _baseAssignValue(object, key, value); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return [a, b, c, d] } -} - -var _assignValue = assignValue; - -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ -function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); - - var index = -1, - length = props.length; - while (++index < length) { - var key = props[index]; - - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; + /* + * Convert an array of little-endian words to a string + */ + function binl2rstr (input) { + var i; + var output = ''; + var length32 = input.length * 32; + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); + } + return output + } - if (newValue === undefined) { - newValue = source[key]; + /* + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + function rstr2binl (input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; } - if (isNew) { - _baseAssignValue(object, key, newValue); - } else { - _assignValue(object, key, newValue); + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); } + return output } - return object; -} - -var _copyObject = copyObject; - -/** - * 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); + /* + * Calculate the MD5 of a raw string + */ + function rstrMD5 (s) { + return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)) } - return result; -} - -var _baseTimes = baseTimes; - -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER$1 = 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) { - length = length == null ? MAX_SAFE_INTEGER$1 : length; - return !!length && - (typeof value == 'number' || reIsUint.test(value)) && - (value > -1 && value % 1 == 0 && value < length); -} -var _isIndex = isIndex; + /* + * Calculate the HMAC-MD5, of a key and some data (raw strings) + */ + function rstrHMACMD5 (key, data) { + var i; + var bkey = rstr2binl(key); + var ipad = []; + var opad = []; + var hash; + ipad[15] = opad[15] = undefined; + if (bkey.length > 16) { + bkey = binlMD5(bkey, key.length * 8); + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); + return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)) + } -/** Used for built-in method references. */ -var objectProto$9 = Object.prototype; + /* + * Convert a raw string to a hex string + */ + function rstr2hex (input) { + var hexTab = '0123456789abcdef'; + var output = ''; + var x; + var i; + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i); + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); + } + return output + } -/** Used to check objects for own properties. */ -var hasOwnProperty$7 = objectProto$9.hasOwnProperty; + /* + * Encode a string as utf-8 + */ + function str2rstrUTF8 (input) { + return unescape(encodeURIComponent(input)) + } -/** - * Creates an array of the enumerable property names of the array-like `value`. - * - * @private - * @param {*} value The value to query. - * @param {boolean} inherited Specify returning inherited property names. - * @returns {Array} Returns the array of property names. - */ -function arrayLikeKeys(value, inherited) { - var isArr = isArray_1(value), - isArg = !isArr && isArguments_1(value), - isBuff = !isArr && !isArg && isBuffer_1(value), - isType = !isArr && !isArg && !isBuff && isTypedArray_1(value), - skipIndexes = isArr || isArg || isBuff || isType, - result = skipIndexes ? _baseTimes(value.length, String) : [], - length = result.length; - - for (var key in value) { - if ((inherited || hasOwnProperty$7.call(value, key)) && - !(skipIndexes && ( - // Safari 9 has enumerable `arguments.length` in strict mode. - key == 'length' || - // Node.js 0.10 has enumerable non-index properties on buffers. - (isBuff && (key == 'offset' || key == 'parent')) || - // PhantomJS 2 has enumerable non-index properties on typed arrays. - (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || - // Skip index properties. - _isIndex(key, length) - ))) { - result.push(key); - } + /* + * Take string arguments and return either raw or hex encoded strings + */ + function rawMD5 (s) { + return rstrMD5(str2rstrUTF8(s)) + } + function hexMD5 (s) { + return rstr2hex(rawMD5(s)) + } + function rawHMACMD5 (k, d) { + return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)) + } + function hexHMACMD5 (k, d) { + return rstr2hex(rawHMACMD5(k, d)) } - return result; -} - -var _arrayLikeKeys = arrayLikeKeys; -/** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); + function md5 (string, key, raw) { + if (!key) { + if (!raw) { + return hexMD5(string) + } + return rawMD5(string) + } + if (!raw) { + return hexHMACMD5(key, string) } + return rawHMACMD5(key, string) } - return result; -} -var _nativeKeysIn = nativeKeysIn; + if (typeof undefined === 'function' && undefined.amd) { + undefined(function () { + return md5 + }); + } else if ('object' === 'object' && module.exports) { + module.exports = md5; + } else { + $.md5 = md5; + } +})(commonjsGlobal); +}); -/** Used for built-in method references. */ -var objectProto$10 = Object.prototype; +var strictUriEncode = function (str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase(); + }); +}; -/** Used to check objects for own properties. */ -var hasOwnProperty$8 = objectProto$10.hasOwnProperty; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; -/** - * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function baseKeysIn(object) { - if (!isObject_1(object)) { - return _nativeKeysIn(object); - } - var isProto = _isPrototype(object), - result = []; +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } - for (var key in object) { - if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) { - result.push(key); - } - } - return result; + return Object(val); } -var _baseKeysIn = baseKeysIn; - -/** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @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; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ -function keysIn(object) { - return isArrayLike_1(object) ? _arrayLikeKeys(object, true) : _baseKeysIn(object); +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } } -var keysIn_1 = keysIn; +var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; -/** - * Converts `value` to a plain object flattening inherited enumerable string - * keyed properties of `value` to own properties of the plain object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {Object} Returns the converted plain object. - * @example - * - * function Foo() { - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.assign({ 'a': 1 }, new Foo); - * // => { 'a': 1, 'b': 2 } - * - * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); - * // => { 'a': 1, 'b': 2, 'c': 3 } - */ -function toPlainObject(value) { - return _copyObject(value, keysIn_1(value)); -} + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); -var toPlainObject_1 = toPlainObject; + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } -/** - * A specialized version of `baseMerge` for arrays and objects which performs - * deep merges and tracks traversed objects enabling objects with circular - * references to be merged. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {string} key The key of the value to merge. - * @param {number} srcIndex The index of `source`. - * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize assigned values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ -function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { - var objValue = object[key], - srcValue = source[key], - stacked = stack.get(srcValue); + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } - if (stacked) { - _assignMergeValue(object, key, stacked); - return; - } - var newValue = customizer - ? customizer(objValue, srcValue, (key + ''), object, source, stack) - : undefined; + return to; +}; - var isCommon = newValue === undefined; +var token = '%[a-f0-9]{2}'; +var singleMatcher = new RegExp(token, 'gi'); +var multiMatcher = new RegExp('(' + token + ')+', 'gi'); - if (isCommon) { - var isArr = isArray_1(srcValue), - isBuff = !isArr && isBuffer_1(srcValue), - isTyped = !isArr && !isBuff && isTypedArray_1(srcValue); +function decodeComponents(components, split) { + try { + // Try to decode the entire string first + return decodeURIComponent(components.join('')); + } catch (err) { + // Do nothing + } - newValue = srcValue; - if (isArr || isBuff || isTyped) { - if (isArray_1(objValue)) { - newValue = objValue; - } - else if (isArrayLikeObject_1(objValue)) { - newValue = _copyArray(objValue); - } - else if (isBuff) { - isCommon = false; - newValue = _cloneBuffer(srcValue, true); - } - else if (isTyped) { - isCommon = false; - newValue = _cloneTypedArray(srcValue, true); - } - else { - newValue = []; - } - } - else if (isPlainObject_1(srcValue) || isArguments_1(srcValue)) { - newValue = objValue; - if (isArguments_1(objValue)) { - newValue = toPlainObject_1(objValue); - } - else if (!isObject_1(objValue) || (srcIndex && isFunction_1(objValue))) { - newValue = _initCloneObject(srcValue); - } - } - else { - isCommon = false; - } - } - if (isCommon) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, newValue); - mergeFunc(newValue, srcValue, srcIndex, customizer, stack); - stack['delete'](srcValue); - } - _assignMergeValue(object, key, newValue); -} + if (components.length === 1) { + return components; + } -var _baseMergeDeep = baseMergeDeep; + split = split || 1; -/** - * The base implementation of `_.merge` without support for multiple sources. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {number} srcIndex The index of `source`. - * @param {Function} [customizer] The function to customize merged values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ -function baseMerge(object, source, srcIndex, customizer, stack) { - if (object === source) { - return; - } - _baseFor(source, function(srcValue, key) { - if (isObject_1(srcValue)) { - stack || (stack = new _Stack); - _baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); - } - else { - var newValue = customizer - ? customizer(object[key], srcValue, (key + ''), object, source, stack) - : undefined; + // Split the array in 2 parts + var left = components.slice(0, split); + var right = components.slice(split); - if (newValue === undefined) { - newValue = srcValue; - } - _assignMergeValue(object, key, newValue); - } - }, keysIn_1); + return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); } -var _baseMerge = baseMerge; +function decode(input) { + try { + return decodeURIComponent(input); + } catch (err) { + var tokens = input.match(singleMatcher); -/** - * This method returns the first argument it receives. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'a': 1 }; - * - * console.log(_.identity(object) === object); - * // => true - */ -function identity(value) { - return value; -} + for (var i = 1; i < tokens.length; i++) { + input = decodeComponents(tokens, i).join(''); -var identity_1 = identity; + tokens = input.match(singleMatcher); + } -/** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ -function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); + return input; + } } -var _apply = apply; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ -function overRest(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return _apply(func, this, otherArgs); - }; +function customDecodeURIComponent(input) { + // Keep track of all the replacements and prefill the map with the `BOM` + var replaceMap = { + '%FE%FF': '\uFFFD\uFFFD', + '%FF%FE': '\uFFFD\uFFFD' + }; + + var match = multiMatcher.exec(input); + while (match) { + try { + // Decode as big chunks as possible + replaceMap[match[0]] = decodeURIComponent(match[0]); + } catch (err) { + var result = decode(match[0]); + + if (result !== match[0]) { + replaceMap[match[0]] = result; + } + } + + match = multiMatcher.exec(input); + } + + // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else + replaceMap['%C2'] = '\uFFFD'; + + var entries = Object.keys(replaceMap); + + for (var i = 0; i < entries.length; i++) { + // Replace all decoded components + var key = entries[i]; + input = input.replace(new RegExp(key, 'g'), replaceMap[key]); + } + + return input; } -var _overRest = overRest; - -/** - * Creates a function that returns `value`. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {*} value The value to return from the new function. - * @returns {Function} Returns the new constant function. - * @example - * - * var objects = _.times(2, _.constant({ 'a': 1 })); - * - * console.log(objects); - * // => [{ 'a': 1 }, { 'a': 1 }] - * - * console.log(objects[0] === objects[1]); - * // => true - */ -function constant(value) { - return function() { - return value; - }; +var decodeUriComponent = function (encodedURI) { + if (typeof encodedURI !== 'string') { + throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`'); + } + + try { + encodedURI = encodedURI.replace(/\+/g, ' '); + + // Try the built in decoder first + return decodeURIComponent(encodedURI); + } catch (err) { + // Fallback to a more advanced decoder + return customDecodeURIComponent(encodedURI); + } +}; + +function encoderForArrayFormat(opts) { + switch (opts.arrayFormat) { + case 'index': + return function (key, value, index) { + return value === null ? [ + encode(key, opts), + '[', + index, + ']' + ].join('') : [ + encode(key, opts), + '[', + encode(index, opts), + ']=', + encode(value, opts) + ].join(''); + }; + + case 'bracket': + return function (key, value) { + return value === null ? encode(key, opts) : [ + encode(key, opts), + '[]=', + encode(value, opts) + ].join(''); + }; + + default: + return function (key, value) { + return value === null ? encode(key, opts) : [ + encode(key, opts), + '=', + encode(value, opts) + ].join(''); + }; + } } -var constant_1 = constant; - -/** - * The base implementation of `setToString` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ -var baseSetToString = !_defineProperty$1 ? identity_1 : function(func, string) { - return _defineProperty$1(func, 'toString', { - 'configurable': true, - 'enumerable': false, - 'value': constant_1(string), - 'writable': true - }); -}; - -var _baseSetToString = baseSetToString; - -/** Used to detect hot functions by number of calls within a span of milliseconds. */ -var HOT_COUNT = 800; -var HOT_SPAN = 16; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeNow = Date.now; - -/** - * Creates a function that'll short out and invoke `identity` instead - * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` - * milliseconds. - * - * @private - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new shortable function. - */ -function shortOut(func) { - var count = 0, - lastCalled = 0; - - return function() { - var stamp = nativeNow(), - remaining = HOT_SPAN - (stamp - lastCalled); - - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; - } - } else { - count = 0; - } - return func.apply(undefined, arguments); - }; +function parserForArrayFormat(opts) { + var result; + + switch (opts.arrayFormat) { + case 'index': + return function (key, value, accumulator) { + result = /\[(\d*)\]$/.exec(key); + + key = key.replace(/\[\d*\]$/, ''); + + if (!result) { + accumulator[key] = value; + return; + } + + if (accumulator[key] === undefined) { + accumulator[key] = {}; + } + + accumulator[key][result[1]] = value; + }; + + case 'bracket': + return function (key, value, accumulator) { + result = /(\[\])$/.exec(key); + key = key.replace(/\[\]$/, ''); + + if (!result) { + accumulator[key] = value; + return; + } else if (accumulator[key] === undefined) { + accumulator[key] = [value]; + return; + } + + accumulator[key] = [].concat(accumulator[key], value); + }; + + default: + return function (key, value, accumulator) { + if (accumulator[key] === undefined) { + accumulator[key] = value; + return; + } + + accumulator[key] = [].concat(accumulator[key], value); + }; + } } -var _shortOut = shortOut; +function encode(value, opts) { + if (opts.encode) { + return opts.strict ? strictUriEncode(value) : encodeURIComponent(value); + } -/** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ -var setToString = _shortOut(_baseSetToString); + return value; +} -var _setToString = setToString; +function keysSorter(input) { + if (Array.isArray(input)) { + return input.sort(); + } else if (typeof input === 'object') { + return keysSorter(Object.keys(input)).sort(function (a, b) { + return Number(a) - Number(b); + }).map(function (key) { + return input[key]; + }); + } + + return input; +} -/** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ -function baseRest(func, start) { - return _setToString(_overRest(func, start, identity_1), func + ''); +function extract(str) { + var queryStart = str.indexOf('?'); + if (queryStart === -1) { + return ''; + } + return str.slice(queryStart + 1); } -var _baseRest = baseRest; +function parse(str, opts) { + opts = objectAssign({arrayFormat: 'none'}, opts); -/** - * Checks if the given arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, - * else `false`. - */ -function isIterateeCall(value, index, object) { - if (!isObject_1(object)) { - return false; - } - var type = typeof index; - if (type == 'number' - ? (isArrayLike_1(object) && _isIndex(index, object.length)) - : (type == 'string' && index in object) - ) { - return eq_1(object[index], value); - } - return false; -} + var formatter = parserForArrayFormat(opts); -var _isIterateeCall = isIterateeCall; + // Create an object with no prototype + // https://github.com/sindresorhus/query-string/issues/47 + var ret = Object.create(null); -/** - * Creates a function like `_.assign`. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ -function createAssigner(assigner) { - return _baseRest(function(object, sources) { - var index = -1, - length = sources.length, - customizer = length > 1 ? sources[length - 1] : undefined, - guard = length > 2 ? sources[2] : undefined; - - customizer = (assigner.length > 3 && typeof customizer == 'function') - ? (length--, customizer) - : undefined; - - if (guard && _isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined : customizer; - length = 1; - } - object = Object(object); - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, index, customizer); - } - } - return object; - }); -} + if (typeof str !== 'string') { + return ret; + } -var _createAssigner = createAssigner; + str = str.trim().replace(/^[?#&]/, ''); -/** - * This method is like `_.assign` except that it recursively merges own and - * inherited enumerable string keyed properties of source objects into the - * destination object. Source properties that resolve to `undefined` are - * skipped if a destination value exists. Array and plain object properties - * are merged recursively. Other objects and value types are overridden by - * assignment. Source objects are applied from left to right. Subsequent - * sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @example - * - * var object = { - * 'a': [{ 'b': 2 }, { 'd': 4 }] - * }; - * - * var other = { - * 'a': [{ 'c': 3 }, { 'e': 5 }] - * }; - * - * _.merge(object, other); - * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } - */ -var merge = _createAssigner(function(object, source, srcIndex) { - _baseMerge(object, source, srcIndex); -}); + if (!str) { + return ret; + } -var merge_1$1 = merge; - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - -// If obj.hasOwnProperty has been overridden, then calling -// obj.hasOwnProperty(prop) will break. -// See: https://github.com/joyent/node/issues/1707 -function hasOwnProperty$9(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} -var isArray$2 = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; -function stringifyPrimitive(v) { - switch (typeof v) { - case 'string': - return v; + str.split('&').forEach(function (param) { + var parts = param.replace(/\+/g, ' ').split('='); + // Firefox (pre 40) decodes `%3D` to `=` + // https://github.com/sindresorhus/query-string/pull/37 + var key = parts.shift(); + var val = parts.length > 0 ? parts.join('=') : undefined; - case 'boolean': - return v ? 'true' : 'false'; + // missing `=` should be `null`: + // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters + val = val === undefined ? null : decodeUriComponent(val); - case 'number': - return isFinite(v) ? v : ''; + formatter(decodeUriComponent(key), val, ret); + }); - default: - return ''; - } -} + return Object.keys(ret).sort().reduce(function (result, key) { + var val = ret[key]; + if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) { + // Sort object keys, not values + result[key] = keysSorter(val); + } else { + result[key] = val; + } -function stringify (obj, sep, eq, name) { - sep = sep || '&'; - eq = eq || '='; - if (obj === null) { - obj = undefined; - } + return result; + }, Object.create(null)); +} - if (typeof obj === 'object') { - return map(objectKeys(obj), function(k) { - var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; - if (isArray$2(obj[k])) { - return map(obj[k], function(v) { - return ks + encodeURIComponent(stringifyPrimitive(v)); - }).join(sep); - } else { - return ks + encodeURIComponent(stringifyPrimitive(obj[k])); - } - }).join(sep); +var extract_1 = extract; +var parse_1 = parse; - } +var stringify = function (obj, opts) { + var defaults = { + encode: true, + strict: true, + arrayFormat: 'none' + }; - if (!name) return ''; - return encodeURIComponent(stringifyPrimitive(name)) + eq + - encodeURIComponent(stringifyPrimitive(obj)); -} + opts = objectAssign(defaults, opts); -function map (xs, f) { - if (xs.map) return xs.map(f); - var res = []; - for (var i = 0; i < xs.length; i++) { - res.push(f(xs[i], i)); - } - return res; -} + if (opts.sort === false) { + opts.sort = function () {}; + } -var objectKeys = Object.keys || function (obj) { - var res = []; - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); - } - return res; -}; + var formatter = encoderForArrayFormat(opts); -function parse$2(qs, sep, eq, options) { - sep = sep || '&'; - eq = eq || '='; - var obj = {}; + return obj ? Object.keys(obj).sort(opts.sort).map(function (key) { + var val = obj[key]; - if (typeof qs !== 'string' || qs.length === 0) { - return obj; - } + if (val === undefined) { + return ''; + } - var regexp = /\+/g; - qs = qs.split(sep); + if (val === null) { + return encode(key, opts); + } - var maxKeys = 1000; - if (options && typeof options.maxKeys === 'number') { - maxKeys = options.maxKeys; - } + if (Array.isArray(val)) { + var result = []; - var len = qs.length; - // maxKeys <= 0 means that we should not limit keys count - if (maxKeys > 0 && len > maxKeys) { - len = maxKeys; - } + val.slice().forEach(function (val2) { + if (val2 === undefined) { + return; + } - for (var i = 0; i < len; ++i) { - var x = qs[i].replace(regexp, '%20'), - idx = x.indexOf(eq), - kstr, vstr, k, v; + result.push(formatter(key, val2, result.length)); + }); - if (idx >= 0) { - kstr = x.substr(0, idx); - vstr = x.substr(idx + 1); - } else { - kstr = x; - vstr = ''; - } + return result.join('&'); + } - k = decodeURIComponent(kstr); - v = decodeURIComponent(vstr); + return encode(key, opts) + '=' + encode(val, opts); + }).filter(function (x) { + return x.length > 0; + }).join('&') : ''; +}; - if (!hasOwnProperty$9(obj, k)) { - obj[k] = v; - } else if (isArray$2(obj[k])) { - obj[k].push(v); - } else { - obj[k] = [obj[k], v]; - } - } +var parseUrl = function (str, opts) { + return { + url: str.split('?')[0] || '', + query: parse(extract(str), opts) + }; +}; - return obj; -} -var querystring = { - encode: stringify, - stringify: stringify, - decode: parse$2, - parse: parse$2 +var queryString = { + extract: extract_1, + parse: parse_1, + stringify: stringify, + parseUrl: parseUrl }; /* @@ -5526,7 +2700,7 @@ Request.prototype.send = function (callback) { }; xdr.ontimeout = function () {}; xdr.onprogress = function () {}; - xdr.send(querystring.stringify(this.data)); + xdr.send(queryString.stringify(this.data)); } else { var xhr = new XMLHttpRequest(); xhr.open('POST', this.url, true); @@ -5536,7 +2710,7 @@ Request.prototype.send = function (callback) { } }; xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - xhr.send(querystring.stringify(this.data)); + xhr.send(queryString.stringify(this.data)); } //log('sent request to ' + this.url + ' with data ' + decodeURIComponent(queryString(this.data))); }; @@ -5705,8 +2879,6 @@ var uaParser = createCommonjsModule(function (module, exports) { (function (window, undefined) { - 'use strict'; - ////////////// // Constants ///////////// @@ -5918,7 +3090,7 @@ var uaParser = createCommonjsModule(function (module, exports) { 'RT' : 'ARM' }, name : { - 'Windows Phone' : 'Windows Phone OS', + 'Windows Phone' : 'Windows Phone OS' } } } @@ -6597,6 +3769,7 @@ var uaParser = createCommonjsModule(function (module, exports) { })(typeof window === 'object' ? window : commonjsGlobal); }); +var uaParser_1 = uaParser.UAParser; /* jshint bitwise: false, laxbreak: true */ @@ -6608,7 +3781,7 @@ var uaParser = createCommonjsModule(function (module, exports) { * Used to generate UUIDs for deviceIds. * @private */ -var uuid$1 = function uuid(a) { +var uuid = function uuid(a) { return a // if the placeholder was passed, return ? ( // a random number from 0 to 15 a ^ // unless b is 8, @@ -6628,7 +3801,7 @@ var uuid$1 = function uuid(a) { ); }; -var version = '4.5.2'; +var version = '4.6.0'; var getLanguage = function getLanguage() { return navigator && (navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage) || undefined; @@ -6659,6 +3832,7 @@ var DEFAULT_OPTIONS = { savedMaxCount: 1000, saveEvents: true, saveParamsReferrerOncePerSession: true, + secureCookie: false, sessionTimeout: 30 * 60 * 1000, trackingOptions: { city: true, @@ -6679,8 +3853,6 @@ var DEFAULT_OPTIONS = { uploadBatchSize: 100 }; -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - /** * AmplitudeClient SDK API - instance constructor. * The Amplitude class handles creation of client instances, all you need to do is call amplitude.getInstance() @@ -6694,7 +3866,7 @@ var AmplitudeClient = function AmplitudeClient(instanceName) { this._unsentEvents = []; this._unsentIdentifys = []; this._ua = new uaParser(navigator.userAgent).getResult(); - this.options = merge_1$1({}, DEFAULT_OPTIONS); + this.options = _extends({}, DEFAULT_OPTIONS, { trackingOptions: _extends({}, DEFAULT_OPTIONS.trackingOptions) }); this.cookieStorage = new cookieStorage().getStorage(); this._q = []; // queue for proxied functions before script load this._sending = false; @@ -6746,7 +3918,8 @@ AmplitudeClient.prototype.init = function init(apiKey, opt_userId, opt_config, o this.cookieStorage.options({ expirationDays: this.options.cookieExpiration, - domain: this.options.domain + domain: this.options.domain, + secure: this.options.secureCookie }); this.options.domain = this.cookieStorage.options().domain; @@ -6756,7 +3929,7 @@ AmplitudeClient.prototype.init = function init(apiKey, opt_userId, opt_config, o _loadCookieData(this); // load deviceId and userId from input, or try to fetch existing value from cookie - this.options.deviceId = type(opt_config) === 'object' && type(opt_config.deviceId) === 'string' && !utils.isEmptyString(opt_config.deviceId) && opt_config.deviceId || this.options.deviceIdFromUrlParam && this._getDeviceIdFromUrlParam(this._getUrlParams()) || this.options.deviceId || uuid$1() + 'R'; + this.options.deviceId = type(opt_config) === 'object' && type(opt_config.deviceId) === 'string' && !utils.isEmptyString(opt_config.deviceId) && opt_config.deviceId || this.options.deviceIdFromUrlParam && this._getDeviceIdFromUrlParam(this._getUrlParams()) || this.options.deviceId || uuid() + 'R'; this.options.userId = type(opt_userId) === 'string' && !utils.isEmptyString(opt_userId) && opt_userId || type(opt_userId) === 'number' && opt_userId.toString() || this.options.userId || null; // load unsent events and identifies before any attempt to log new ones @@ -7407,7 +4580,7 @@ AmplitudeClient.prototype.resetSessionId = function resetSessionId() { * @public */ AmplitudeClient.prototype.regenerateDeviceId = function regenerateDeviceId() { - this.setDeviceId(uuid$1() + 'R'); + this.setDeviceId(uuid() + 'R'); }; /** @@ -7562,7 +4735,7 @@ AmplitudeClient.prototype.groupIdentify = function (group_type, group_name, iden if (identify_obj instanceof Identify) { // only send if there are operations if (Object.keys(identify_obj.userPropertiesOperations).length > 0) { - return this._logEvent(constants.GROUP_IDENTIFY_EVENT, null, null, null, _defineProperty({}, group_type, group_name), identify_obj.userPropertiesOperations, null, opt_callback); + return this._logEvent(constants.GROUP_IDENTIFY_EVENT, null, null, null, defineProperty({}, group_type, group_name), identify_obj.userPropertiesOperations, null, opt_callback); } else { if (type(opt_callback) === 'function') { opt_callback(0, 'No request sent', { reason: 'No group property operations' }); @@ -7624,8 +4797,8 @@ AmplitudeClient.prototype._logEvent = function _logEvent(eventType, eventPropert _saveCookieData(this); userProperties = userProperties || {}; - var trackingOptions = merge_1$1({}, this._apiPropertiesTrackingOptions); - apiProperties = merge_1$1(trackingOptions, apiProperties || {}); + var trackingOptions = _extends({}, this._apiPropertiesTrackingOptions); + apiProperties = _extends({}, apiProperties || {}, trackingOptions); eventProperties = eventProperties || {}; groups = groups || {}; groupProperties = groupProperties || {}; @@ -7645,7 +4818,7 @@ AmplitudeClient.prototype._logEvent = function _logEvent(eventType, eventPropert api_properties: apiProperties, event_properties: utils.truncate(utils.validateProperties(eventProperties)), user_properties: utils.truncate(utils.validateProperties(userProperties)), - uuid: uuid$1(), + uuid: uuid(), library: { name: 'amplitude-js', version: version @@ -7827,29 +5000,31 @@ AmplitudeClient.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { } }; -/** - * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 - * @public - * @deprecated - * @param {number} price - price of revenue event - * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. - * @param {string} product - (optional) product identifier - * @example amplitudeClient.logRevenue(3.99, 1, 'product_1234'); - */ -AmplitudeClient.prototype.logRevenue = function logRevenue(price, quantity, product) { - // Test that the parameters are of the right type. - if (!this._apiKeySet('logRevenue()') || !_isNumber(price) || quantity !== undefined && !_isNumber(quantity)) { - // utils.log('Price and quantity arguments to logRevenue must be numbers'); - return -1; - } +{ + /** + * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 + * @public + * @deprecated + * @param {number} price - price of revenue event + * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. + * @param {string} product - (optional) product identifier + * @example amplitudeClient.logRevenue(3.99, 1, 'product_1234'); + */ + AmplitudeClient.prototype.logRevenue = function logRevenue(price, quantity, product) { + // Test that the parameters are of the right type. + if (!this._apiKeySet('logRevenue()') || !_isNumber(price) || quantity !== undefined && !_isNumber(quantity)) { + // utils.log('Price and quantity arguments to logRevenue must be numbers'); + return -1; + } - return this._logEvent(constants.REVENUE_EVENT, {}, { - productId: product, - special: 'revenue_amount', - quantity: quantity || 1, - price: price - }, null, null, null, null, null); -}; + return this._logEvent(constants.REVENUE_EVENT, {}, { + productId: product, + special: 'revenue_amount', + quantity: quantity || 1, + price: price + }, null, null, null, null, null); + }; +} /** * Remove events in storage with event ids up to and including maxEventId. @@ -8022,145 +5197,28 @@ AmplitudeClient.prototype._mergeEventsAndIdentifys = function _mergeEventsAndIde return { eventsToSend: eventsToSend, maxEventId: maxEventId, - maxIdentifyId: maxIdentifyId - }; -}; - -/** - * Set global user properties. Note this is deprecated, and we recommend using setUserProperties - * @public - * @deprecated - */ -AmplitudeClient.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { - this.setUserProperties(userProperties); -}; - -/** - * Get the current version of Amplitude's Javascript SDK. - * @public - * @returns {number} version number - * @example var amplitudeVersion = amplitude.__VERSION__; - */ -AmplitudeClient.prototype.__VERSION__ = version; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeKeys = _overArg(Object.keys, Object); - -var _nativeKeys = nativeKeys; - -/** Used for built-in method references. */ -var objectProto$12 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$11 = objectProto$12.hasOwnProperty; - -/** - * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function baseKeys(object) { - if (!_isPrototype(object)) { - return _nativeKeys(object); - } - var result = []; - for (var key in Object(object)) { - if (hasOwnProperty$11.call(object, key) && key != 'constructor') { - result.push(key); - } - } - return result; -} - -var _baseKeys = baseKeys; - -/** - * 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/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @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) { - return isArrayLike_1(object) ? _arrayLikeKeys(object) : _baseKeys(object); -} - -var keys_1 = keys; - -/** Used for built-in method references. */ -var objectProto$11 = Object.prototype; + maxIdentifyId: maxIdentifyId + }; +}; -/** Used to check objects for own properties. */ -var hasOwnProperty$10 = objectProto$11.hasOwnProperty; +{ + /** + * Set global user properties. Note this is deprecated, and we recommend using setUserProperties + * @public + * @deprecated + */ + AmplitudeClient.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { + this.setUserProperties(userProperties); + }; +} /** - * Assigns own enumerable string keyed properties of source objects to the - * destination object. Source objects are applied from left to right. - * Subsequent sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object` and is loosely based on - * [`Object.assign`](https://mdn.io/Object/assign). - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assignIn - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assign({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'c': 3 } + * Get the current version of Amplitude's Javascript SDK. + * @public + * @returns {number} version number + * @example var amplitudeVersion = amplitude.__VERSION__; */ -var assign = _createAssigner(function(object, source) { - if (_isPrototype(source) || isArrayLike_1(source)) { - _copyObject(source, keys_1(source), object); - return; - } - for (var key in source) { - if (hasOwnProperty$10.call(source, key)) { - _assignValue(object, key, source[key]); - } - } -}); - -var assign_1$1 = assign; +AmplitudeClient.prototype.__VERSION__ = version; /** * Amplitude SDK API - instance manager. @@ -8171,7 +5229,7 @@ var assign_1$1 = assign; * @example var amplitude = new Amplitude(); */ var Amplitude = function Amplitude() { - this.options = assign_1$1({}, DEFAULT_OPTIONS); + this.options = _extends({}, DEFAULT_OPTIONS); this._q = []; this._instances = {}; // mapping of instance names to instances }; @@ -8189,326 +5247,330 @@ Amplitude.prototype.getInstance = function getInstance(instance) { return client; }; -/** - * Initializes the Amplitude Javascript SDK with your apiKey and any optional configurations. - * This is required before any other methods can be called. - * @public - * @param {string} apiKey - The API key for your app. - * @param {string} opt_userId - (optional) An identifier for this user. - * @param {object} opt_config - (optional) Configuration options. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#configuration-options} for list of options and default values. - * @param {function} opt_callback - (optional) Provide a callback function to run after initialization is complete. - * @deprecated Please use amplitude.getInstance().init(apiKey, opt_userId, opt_config, opt_callback); - * @example amplitude.init('API_KEY', 'USER_ID', {includeReferrer: true, includeUtm: true}, function() { alert('init complete'); }); - */ -Amplitude.prototype.init = function init(apiKey, opt_userId, opt_config, opt_callback) { - this.getInstance().init(apiKey, opt_userId, opt_config, function (instance) { - // make options such as deviceId available for callback functions - this.options = instance.options; - if (type(opt_callback) === 'function') { - opt_callback(instance); - } - }.bind(this)); -}; - -/** - * Run functions queued up by proxy loading snippet - * @private - */ -Amplitude.prototype.runQueuedFunctions = function () { - // run queued up old versions of functions - for (var i = 0; i < this._q.length; i++) { - var fn = this[this._q[i][0]]; - if (type(fn) === 'function') { - fn.apply(this, this._q[i].slice(1)); +{ + /** + * Run functions queued up by proxy loading snippet + * @private + */ + Amplitude.prototype.runQueuedFunctions = function () { + // run queued up old versions of functions + for (var i = 0; i < this._q.length; i++) { + var fn = this[this._q[i][0]]; + if (type(fn) === 'function') { + fn.apply(this, this._q[i].slice(1)); + } } - } - this._q = []; // clear function queue after running + this._q = []; // clear function queue after running - // run queued up functions on instances - for (var instance in this._instances) { - if (this._instances.hasOwnProperty(instance)) { - this._instances[instance].runQueuedFunctions(); + // run queued up functions on instances + for (var instance in this._instances) { + if (this._instances.hasOwnProperty(instance)) { + this._instances[instance].runQueuedFunctions(); + } } - } -}; + }; +} -/** - * Returns true if a new session was created during initialization, otherwise false. - * @public - * @return {boolean} Whether a new session was created during initialization. - * @deprecated Please use amplitude.getInstance().isNewSession(); - */ -Amplitude.prototype.isNewSession = function isNewSession() { - return this.getInstance().isNewSession(); -}; +{ + /** + * Initializes the Amplitude Javascript SDK with your apiKey and any optional configurations. + * This is required before any other methods can be called. + * @public + * @param {string} apiKey - The API key for your app. + * @param {string} opt_userId - (optional) An identifier for this user. + * @param {object} opt_config - (optional) Configuration options. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#configuration-options} for list of options and default values. + * @param {function} opt_callback - (optional) Provide a callback function to run after initialization is complete. + * @deprecated Please use amplitude.getInstance().init(apiKey, opt_userId, opt_config, opt_callback); + * @example amplitude.init('API_KEY', 'USER_ID', {includeReferrer: true, includeUtm: true}, function() { alert('init complete'); }); + */ + Amplitude.prototype.init = function init(apiKey, opt_userId, opt_config, opt_callback) { + this.getInstance().init(apiKey, opt_userId, opt_config, function (instance) { + // make options such as deviceId available for callback functions + this.options = instance.options; + if (type(opt_callback) === 'function') { + opt_callback(instance); + } + }.bind(this)); + }; -/** - * Returns the id of the current session. - * @public - * @return {number} Id of the current session. - * @deprecated Please use amplitude.getInstance().getSessionId(); - */ -Amplitude.prototype.getSessionId = function getSessionId() { - return this.getInstance().getSessionId(); -}; + /** + * Returns true if a new session was created during initialization, otherwise false. + * @public + * @return {boolean} Whether a new session was created during initialization. + * @deprecated Please use amplitude.getInstance().isNewSession(); + */ + Amplitude.prototype.isNewSession = function isNewSession() { + return this.getInstance().isNewSession(); + }; -/** - * Increments the eventId and returns it. - * @private - */ -Amplitude.prototype.nextEventId = function nextEventId() { - return this.getInstance().nextEventId(); -}; + /** + * Returns the id of the current session. + * @public + * @return {number} Id of the current session. + * @deprecated Please use amplitude.getInstance().getSessionId(); + */ + Amplitude.prototype.getSessionId = function getSessionId() { + return this.getInstance().getSessionId(); + }; -/** - * Increments the identifyId and returns it. - * @private - */ -Amplitude.prototype.nextIdentifyId = function nextIdentifyId() { - return this.getInstance().nextIdentifyId(); -}; + /** + * Increments the eventId and returns it. + * @private + */ + Amplitude.prototype.nextEventId = function nextEventId() { + return this.getInstance().nextEventId(); + }; -/** - * Increments the sequenceNumber and returns it. - * @private - */ -Amplitude.prototype.nextSequenceNumber = function nextSequenceNumber() { - return this.getInstance().nextSequenceNumber(); -}; + /** + * Increments the identifyId and returns it. + * @private + */ + Amplitude.prototype.nextIdentifyId = function nextIdentifyId() { + return this.getInstance().nextIdentifyId(); + }; -/** - * Saves unsent events and identifies to localStorage. JSON stringifies event queues before saving. - * Note: this is called automatically every time events are logged, unless you explicitly set option saveEvents to false. - * @private - */ -Amplitude.prototype.saveEvents = function saveEvents() { - this.getInstance().saveEvents(); -}; + /** + * Increments the sequenceNumber and returns it. + * @private + */ + Amplitude.prototype.nextSequenceNumber = function nextSequenceNumber() { + return this.getInstance().nextSequenceNumber(); + }; -/** - * Sets a customer domain for the amplitude cookie. Useful if you want to support cross-subdomain tracking. - * @public - * @param {string} domain to set. - * @deprecated Please use amplitude.getInstance().setDomain(domain); - * @example amplitude.setDomain('.amplitude.com'); - */ -Amplitude.prototype.setDomain = function setDomain(domain) { - this.getInstance().setDomain(domain); -}; + /** + * Saves unsent events and identifies to localStorage. JSON stringifies event queues before saving. + * Note: this is called automatically every time events are logged, unless you explicitly set option saveEvents to false. + * @private + */ + Amplitude.prototype.saveEvents = function saveEvents() { + this.getInstance().saveEvents(); + }; -/** - * Sets an identifier for the current user. - * @public - * @param {string} userId - identifier to set. Can be null. - * @deprecated Please use amplitude.getInstance().setUserId(userId); - * @example amplitude.setUserId('joe@gmail.com'); - */ -Amplitude.prototype.setUserId = function setUserId(userId) { - this.getInstance().setUserId(userId); -}; + /** + * Sets a customer domain for the amplitude cookie. Useful if you want to support cross-subdomain tracking. + * @public + * @param {string} domain to set. + * @deprecated Please use amplitude.getInstance().setDomain(domain); + * @example amplitude.setDomain('.amplitude.com'); + */ + Amplitude.prototype.setDomain = function setDomain(domain) { + this.getInstance().setDomain(domain); + }; -/** - * Add user to a group or groups. You need to specify a groupType and groupName(s). - * For example you can group people by their organization. - * In that case groupType is "orgId" and groupName would be the actual ID(s). - * groupName can be a string or an array of strings to indicate a user in multiple gruups. - * You can also call setGroup multiple times with different groupTypes to track multiple types of groups (up to 5 per app). - * Note: this will also set groupType: groupName as a user property. - * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information. - * @public - * @param {string} groupType - the group type (ex: orgId) - * @param {string|list} groupName - the name of the group (ex: 15), or a list of names of the groups - * @deprecated Please use amplitude.getInstance().setGroup(groupType, groupName); - * @example amplitude.setGroup('orgId', 15); // this adds the current user to orgId 15. - */ -Amplitude.prototype.setGroup = function (groupType, groupName) { - this.getInstance().setGroup(groupType, groupName); -}; + /** + * Sets an identifier for the current user. + * @public + * @param {string} userId - identifier to set. Can be null. + * @deprecated Please use amplitude.getInstance().setUserId(userId); + * @example amplitude.setUserId('joe@gmail.com'); + */ + Amplitude.prototype.setUserId = function setUserId(userId) { + this.getInstance().setUserId(userId); + }; -/** - * Sets whether to opt current user out of tracking. - * @public - * @param {boolean} enable - if true then no events will be logged or sent. - * @deprecated Please use amplitude.getInstance().setOptOut(enable); - * @example: amplitude.setOptOut(true); - */ -Amplitude.prototype.setOptOut = function setOptOut(enable) { - this.getInstance().setOptOut(enable); -}; + /** + * Add user to a group or groups. You need to specify a groupType and groupName(s). + * For example you can group people by their organization. + * In that case groupType is "orgId" and groupName would be the actual ID(s). + * groupName can be a string or an array of strings to indicate a user in multiple gruups. + * You can also call setGroup multiple times with different groupTypes to track multiple types of groups (up to 5 per app). + * Note: this will also set groupType: groupName as a user property. + * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information. + * @public + * @param {string} groupType - the group type (ex: orgId) + * @param {string|list} groupName - the name of the group (ex: 15), or a list of names of the groups + * @deprecated Please use amplitude.getInstance().setGroup(groupType, groupName); + * @example amplitude.setGroup('orgId', 15); // this adds the current user to orgId 15. + */ + Amplitude.prototype.setGroup = function (groupType, groupName) { + this.getInstance().setGroup(groupType, groupName); + }; -/** - * Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you - * are doing. This can be used in conjunction with `setUserId(null)` to anonymize users after they log out. - * With a null userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. - * This uses src/uuid.js to regenerate the deviceId. - * @public - * @deprecated Please use amplitude.getInstance().regenerateDeviceId(); - */ -Amplitude.prototype.regenerateDeviceId = function regenerateDeviceId() { - this.getInstance().regenerateDeviceId(); -}; + /** + * Sets whether to opt current user out of tracking. + * @public + * @param {boolean} enable - if true then no events will be logged or sent. + * @deprecated Please use amplitude.getInstance().setOptOut(enable); + * @example: amplitude.setOptOut(true); + */ + Amplitude.prototype.setOptOut = function setOptOut(enable) { + this.getInstance().setOptOut(enable); + }; -/** - * Sets a custom deviceId for current user. Note: this is not recommended unless you know what you are doing - * (like if you have your own system for managing deviceIds). Make sure the deviceId you set is sufficiently unique - * (we recommend something like a UUID - see src/uuid.js for an example of how to generate) to prevent conflicts with other devices in our system. - * @public - * @param {string} deviceId - custom deviceId for current user. - * @deprecated Please use amplitude.getInstance().setDeviceId(deviceId); - * @example amplitude.setDeviceId('45f0954f-eb79-4463-ac8a-233a6f45a8f0'); - */ -Amplitude.prototype.setDeviceId = function setDeviceId(deviceId) { - this.getInstance().setDeviceId(deviceId); -}; + /** + * Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you + * are doing. This can be used in conjunction with `setUserId(null)` to anonymize users after they log out. + * With a null userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. + * This uses src/uuid.js to regenerate the deviceId. + * @public + * @deprecated Please use amplitude.getInstance().regenerateDeviceId(); + */ + Amplitude.prototype.regenerateDeviceId = function regenerateDeviceId() { + this.getInstance().regenerateDeviceId(); + }; -/** - * Sets user properties for the current user. - * @public - * @param {object} - object with string keys and values for the user properties to set. - * @param {boolean} - DEPRECATED opt_replace: in earlier versions of the JS SDK the user properties object was kept in - * memory and replace = true would replace the object in memory. Now the properties are no longer stored in memory, so replace is deprecated. - * @deprecated Please use amplitude.getInstance.setUserProperties(userProperties); - * @example amplitude.setUserProperties({'gender': 'female', 'sign_up_complete': true}) - */ -Amplitude.prototype.setUserProperties = function setUserProperties(userProperties) { - this.getInstance().setUserProperties(userProperties); -}; + /** + * Sets a custom deviceId for current user. Note: this is not recommended unless you know what you are doing + * (like if you have your own system for managing deviceIds). Make sure the deviceId you set is sufficiently unique + * (we recommend something like a UUID - see src/uuid.js for an example of how to generate) to prevent conflicts with other devices in our system. + * @public + * @param {string} deviceId - custom deviceId for current user. + * @deprecated Please use amplitude.getInstance().setDeviceId(deviceId); + * @example amplitude.setDeviceId('45f0954f-eb79-4463-ac8a-233a6f45a8f0'); + */ + Amplitude.prototype.setDeviceId = function setDeviceId(deviceId) { + this.getInstance().setDeviceId(deviceId); + }; -/** - * Clear all of the user properties for the current user. Note: clearing user properties is irreversible! - * @public - * @deprecated Please use amplitude.getInstance().clearUserProperties(); - * @example amplitude.clearUserProperties(); - */ -Amplitude.prototype.clearUserProperties = function clearUserProperties() { - this.getInstance().clearUserProperties(); -}; + /** + * Sets user properties for the current user. + * @public + * @param {object} - object with string keys and values for the user properties to set. + * @param {boolean} - DEPRECATED opt_replace: in earlier versions of the JS SDK the user properties object was kept in + * memory and replace = true would replace the object in memory. Now the properties are no longer stored in memory, so replace is deprecated. + * @deprecated Please use amplitude.getInstance.setUserProperties(userProperties); + * @example amplitude.setUserProperties({'gender': 'female', 'sign_up_complete': true}) + */ + Amplitude.prototype.setUserProperties = function setUserProperties(userProperties) { + this.getInstance().setUserProperties(userProperties); + }; -/** - * Send an identify call containing user property operations to Amplitude servers. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} - * for more information on the Identify API and user property operations. - * @param {Identify} identify_obj - the Identify object containing the user property operations to send. - * @param {Amplitude~eventCallback} opt_callback - (optional) callback function to run when the identify event has been sent. - * Note: the server response code and response body from the identify event upload are passed to the callback function. - * @deprecated Please use amplitude.getInstance().identify(identify); - * @example - * var identify = new amplitude.Identify().set('colors', ['rose', 'gold']).add('karma', 1).setOnce('sign_up_date', '2016-03-31'); - * amplitude.identify(identify); - */ -Amplitude.prototype.identify = function (identify_obj, opt_callback) { - this.getInstance().identify(identify_obj, opt_callback); -}; + /** + * Clear all of the user properties for the current user. Note: clearing user properties is irreversible! + * @public + * @deprecated Please use amplitude.getInstance().clearUserProperties(); + * @example amplitude.clearUserProperties(); + */ + Amplitude.prototype.clearUserProperties = function clearUserProperties() { + this.getInstance().clearUserProperties(); + }; -/** - * Set a versionName for your application. - * @public - * @param {string} versionName - The version to set for your application. - * @deprecated Please use amplitude.getInstance().setVersionName(versionName); - * @example amplitude.setVersionName('1.12.3'); - */ -Amplitude.prototype.setVersionName = function setVersionName(versionName) { - this.getInstance().setVersionName(versionName); -}; + /** + * Send an identify call containing user property operations to Amplitude servers. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} + * for more information on the Identify API and user property operations. + * @param {Identify} identify_obj - the Identify object containing the user property operations to send. + * @param {Amplitude~eventCallback} opt_callback - (optional) callback function to run when the identify event has been sent. + * Note: the server response code and response body from the identify event upload are passed to the callback function. + * @deprecated Please use amplitude.getInstance().identify(identify); + * @example + * var identify = new amplitude.Identify().set('colors', ['rose', 'gold']).add('karma', 1).setOnce('sign_up_date', '2016-03-31'); + * amplitude.identify(identify); + */ + Amplitude.prototype.identify = function (identify_obj, opt_callback) { + this.getInstance().identify(identify_obj, opt_callback); + }; -/** - * This is the callback for logEvent and identify calls. It gets called after the event/identify is uploaded, - * and the server response code and response body from the upload request are passed to the callback function. - * @callback Amplitude~eventCallback - * @param {number} responseCode - Server response code for the event / identify upload request. - * @param {string} responseBody - Server response body for the event / identify upload request. - */ + /** + * Set a versionName for your application. + * @public + * @param {string} versionName - The version to set for your application. + * @deprecated Please use amplitude.getInstance().setVersionName(versionName); + * @example amplitude.setVersionName('1.12.3'); + */ + Amplitude.prototype.setVersionName = function setVersionName(versionName) { + this.getInstance().setVersionName(versionName); + }; -/** - * Log an event with eventType and eventProperties - * @public - * @param {string} eventType - name of event - * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. - * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. - * Note: the server response code and response body from the event upload are passed to the callback function. - * @deprecated Please use amplitude.getInstance().logEvent(eventType, eventProperties, opt_callback); - * @example amplitude.logEvent('Clicked Homepage Button', {'finished_flow': false, 'clicks': 15}); - */ -Amplitude.prototype.logEvent = function logEvent(eventType, eventProperties, opt_callback) { - return this.getInstance().logEvent(eventType, eventProperties, opt_callback); -}; + /** + * This is the callback for logEvent and identify calls. It gets called after the event/identify is uploaded, + * and the server response code and response body from the upload request are passed to the callback function. + * @callback Amplitude~eventCallback + * @param {number} responseCode - Server response code for the event / identify upload request. + * @param {string} responseBody - Server response body for the event / identify upload request. + */ + + /** + * Log an event with eventType and eventProperties + * @public + * @param {string} eventType - name of event + * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. + * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. + * Note: the server response code and response body from the event upload are passed to the callback function. + * @deprecated Please use amplitude.getInstance().logEvent(eventType, eventProperties, opt_callback); + * @example amplitude.logEvent('Clicked Homepage Button', {'finished_flow': false, 'clicks': 15}); + */ + Amplitude.prototype.logEvent = function logEvent(eventType, eventProperties, opt_callback) { + return this.getInstance().logEvent(eventType, eventProperties, opt_callback); + }; -/** - * Log an event with eventType, eventProperties, and groups. Use this to set event-level groups. - * Note: the group(s) set only apply for the specific event type being logged and does not persist on the user - * (unless you explicitly set it with setGroup). - * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information - * about groups and Count by Distinct on the Amplitude platform. - * @public - * @param {string} eventType - name of event - * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. - * @param {object} groups - (optional) an object with string groupType: groupName values for the event being logged. - * groupName can be a string or an array of strings. - * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. - * Note: the server response code and response body from the event upload are passed to the callback function. - * Deprecated Please use amplitude.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); - * @example amplitude.logEventWithGroups('Clicked Button', null, {'orgId': 24}); - */ -Amplitude.prototype.logEventWithGroups = function (eventType, eventProperties, groups, opt_callback) { - return this.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); -}; + /** + * Log an event with eventType, eventProperties, and groups. Use this to set event-level groups. + * Note: the group(s) set only apply for the specific event type being logged and does not persist on the user + * (unless you explicitly set it with setGroup). + * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information + * about groups and Count by Distinct on the Amplitude platform. + * @public + * @param {string} eventType - name of event + * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. + * @param {object} groups - (optional) an object with string groupType: groupName values for the event being logged. + * groupName can be a string or an array of strings. + * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. + * Note: the server response code and response body from the event upload are passed to the callback function. + * Deprecated Please use amplitude.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); + * @example amplitude.logEventWithGroups('Clicked Button', null, {'orgId': 24}); + */ + Amplitude.prototype.logEventWithGroups = function (eventType, eventProperties, groups, opt_callback) { + return this.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); + }; -/** - * Log revenue with Revenue interface. The new revenue interface allows for more revenue fields like - * revenueType and event properties. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#tracking-revenue} - * for more information on the Revenue interface and logging revenue. - * @public - * @param {Revenue} revenue_obj - the revenue object containing the revenue data being logged. - * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); - * @example var revenue = new amplitude.Revenue().setProductId('productIdentifier').setPrice(10.99); - * amplitude.logRevenueV2(revenue); - */ -Amplitude.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { - return this.getInstance().logRevenueV2(revenue_obj); -}; + /** + * Log revenue with Revenue interface. The new revenue interface allows for more revenue fields like + * revenueType and event properties. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#tracking-revenue} + * for more information on the Revenue interface and logging revenue. + * @public + * @param {Revenue} revenue_obj - the revenue object containing the revenue data being logged. + * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); + * @example var revenue = new amplitude.Revenue().setProductId('productIdentifier').setPrice(10.99); + * amplitude.logRevenueV2(revenue); + */ + Amplitude.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { + return this.getInstance().logRevenueV2(revenue_obj); + }; -/** - * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 - * @public - * @param {number} price - price of revenue event - * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. - * @param {string} product - (optional) product identifier - * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); - * @example amplitude.logRevenue(3.99, 1, 'product_1234'); - */ -Amplitude.prototype.logRevenue = function logRevenue(price, quantity, product) { - return this.getInstance().logRevenue(price, quantity, product); -}; + /** + * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 + * @public + * @param {number} price - price of revenue event + * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. + * @param {string} product - (optional) product identifier + * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); + * @example amplitude.logRevenue(3.99, 1, 'product_1234'); + */ + Amplitude.prototype.logRevenue = function logRevenue(price, quantity, product) { + return this.getInstance().logRevenue(price, quantity, product); + }; -/** - * Remove events in storage with event ids up to and including maxEventId. - * @private - */ -Amplitude.prototype.removeEvents = function removeEvents(maxEventId, maxIdentifyId) { - this.getInstance().removeEvents(maxEventId, maxIdentifyId); -}; + /** + * Remove events in storage with event ids up to and including maxEventId. + * @private + */ + Amplitude.prototype.removeEvents = function removeEvents(maxEventId, maxIdentifyId) { + this.getInstance().removeEvents(maxEventId, maxIdentifyId); + }; -/** - * Send unsent events. Note: this is called automatically after events are logged if option batchEvents is false. - * If batchEvents is true, then events are only sent when batch criterias are met. - * @private - * @param {Amplitude~eventCallback} callback - (optional) callback to run after events are sent. - * Note the server response code and response body are passed to the callback as input arguments. - */ -Amplitude.prototype.sendEvents = function sendEvents(callback) { - this.getInstance().sendEvents(callback); -}; + /** + * Send unsent events. Note: this is called automatically after events are logged if option batchEvents is false. + * If batchEvents is true, then events are only sent when batch criterias are met. + * @private + * @param {Amplitude~eventCallback} callback - (optional) callback to run after events are sent. + * Note the server response code and response body are passed to the callback as input arguments. + */ + Amplitude.prototype.sendEvents = function sendEvents(callback) { + this.getInstance().sendEvents(callback); + }; -/** - * Set global user properties. Note this is deprecated, and we recommend using setUserProperties - * @public - * @deprecated - */ -Amplitude.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { - this.getInstance().setUserProperties(userProperties); -}; + /** + * Set global user properties. Note this is deprecated, and we recommend using setUserProperties + * @public + * @deprecated + */ + Amplitude.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { + this.getInstance().setUserProperties(userProperties); + }; +} /** * Get the current version of Amplitude's Javascript SDK. @@ -8519,6 +5581,7 @@ Amplitude.prototype.setGlobalUserProperties = function setGlobalUserProperties(u Amplitude.prototype.__VERSION__ = version; /* jshint expr:true */ + var old = window.amplitude || {}; var newInstance = new Amplitude(); newInstance._q = old._q || []; diff --git a/amplitude.min.js b/amplitude.min.js index 0c276b88..aa29dba1 100644 --- a/amplitude.min.js +++ b/amplitude.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.amplitude=t()}(this,function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}function t(e,t,n){if(!(e0&&a>s&&(a=s);for(var u=0;u=0?(c=h.substr(0,g),l=h.substr(g+1)):(c=h,l=""),f=decodeURIComponent(c),d=decodeURIComponent(l),p(o,f)?Ln(o[f])?o[f].push(d):o[f]=[o[f],d]:o[f]=d}return o}var g,v="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},y=(e(function(e,t){(function(){function n(e,t){function o(e){if(o[e]!==v)return o[e];var n;if("bug-string-char-index"==e)n="a"!="a"[0];else if("json"==e)n=o("json-stringify")&&o("json-parse");else{var r,i='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if("json-stringify"==e){var u=t.stringify,p="function"==typeof u&&m;if(p){(r=function(){return 1}).toJSON=r;try{p="0"===u(0)&&"0"===u(new s)&&'""'==u(new a)&&u(_)===v&&u(v)===v&&u()===v&&"1"===u(r)&&"[1]"==u([r])&&"[null]"==u([v])&&"null"==u(null)&&"[null,null,null]"==u([v,_,null])&&u({a:[r,!0,!1,null,"\0\b\n\f\r\t"]})==i&&"1"===u(null,r)&&"[\n 1,\n 2\n]"==u([1,2],null,1)&&'"-271821-04-20T00:00:00.000Z"'==u(new c(-864e13))&&'"+275760-09-13T00:00:00.000Z"'==u(new c(864e13))&&'"-000001-01-01T00:00:00.000Z"'==u(new c(-621987552e5))&&'"1969-12-31T23:59:59.999Z"'==u(new c(-1))}catch(e){p=!1}}n=p}if("json-parse"==e){var l=t.parse;if("function"==typeof l)try{if(0===l("0")&&!l(!1)){var f=5==(r=l(i)).a.length&&1===r.a[0];if(f){try{f=!l('"\t"')}catch(e){}if(f)try{f=1!==l("01")}catch(e){}if(f)try{f=1!==l("1.")}catch(e){}}}}catch(e){f=!1}n=f}}return o[e]=!!n}e||(e=i.Object()),t||(t=i.Object());var s=e.Number||i.Number,a=e.String||i.String,u=e.Object||i.Object,c=e.Date||i.Date,p=e.SyntaxError||i.SyntaxError,l=e.TypeError||i.TypeError,f=e.Math||i.Math,d=e.JSON||i.JSON;"object"==typeof d&&d&&(t.stringify=d.stringify,t.parse=d.parse);var h,g,v,y=u.prototype,_=y.toString,m=new c(-0xc782b5b800cec);try{m=-109252==m.getUTCFullYear()&&0===m.getUTCMonth()&&1===m.getUTCDate()&&10==m.getUTCHours()&&37==m.getUTCMinutes()&&6==m.getUTCSeconds()&&708==m.getUTCMilliseconds()}catch(e){}if(!o("json")){var b=o("bug-string-char-index");if(!m)var w=f.floor,I=[0,31,59,90,120,151,181,212,243,273,304,334],E=function(e,t){return I[t]+365*(e-1970)+w((e-1969+(t=+(t>1)))/4)-w((e-1901+t)/100)+w((e-1601+t)/400)};if((h=y.hasOwnProperty)||(h=function(e){var t,n={};return(n.__proto__=null,n.__proto__={toString:1},n).toString!=_?h=function(e){var t=this.__proto__,n=e in(this.__proto__=null,this);return this.__proto__=t,n}:(t=n.constructor,h=function(e){var n=(this.constructor||t).prototype;return e in this&&!(e in n&&this[e]===n[e])}),n=null,h.call(this,e)}),g=function(e,t){var n,o,i,s=0;(n=function(){this.valueOf=0}).prototype.valueOf=0,o=new n;for(i in o)h.call(o,i)&&s++;return n=o=null,s?g=2==s?function(e,t){var n,r={},o="[object Function]"==_.call(e);for(n in e)o&&"prototype"==n||h.call(r,n)||!(r[n]=1)||!h.call(e,n)||t(n)}:function(e,t){var n,r,o="[object Function]"==_.call(e);for(n in e)o&&"prototype"==n||!h.call(e,n)||(r="constructor"===n)||t(n);(r||h.call(e,n="constructor"))&&t(n)}:(o=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"],g=function(e,t){var n,i,s="[object Function]"==_.call(e),a=!s&&"function"!=typeof e.constructor&&r[typeof e.hasOwnProperty]&&e.hasOwnProperty||h;for(n in e)s&&"prototype"==n||!a.call(e,n)||t(n);for(i=o.length;n=o[--i];a.call(e,n)&&t(n));}),g(e,t)},!o("json-stringify")){var S={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"},C=function(e,t){return("000000"+(t||0)).slice(-e)},O=function(e){for(var t='"',n=0,r=e.length,o=!b||r>10,i=o&&(b?e.split(""):e);n-1/0&&a<1/0){if(E){for(f=w(a/864e5),c=w(f/365.2425)+1970-1;E(c+1,0)<=f;c++);for(p=w((f-E(c,0))/30.42);E(c,p+1)<=f;p++);f=1+f-E(c,p),y=w((d=(a%864e5+864e5)%864e5)/36e5)%24,m=w(d/6e4)%60,b=w(d/1e3)%60,I=d%1e3}else c=a.getUTCFullYear(),p=a.getUTCMonth(),f=a.getUTCDate(),y=a.getUTCHours(),m=a.getUTCMinutes(),b=a.getUTCSeconds(),I=a.getUTCMilliseconds();a=(c<=0||c>=1e4?(c<0?"-":"+")+C(6,c<0?-c:c):C(4,c))+"-"+C(2,p+1)+"-"+C(2,f)+"T"+C(2,y)+":"+C(2,m)+":"+C(2,b)+"."+C(3,I)+"Z"}else a=null;if(n&&(a=n.call(t,e,a)),null===a)return"null";if("[object Boolean]"==(u=_.call(a)))return""+a;if("[object Number]"==u)return a>-1/0&&a<1/0?""+a:"null";if("[object String]"==u)return O(""+a);if("object"==typeof a){for(j=s.length;j--;)if(s[j]===a)throw l();if(s.push(a),S=[],x=i,i+=o,"[object Array]"==u){for(A=0,j=a.length;A0)for(o="",n>10&&(n=10);o.length=48&&o<=57||o>=97&&o<=102||o>=65&&o<=70||P();e+=j("0x"+i.slice(t,T));break;default:P()}else{if(34==o)break;for(o=i.charCodeAt(T),t=T;o>=32&&92!=o&&34!=o;)o=i.charCodeAt(++T);e+=i.slice(t,T)}if(34==i.charCodeAt(T))return T++,e;P();default:if(t=T,45==o&&(r=!0,o=i.charCodeAt(++T)),o>=48&&o<=57){for(48==o&&(o=i.charCodeAt(T+1))>=48&&o<=57&&P(),r=!1;T=48&&o<=57;T++);if(46==i.charCodeAt(T)){for(n=++T;n=48&&o<=57;n++);n==T&&P(),T=n}if(101==(o=i.charCodeAt(T))||69==o){for(43!=(o=i.charCodeAt(++T))&&45!=o||T++,n=T;n=48&&o<=57;n++);n==T&&P(),T=n}return+i.slice(t,T)}if(r&&P(),"true"==i.slice(T,T+4))return T+=4,!0;if("false"==i.slice(T,T+5))return T+=5,!1;if("null"==i.slice(T,T+4))return T+=4,null;P()}return"$"},R=function(e){var t,n;if("$"==e&&P(),"string"==typeof e){if("@"==(b?e.charAt(0):e[0]))return e.slice(1);if("["==e){for(t=[];"]"!=(e=U());n||(n=!0))n&&(","==e?"]"==(e=U())&&P():P()),","==e&&P(),t.push(R(e));return t}if("{"==e){for(t={};"}"!=(e=U());n||(n=!0))n&&(","==e?"}"==(e=U())&&P():P()),","!=e&&"string"==typeof e&&"@"==(b?e.charAt(0):e[0])&&":"==U()||P(),t[e.slice(1)]=R(U());return t}P()}return e},k=function(e,t,n){var r=F(e,t,n);r===v?delete e[t]:e[t]=r},F=function(e,t,n){var r,o=e[t];if("object"==typeof o&&o)if("[object Array]"==_.call(o))for(r=o.length;r--;)k(o,r,n);else g(o,function(e){k(o,e,n)});return n.call(e,t,o)};t.parse=function(e,t){var n,r;return T=0,A=""+e,n=R(U()),"$"!=U()&&P(),T=A=null,t&&"[object Function]"==_.call(t)?F((r={},r[""]=n,r),"",t):n}}}return t.runInContext=n,t}var r={function:!0,object:!0},o=r.object&&t&&!t.nodeType&&t,i=r[typeof window]&&window||this,s=o&&r.object&&e&&!e.nodeType&&"object"==typeof v&&v;if(!s||s.global!==s&&s.window!==s&&s.self!==s||(i=s),o)n(i,o);else{var a=i.JSON,u=i.JSON3,c=!1,p=n(i,i.JSON3={noConflict:function(){return c||(c=!0,i.JSON=a,i.JSON3=u,a=u=null),p}});i.JSON={parse:p.parse,stringify:p.stringify}}}).call(v)}),{DEFAULT_INSTANCE:"$default_instance",API_VERSION:2,MAX_STRING_LENGTH:4096,MAX_PROPERTY_KEYS:1e3,IDENTIFY_EVENT:"$identify",GROUP_IDENTIFY_EVENT:"$groupidentify",LAST_EVENT_ID:"amplitude_lastEventId",LAST_EVENT_TIME:"amplitude_lastEventTime",LAST_IDENTIFY_ID:"amplitude_lastIdentifyId",LAST_SEQUENCE_NUMBER:"amplitude_lastSequenceNumber",SESSION_ID:"amplitude_sessionId",DEVICE_ID:"amplitude_deviceId",OPT_OUT:"amplitude_optOut",USER_ID:"amplitude_userId",COOKIE_TEST:"amplitude_cookie_test",REVENUE_EVENT:"revenue_amount",REVENUE_PRODUCT_ID:"$productId",REVENUE_QUANTITY:"$quantity",REVENUE_PRICE:"$price",REVENUE_REVENUE_TYPE:"$revenueType",AMP_DEVICE_ID_PARAM:"amp_device_id",REFERRER:"referrer",UTM_SOURCE:"utm_source",UTM_MEDIUM:"utm_medium",UTM_CAMPAIGN:"utm_campaign",UTM_TERM:"utm_term",UTM_CONTENT:"utm_content"}),_={encode:function(e){for(var t="",n=0;n127&&r<2048?(t+=String.fromCharCode(r>>6|192),t+=String.fromCharCode(63&r|128)):(t+=String.fromCharCode(r>>12|224),t+=String.fromCharCode(r>>6&63|128),t+=String.fromCharCode(63&r|128))}return t},decode:function(e){for(var t="",n=0,r=0,o=0,i=0;n191&&r<224?(o=e.charCodeAt(n+1),t+=String.fromCharCode((31&r)<<6|63&o),n+=2):(o=e.charCodeAt(n+1),i=e.charCodeAt(n+2),t+=String.fromCharCode((15&r)<<12|(63&o)<<6|63&i),n+=3);return t}},m={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){try{if(window.btoa&&window.atob)return window.btoa(unescape(encodeURIComponent(e)))}catch(e){}return m._encode(e)},_encode:function(e){var t,n,r,o,i,s,a,u="",c=0;for(e=_.encode(e);c>2,i=(3&t)<<4|(n=e.charCodeAt(c++))>>4,s=(15&n)<<2|(r=e.charCodeAt(c++))>>6,a=63&r,isNaN(n)?s=a=64:isNaN(r)&&(a=64),u=u+m._keyStr.charAt(o)+m._keyStr.charAt(i)+m._keyStr.charAt(s)+m._keyStr.charAt(a);return u},decode:function(e){try{if(window.btoa&&window.atob)return decodeURIComponent(escape(window.atob(e)))}catch(e){}return m._decode(e)},_decode:function(e){var t,n,r,o,i,s,a="",u=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");u>4,n=(15&o)<<4|(i=m._keyStr.indexOf(e.charAt(u++)))>>2,r=(3&i)<<6|(s=m._keyStr.indexOf(e.charAt(u++))),a+=String.fromCharCode(t),64!==i&&(a+=String.fromCharCode(n)),64!==s&&(a+=String.fromCharCode(r));return a=_.decode(a)}},b=e(function(e,t){t.parse=function(e){var t=document.createElement("a");return t.href=e,{href:t.href,host:t.host||location.host,port:"0"===t.port||""===t.port?function(e){switch(e){case"http:":return 80;case"https:":return 443;default:return location.port}}(t.protocol):t.port,hash:t.hash,hostname:t.hostname||location.hostname,pathname:"/"!=t.pathname.charAt(0)?"/"+t.pathname:t.pathname,protocol:t.protocol&&":"!=t.protocol?t.protocol:location.protocol,search:t.search,query:t.search.slice(1)}},t.isAbsolute=function(e){return 0==e.indexOf("//")||!!~e.indexOf("://")},t.isRelative=function(e){return!t.isAbsolute(e)},t.isCrossDomain=function(e){e=t.parse(e);var n=t.parse(window.location.href);return e.hostname!==n.hostname||e.port!==n.port||e.protocol!==n.protocol}}),w=1e3,I=60*w,E=60*I,S=24*E,C=365.25*S,O=function(e,n){n=n||{};var r=typeof e;if("string"===r&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return n*C;case"days":case"day":case"d":return n*S;case"hours":case"hour":case"hrs":case"hr":case"h":return n*E;case"minutes":case"minute":case"mins":case"min":case"m":return n*I;case"seconds":case"second":case"secs":case"sec":case"s":return n*w;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}(e);if("number"===r&&!1===isNaN(e))return n.long?function(e){return t(e,S,"day")||t(e,E,"hour")||t(e,I,"minute")||t(e,w,"second")||e+" ms"}(e):function(e){return e>=S?Math.round(e/S)+"d":e>=E?Math.round(e/E)+"h":e>=I?Math.round(e/I)+"m":e>=w?Math.round(e/w)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))},N=e(function(e,t){function n(e){function n(){if(n.enabled){var e=n,r=+new Date,i=r-(o||r);e.diff=i,e.prev=o,e.curr=r,o=r;for(var s=new Array(arguments.length),a=0;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},t.enable(n())})("cookie"),A=function(e,t,o){switch(arguments.length){case 3:case 2:return function(e,t,n){n=n||{};var o=r(e)+"="+r(t);null==t&&(n.maxage=-1),n.maxage&&(n.expires=new Date(+new Date+n.maxage)),n.path&&(o+="; path="+n.path),n.domain&&(o+="; domain="+n.domain),n.expires&&(o+="; expires="+n.expires.toUTCString()),n.secure&&(o+="; secure"),document.cookie=o}(e,t,o);case 1:return function(e){return n()[e]}(e);default:return n()}},j=e(function(e,t){function n(e){for(var n=t.cookie,r=t.levels(e),o=0;o=0;--i)o.push(t.slice(i).join("."));return o},n.cookie=A,t=e.exports=n}),x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P=Object.prototype.toString,U=function(e){switch(P.call(e)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}return null===e?"null":void 0===e?"undefined":e!=e?"nan":e&&1===e.nodeType?"element":"undefined"!=typeof Buffer&&"function"==typeof Buffer.isBuffer&&Buffer.isBuffer(e)?"buffer":void 0===(e=e.valueOf?e.valueOf():Object.prototype.valueOf.apply(e))?"undefined":x(e)},R={DISABLE:0,ERROR:1,WARN:2,INFO:3},k=R.WARN,F={error:function(e){k>=R.ERROR&&M(e)},warn:function(e){k>=R.WARN&&M(e)},info:function(e){k>=R.INFO&&M(e)}},M=function(e){try{console.log("[Amplitude] "+e)}catch(e){}},D=function(e){return"string"===U(e)&&e.length>y.MAX_STRING_LENGTH?e.substring(0,y.MAX_STRING_LENGTH):e},q=function(e){var t=U(e);if("object"!==t)return F.error("Error: invalid properties format. Expecting Javascript object, received "+t+", ignoring"),{};if(Object.keys(e).length>y.MAX_PROPERTY_KEYS)return F.error("Error: too many properties (more than 1000), ignoring"),{};var n={};for(var r in e)if(e.hasOwnProperty(r)){var o=r,i=U(o);"string"!==i&&(o=String(o),F.warn("WARNING: Non-string property key, received type "+i+', coercing to string "'+o+'"'));var s=V(o,e[r]);null!==s&&(n[o]=s)}return n},L=["null","nan","undefined","function","arguments","regexp","element"],V=function e(t,n){var r=U(n);if(-1!==L.indexOf(r))F.warn('WARNING: Property key "'+t+'" with invalid value type '+r+", ignoring"),n=null;else if("error"===r)n=String(n),F.warn('WARNING: Property key "'+t+'" with value type error, coercing to '+n);else if("array"===r){for(var o=[],i=0;i0?(this.userPropertiesOperations.hasOwnProperty("$clearAll")||G.log.error("Need to send $clearAll on its own Identify object without any other operations, skipping $clearAll"),this):(this.userPropertiesOperations.$clearAll="-",this)},te.prototype.prepend=function(e,t){return this._addOperation("$prepend",e,t),this},te.prototype.set=function(e,t){return this._addOperation("$set",e,t),this},te.prototype.setOnce=function(e,t){return this._addOperation("$setOnce",e,t),this},te.prototype.unset=function(e){return this._addOperation("$unset",e,"-"),this},te.prototype._addOperation=function(e,t,n){this.userPropertiesOperations.hasOwnProperty("$clearAll")?G.log.error("This identify already contains a $clearAll operation, skipping operation "+e):-1===this.properties.indexOf(t)?(this.userPropertiesOperations.hasOwnProperty(e)||(this.userPropertiesOperations[e]={}),this.userPropertiesOperations[e][t]=n,this.properties.push(t)):G.log.error('User property "'+t+'" already used in this identify, skipping operation '+e)};var ne=e(function(e){!function(t){function n(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function r(e,t,r,o,i,s){return n(function(e,t){return e<>>32-t}(n(n(t,e),n(o,s)),i),r)}function o(e,t,n,o,i,s,a){return r(t&n|~t&o,e,t,i,s,a)}function i(e,t,n,o,i,s,a){return r(t&o|n&~o,e,t,i,s,a)}function s(e,t,n,o,i,s,a){return r(t^n^o,e,t,i,s,a)}function a(e,t,n,o,i,s,a){return r(n^(t|~o),e,t,i,s,a)}function u(e,t){e[t>>5]|=128<>>9<<4)]=t;var r,u,c,p,l,f=1732584193,d=-271733879,h=-1732584194,g=271733878;for(r=0;r>5]>>>t%32&255);return n}function p(e){var t,n=[];for(n[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+"0123456789abcdef".charAt(15&t);return r}function f(e){return unescape(encodeURIComponent(e))}function d(e){return function(e){return c(u(p(e),8*e.length))}(f(e))}function h(e,t){return function(e,t){var n,r,o=p(e),i=[],s=[];for(i[15]=s[15]=void 0,o.length>16&&(o=u(o,8*e.length)),n=0;n<16;n+=1)i[n]=909522486^o[n],s[n]=1549556828^o[n];return r=u(i.concat(p(t)),512+8*t.length),c(u(s.concat(r),640))}(f(e),f(t))}function g(e,t,n){return t?n?h(t,e):function(e,t){return l(h(e,t))}(t,e):n?d(e):function(e){return l(d(e))}(e)}e.exports?e.exports=g:t.md5=g}(v)}),re=function(){this.__data__=[],this.size=0},oe=function(e,t){return e===t||e!=e&&t!=t},ie=function(e,t){for(var n=e.length;n--;)if(oe(e[n][0],t))return n;return-1},se=Array.prototype.splice,ae=function(e){var t=this.__data__,n=ie(t,e);return!(n<0||(n==t.length-1?t.pop():se.call(t,n,1),--this.size,0))},ue=function(e){var t=this.__data__,n=ie(t,e);return n<0?void 0:t[n][1]},ce=function(e){return ie(this.__data__,e)>-1},pe=function(e,t){var n=this.__data__,r=ie(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this};i.prototype.clear=re,i.prototype.delete=ae,i.prototype.get=ue,i.prototype.has=ce,i.prototype.set=pe;var le=i,fe=function(){this.__data__=new le,this.size=0},de=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},he=function(e){return this.__data__.get(e)},ge=function(e){return this.__data__.has(e)},ve="object"==typeof v&&v&&v.Object===Object&&v,ye="object"==typeof self&&self&&self.Object===Object&&self,_e=ve||ye||Function("return this")(),me=_e.Symbol,be=Object.prototype,we=be.hasOwnProperty,Ie=be.toString,Ee=me?me.toStringTag:void 0,Se=function(e){var t=we.call(e,Ee),n=e[Ee];try{e[Ee]=void 0;var r=!0}catch(e){}var o=Ie.call(e);return r&&(t?e[Ee]=n:delete e[Ee]),o},Ce=Object.prototype.toString,Oe=function(e){return Ce.call(e)},Ne="[object Null]",Te="[object Undefined]",Ae=me?me.toStringTag:void 0,je=function(e){return null==e?void 0===e?Te:Ne:Ae&&Ae in Object(e)?Se(e):Oe(e)},xe=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},Pe="[object AsyncFunction]",Ue="[object Function]",Re="[object GeneratorFunction]",ke="[object Proxy]",Fe=function(e){if(!xe(e))return!1;var t=je(e);return t==Ue||t==Re||t==Pe||t==ke},Me=_e["__core-js_shared__"],De=function(){var e=/[^.]+$/.exec(Me&&Me.keys&&Me.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),qe=function(e){return!!De&&De in e},Le=Function.prototype.toString,Ve=function(e){if(null!=e){try{return Le.call(e)}catch(e){}try{return e+""}catch(e){}}return""},ze=/^\[object .+?Constructor\]$/,Ge=Function.prototype,Be=Object.prototype,Ke=Ge.toString,$e=Be.hasOwnProperty,Je=RegExp("^"+Ke.call($e).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),We=function(e){return!(!xe(e)||qe(e))&&(Fe(e)?Je:ze).test(Ve(e))},Ye=function(e,t){return null==e?void 0:e[t]},Qe=function(e,t){var n=Ye(e,t);return We(n)?n:void 0},Xe=Qe(_e,"Map"),He=Qe(Object,"create"),Ze=function(){this.__data__=He?He(null):{},this.size=0},et=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},tt="__lodash_hash_undefined__",nt=Object.prototype.hasOwnProperty,rt=function(e){var t=this.__data__;if(He){var n=t[e];return n===tt?void 0:n}return nt.call(t,e)?t[e]:void 0},ot=Object.prototype.hasOwnProperty,it=function(e){var t=this.__data__;return He?void 0!==t[e]:ot.call(t,e)},st="__lodash_hash_undefined__",at=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=He&&void 0===t?st:t,this};s.prototype.clear=Ze,s.prototype.delete=et,s.prototype.get=rt,s.prototype.has=it,s.prototype.set=at;var ut=s,ct=function(){this.size=0,this.__data__={hash:new ut,map:new(Xe||le),string:new ut}},pt=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e},lt=function(e,t){var n=e.__data__;return pt(t)?n["string"==typeof t?"string":"hash"]:n.map},ft=function(e){var t=lt(this,e).delete(e);return this.size-=t?1:0,t},dt=function(e){return lt(this,e).get(e)},ht=function(e){return lt(this,e).has(e)},gt=function(e,t){var n=lt(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this};a.prototype.clear=ct,a.prototype.delete=ft,a.prototype.get=dt,a.prototype.has=ht,a.prototype.set=gt;var vt=a,yt=200,_t=function(e,t){var n=this.__data__;if(n instanceof le){var r=n.__data__;if(!Xe||r.length-1&&e%1==0&&e<=Bt},$t=function(e){return null!=e&&Kt(e.length)&&!Fe(e)},Jt=function(e){return Ft(e)&&$t(e)},Wt=function(){return!1},Yt=e(function(e,t){var n=t&&!t.nodeType&&t,r=n&&!0&&e&&!e.nodeType&&e,o=r&&r.exports===n?_e.Buffer:void 0,i=(o?o.isBuffer:void 0)||Wt;e.exports=i}),Qt="[object Object]",Xt=Function.prototype,Ht=Object.prototype,Zt=Xt.toString,en=Ht.hasOwnProperty,tn=Zt.call(Object),nn=function(e){if(!Ft(e)||je(e)!=Qt)return!1;var t=Pt(e);if(null===t)return!0;var n=en.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Zt.call(n)==tn},rn={};rn["[object Float32Array]"]=rn["[object Float64Array]"]=rn["[object Int8Array]"]=rn["[object Int16Array]"]=rn["[object Int32Array]"]=rn["[object Uint8Array]"]=rn["[object Uint8ClampedArray]"]=rn["[object Uint16Array]"]=rn["[object Uint32Array]"]=!0,rn["[object Arguments]"]=rn["[object Array]"]=rn["[object ArrayBuffer]"]=rn["[object Boolean]"]=rn["[object DataView]"]=rn["[object Date]"]=rn["[object Error]"]=rn["[object Function]"]=rn["[object Map]"]=rn["[object Number]"]=rn["[object Object]"]=rn["[object RegExp]"]=rn["[object Set]"]=rn["[object String]"]=rn["[object WeakMap]"]=!1;var on=function(e){return Ft(e)&&Kt(e.length)&&!!rn[je(e)]},sn=function(e){return function(t){return e(t)}},an=e(function(e,t){var n=t&&!t.nodeType&&t,r=n&&!0&&e&&!e.nodeType&&e,o=r&&r.exports===n&&ve.process,i=function(){try{return o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=i}),un=an&&an.isTypedArray,cn=un?sn(un):on,pn=Object.prototype.hasOwnProperty,ln=function(e,t,n){var r=e[t];pn.call(e,t)&&oe(r,n)&&(void 0!==n||t in e)||wt(e,t,n)},fn=function(e,t,n,r){var o=!n;n||(n={});for(var i=-1,s=t.length;++i-1&&e%1==0&&e0){if(++t>=Pn)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(xn),Fn=function(e,t){return kn(An(e,t,On),e+"")},Mn=function(e,t,n){if(!xe(n))return!1;var r=typeof t;return!!("number"==r?$t(n)&&vn(t,n.length):"string"==r&&t in n)&&oe(n[t],e)},Dn=function(e){return Fn(function(t,n){var r=-1,o=n.length,i=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(i=e.length>3&&"function"==typeof i?(o--,i):void 0,s&&Mn(n[0],n[1],s)&&(i=o<3?void 0:i,o=1),t=Object(t);++r0?2==o.length?"function"==typeof o[1]?e[o[0]]=o[1].call(this,s):e[o[0]]=o[1]:3==o.length?"function"!=typeof o[1]||o[1].exec&&o[1].test?e[o[0]]=s?s.replace(o[1],o[2]):void 0:e[o[0]]=s?o[1].call(this,s,o[2]):void 0:4==o.length&&(e[o[0]]=s?o[3].call(this,s.replace(o[1],o[2])):void 0):e[o]=s||void 0;a+=2}return e},str:function(e,t){for(var n in t)if("object"==typeof t[n]&&t[n].length>0){for(var r=0;r>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)},Jn={apiEndpoint:"api.amplitude.com",batchEvents:!1,cookieExpiration:3650,cookieName:"amplitude_id",deviceIdFromUrlParam:!1,domain:"",eventUploadPeriodMillis:3e4,eventUploadThreshold:30,forceHttps:!0,includeGclid:!1,includeReferrer:!1,includeUtm:!1,language:{language:navigator&&(navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage)||void 0}.language,logLevel:"WARN",optOut:!1,platform:"Web",savedMaxCount:1e3,saveEvents:!0,saveParamsReferrerOncePerSession:!0,sessionTimeout:18e5,trackingOptions:{city:!0,country:!0,device_model:!0,dma:!0,ip_address:!0,language:!0,os_name:!0,os_version:!0,platform:!0,region:!0,version_name:!0},unsetParamsReferrerOnNewSession:!1,unsentKey:"amplitude_unsent",unsentIdentifyKey:"amplitude_unsent_identify",uploadBatchSize:100},Wn=function(e){this._instanceName=G.isEmptyString(e)?y.DEFAULT_INSTANCE:e.toLowerCase(),this._legacyStorageSuffix=this._instanceName===y.DEFAULT_INSTANCE?"":"_"+this._instanceName,this._unsentEvents=[],this._unsentIdentifys=[],this._ua=new Kn(navigator.userAgent).getResult(),this.options=qn({},Jn),this.cookieStorage=(new ee).getStorage(),this._q=[],this._sending=!1,this._updateScheduled=!1,this._eventId=0,this._identifyId=0,this._lastEventTime=null,this._newSession=!1,this._sequenceNumber=0,this._sessionId=null,this._userAgent=navigator&&navigator.userAgent||null};Wn.prototype.Identify=te,Wn.prototype.Revenue=Bn,Wn.prototype.init=function(e,t,n,r){if("string"!==U(e)||G.isEmptyString(e))G.log.error("Invalid apiKey. Please re-initialize with a valid apiKey");else try{this.options.apiKey=e,this._storageSuffix="_"+e+this._legacyStorageSuffix,Yn(this.options,n),"string"===U(this.options.logLevel)&&G.setLogLevel(this.options.logLevel);var o=rr(this);if(this._apiPropertiesTrackingOptions=Object.keys(o).length>0?{tracking_options:o}:{},this.cookieStorage.options({expirationDays:this.options.cookieExpiration,domain:this.options.domain}),this.options.domain=this.cookieStorage.options().domain,this._instanceName===y.DEFAULT_INSTANCE&&Qn(this),Xn(this),this.options.deviceId="object"===U(n)&&"string"===U(n.deviceId)&&!G.isEmptyString(n.deviceId)&&n.deviceId||this.options.deviceIdFromUrlParam&&this._getDeviceIdFromUrlParam(this._getUrlParams())||this.options.deviceId||$n()+"R",this.options.userId="string"===U(t)&&!G.isEmptyString(t)&&t||"number"===U(t)&&t.toString()||this.options.userId||null,this.options.saveEvents){this._unsentEvents=this._loadSavedUnsentEvents(this.options.unsentKey),this._unsentIdentifys=this._loadSavedUnsentEvents(this.options.unsentIdentifyKey);for(var i=0;ithis.options.sessionTimeout)&&(this.options.unsetParamsReferrerOnNewSession&&this._unsetUTMParams(),this._newSession=!0,this._sessionId=l,this.options.saveParamsReferrerOncePerSession&&this._trackParamsAndReferrer()),this.options.saveParamsReferrerOncePerSession||this._trackParamsAndReferrer(),this._lastEventTime=l,Zn(this),this._sendEventsIfReady()}catch(e){G.log.error(e)}finally{"function"===U(r)&&r(this)}},Wn.prototype._trackParamsAndReferrer=function(){this.options.includeUtm&&this._initUtmData(),this.options.includeReferrer&&this._saveReferrer(this._getReferrer()),this.options.includeGclid&&this._saveGclid(this._getUrlParams())};var Yn=function e(t,n){if("object"===U(n)){var r=function(r){if(t.hasOwnProperty(r)){var o=n[r],i=U(t[r]);G.validateInput(o,r+" option",i)&&("boolean"===i?t[r]=!!o:"string"===i&&!G.isEmptyString(o)||"number"===i&&o>0?t[r]=o:"object"===i&&e(t[r],o))}};for(var o in n)n.hasOwnProperty(o)&&r(o)}};Wn.prototype.runQueuedFunctions=function(){for(var e=0;e=this.options.eventUploadThreshold?(this.sendEvents(e),!0):(this._updateScheduled||(this._updateScheduled=!0,setTimeout(function(){this._updateScheduled=!1,this.sendEvents()}.bind(this),this.options.eventUploadPeriodMillis)),!1):(this.sendEvents(e),!0))},Wn.prototype._getFromStorage=function(e,t){return e.getItem(t+this._storageSuffix)},Wn.prototype._getFromStorageLegacy=function(e,t){return e.getItem(t+this._legacyStorageSuffix)},Wn.prototype._setInStorage=function(e,t,n){e.setItem(t+this._storageSuffix,n)};var Qn=function(e){var t=e.cookieStorage.get(e.options.cookieName+e._storageSuffix);if("object"!==U(t)&&(t=e.cookieStorage.get(e.options.cookieName+e._legacyStorageSuffix),!("object"===U(t)&&t.deviceId&&t.sessionId&&t.lastEventTime))){var n=function(e){var t=Z.getItem(e);return Z.removeItem(e),t},r="string"===U(e.options.apiKey)&&"_"+e.options.apiKey.slice(0,6)||"",o=n(y.DEVICE_ID+r),i=n(y.USER_ID+r),s=n(y.OPT_OUT+r);null!==s&&void 0!==s&&(s="true"===String(s));var a=parseInt(n(y.SESSION_ID)),u=parseInt(n(y.LAST_EVENT_TIME)),c=parseInt(n(y.LAST_EVENT_ID)),p=parseInt(n(y.LAST_IDENTIFY_ID)),l=parseInt(n(y.LAST_SEQUENCE_NUMBER)),f=function(e){return"object"===U(t)&&t[e]};e.options.deviceId=f("deviceId")||o,e.options.userId=f("userId")||i,e._sessionId=f("sessionId")||a||e._sessionId,e._lastEventTime=f("lastEventTime")||u||e._lastEventTime,e._eventId=f("eventId")||c||e._eventId,e._identifyId=f("identifyId")||p||e._identifyId,e._sequenceNumber=f("sequenceNumber")||l||e._sequenceNumber,e.options.optOut=s||!1,t&&void 0!==t.optOut&&null!==t.optOut&&(e.options.optOut="true"===String(t.optOut)),Zn(e)}},Xn=function(e){var t=e.cookieStorage.get(e.options.cookieName+e._storageSuffix);if("object"===U(t))Hn(e,t);else{var n=e.cookieStorage.get(e.options.cookieName+e._legacyStorageSuffix);"object"===U(n)&&(e.cookieStorage.remove(e.options.cookieName+e._legacyStorageSuffix),Hn(e,n))}},Hn=function(e,t){t.deviceId&&(e.options.deviceId=t.deviceId),t.userId&&(e.options.userId=t.userId),null!==t.optOut&&void 0!==t.optOut&&(e.options.optOut=t.optOut),t.sessionId&&(e._sessionId=parseInt(t.sessionId)),t.lastEventTime&&(e._lastEventTime=parseInt(t.lastEventTime)),t.eventId&&(e._eventId=parseInt(t.eventId)),t.identifyId&&(e._identifyId=parseInt(t.identifyId)),t.sequenceNumber&&(e._sequenceNumber=parseInt(t.sequenceNumber))},Zn=function(e){e.cookieStorage.set(e.options.cookieName+e._storageSuffix,{deviceId:e.options.deviceId,userId:e.options.userId,optOut:e.options.optOut,sessionId:e._sessionId,lastEventTime:e._lastEventTime,eventId:e._eventId,identifyId:e._identifyId,sequenceNumber:e._sequenceNumber})};Wn.prototype._initUtmData=function(e,t){e=e||this._getUrlParams();var n=function(e,t){var n=e?"?"+e.split(".").slice(-1)[0].replace(/\|/g,"&"):"",r=function(e,t,n,r){return G.getQueryParam(e,t)||G.getQueryParam(n,r)},o=r(y.UTM_SOURCE,t,"utmcsr",n),i=r(y.UTM_MEDIUM,t,"utmcmd",n),s=r(y.UTM_CAMPAIGN,t,"utmccn",n),a=r(y.UTM_TERM,t,"utmctr",n),u=r(y.UTM_CONTENT,t,"utmcct",n),c={},p=function(e,t){G.isEmptyString(t)||(c[e]=t)};return p(y.UTM_SOURCE,o),p(y.UTM_MEDIUM,i),p(y.UTM_CAMPAIGN,s),p(y.UTM_TERM,a),p(y.UTM_CONTENT,u),c}(t=t||this.cookieStorage.get("__utmz"),e);er(this,n)},Wn.prototype._unsetUTMParams=function(){var e=new te;e.unset(y.REFERRER),e.unset(y.UTM_SOURCE),e.unset(y.UTM_MEDIUM),e.unset(y.UTM_CAMPAIGN),e.unset(y.UTM_TERM),e.unset(y.UTM_CONTENT),this.identify(e)};var er=function(e,t){if("object"===U(t)&&0!==Object.keys(t).length){var n=new te;for(var r in t)t.hasOwnProperty(r)&&(n.setOnce("initial_"+r,t[r]),n.set(r,t[r]));e.identify(n)}};Wn.prototype._getReferrer=function(){return document.referrer},Wn.prototype._getUrlParams=function(){return location.search},Wn.prototype._saveGclid=function(e){var t=G.getQueryParam("gclid",e);if(!G.isEmptyString(t)){er(this,{gclid:t})}},Wn.prototype._getDeviceIdFromUrlParam=function(e){return G.getQueryParam(y.AMP_DEVICE_ID_PARAM,e)},Wn.prototype._getReferringDomain=function(e){if(G.isEmptyString(e))return null;var t=e.split("/");return t.length>=3?t[2]:null},Wn.prototype._saveReferrer=function(e){if(!G.isEmptyString(e)){var t={referrer:e,referring_domain:this._getReferringDomain(e)};er(this,t)}},Wn.prototype.saveEvents=function(){try{this._setInStorage(Z,this.options.unsentKey,JSON.stringify(this._unsentEvents))}catch(e){}try{this._setInStorage(Z,this.options.unsentIdentifyKey,JSON.stringify(this._unsentIdentifys))}catch(e){}},Wn.prototype.setDomain=function(e){if(G.validateInput(e,"domain","string"))try{this.cookieStorage.options({domain:e}),this.options.domain=this.cookieStorage.options().domain,Xn(this),Zn(this)}catch(e){G.log.error(e)}},Wn.prototype.setUserId=function(e){try{this.options.userId=void 0!==e&&null!==e&&""+e||null,Zn(this)}catch(e){G.log.error(e)}},Wn.prototype.setGroup=function(e,t){if(this._apiKeySet("setGroup()")&&G.validateInput(e,"groupType","string")&&!G.isEmptyString(e)){var n={};n[e]=t;var r=(new te).set(e,t);this._logEvent(y.IDENTIFY_EVENT,null,null,r.userPropertiesOperations,n,null,null,null)}},Wn.prototype.setOptOut=function(e){if(G.validateInput(e,"enable","boolean"))try{this.options.optOut=e,Zn(this)}catch(e){G.log.error(e)}},Wn.prototype.setSessionId=function(e){if(G.validateInput(e,"sessionId","number"))try{this._sessionId=e,Zn(this)}catch(e){G.log.error(e)}},Wn.prototype.resetSessionId=function(){this.setSessionId((new Date).getTime())},Wn.prototype.regenerateDeviceId=function(){this.setDeviceId($n()+"R")},Wn.prototype.setDeviceId=function(e){if(G.validateInput(e,"deviceId","string"))try{G.isEmptyString(e)||(this.options.deviceId=""+e,Zn(this))}catch(e){G.log.error(e)}},Wn.prototype.setUserProperties=function(e){if(this._apiKeySet("setUserProperties()")&&G.validateInput(e,"userProperties","object")){var t=G.truncate(G.validateProperties(e));if(0!==Object.keys(t).length){var n=new te;for(var r in t)t.hasOwnProperty(r)&&n.set(r,t[r]);this.identify(n)}}},Wn.prototype.clearUserProperties=function(){if(this._apiKeySet("clearUserProperties()")){var e=new te;e.clearAll(),this.identify(e)}};var tr=function(e,t){for(var n=0;n0)return this._logEvent(y.IDENTIFY_EVENT,null,null,e.userPropertiesOperations,null,null,null,t);"function"===U(t)&&t(0,"No request sent",{reason:"No user property operations"})}else G.log.error("Invalid identify input type. Expected Identify object but saw "+U(e)),"function"===U(t)&&t(0,"No request sent",{reason:"Invalid identify input type"});else"function"===U(t)&&t(0,"No request sent",{reason:"API key is not set"})},Wn.prototype.groupIdentify=function(e,t,n,r){if(this._apiKeySet("groupIdentify()"))if(G.validateInput(e,"group_type","string")&&!G.isEmptyString(e))if(null!==t&&void 0!==t)if("object"===U(n)&&n.hasOwnProperty("_q")&&(n=tr(new te,n)),n instanceof te){if(Object.keys(n.userPropertiesOperations).length>0)return this._logEvent(y.GROUP_IDENTIFY_EVENT,null,null,null,function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},e,t),n.userPropertiesOperations,null,r);"function"===U(r)&&r(0,"No request sent",{reason:"No group property operations"})}else G.log.error("Invalid identify input type. Expected Identify object but saw "+U(n)),"function"===U(r)&&r(0,"No request sent",{reason:"Invalid identify input type"});else"function"===U(r)&&r(0,"No request sent",{reason:"Invalid group name"});else"function"===U(r)&&r(0,"No request sent",{reason:"Invalid group type"});else"function"===U(r)&&r(0,"No request sent",{reason:"API key is not set"})},Wn.prototype.setVersionName=function(e){G.validateInput(e,"versionName","string")&&(this.options.versionName=e)},Wn.prototype._logEvent=function(e,t,n,r,o,i,s,a){if(Xn(this),e)if(this.options.optOut)"function"===U(a)&&a(0,"No request sent",{reason:"optOut is set to true"});else try{var u;u=e===y.IDENTIFY_EVENT||e===y.GROUP_IDENTIFY_EVENT?this.nextIdentifyId():this.nextEventId();var c=this.nextSequenceNumber(),p="number"===U(s)?s:(new Date).getTime();(!this._sessionId||!this._lastEventTime||p-this._lastEventTime>this.options.sessionTimeout)&&(this._sessionId=p),this._lastEventTime=p,Zn(this),r=r||{};var l=qn({},this._apiPropertiesTrackingOptions);n=qn(l,n||{}),t=t||{},o=o||{},i=i||{};var f={device_id:this.options.deviceId,user_id:this.options.userId,timestamp:p,event_id:u,session_id:this._sessionId||-1,event_type:e,version_name:nr(this,"version_name")?this.options.versionName||null:null,platform:nr(this,"platform")?this.options.platform:null,os_name:nr(this,"os_name")?this._ua.browser.name||null:null,os_version:nr(this,"os_version")?this._ua.browser.major||null:null,device_model:nr(this,"device_model")?this._ua.os.name||null:null,language:nr(this,"language")?this.options.language:null,api_properties:n,event_properties:G.truncate(G.validateProperties(t)),user_properties:G.truncate(G.validateProperties(r)),uuid:$n(),library:{name:"amplitude-js",version:"4.5.2"},sequence_number:c,groups:G.truncate(G.validateGroups(o)),group_properties:G.truncate(G.validateProperties(i)),user_agent:this._userAgent};return e===y.IDENTIFY_EVENT||e===y.GROUP_IDENTIFY_EVENT?(this._unsentIdentifys.push(f),this._limitEventsQueued(this._unsentIdentifys)):(this._unsentEvents.push(f),this._limitEventsQueued(this._unsentEvents)),this.options.saveEvents&&this.saveEvents(),this._sendEventsIfReady(a)||"function"!==U(a)||a(0,"No request sent",{reason:"No events to send or upload queued"}),u}catch(e){G.log.error(e)}else"function"===U(a)&&a(0,"No request sent",{reason:"Missing eventType"})};var nr=function(e,t){return!!e.options.trackingOptions[t]},rr=function(e){for(var t=["city","country","dma","ip_address","region"],n={},r=0;rthis.options.savedMaxCount&&e.splice(0,e.length-this.options.savedMaxCount)},Wn.prototype.logEvent=function(e,t,n){return this.logEventWithTimestamp(e,t,null,n)},Wn.prototype.logEventWithTimestamp=function(e,t,n,r){return this._apiKeySet("logEvent()")?G.validateInput(e,"eventType","string")?G.isEmptyString(e)?("function"===U(r)&&r(0,"No request sent",{reason:"Missing eventType"}),-1):this._logEvent(e,t,null,null,null,null,n,r):("function"===U(r)&&r(0,"No request sent",{reason:"Invalid type for eventType"}),-1):("function"===U(r)&&r(0,"No request sent",{reason:"API key not set"}),-1)},Wn.prototype.logEventWithGroups=function(e,t,n,r){return this._apiKeySet("logEventWithGroups()")?G.validateInput(e,"eventType","string")?this._logEvent(e,t,null,null,n,null,null,r):("function"===U(r)&&r(0,"No request sent",{reason:"Invalid type for eventType"}),-1):("function"===U(r)&&r(0,"No request sent",{reason:"API key not set"}),-1)};var or=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};Wn.prototype.logRevenueV2=function(e){if(this._apiKeySet("logRevenueV2()"))if("object"===U(e)&&e.hasOwnProperty("_q")&&(e=tr(new Bn,e)),e instanceof Bn){if(e&&e._isValidRevenue())return this.logEvent(y.REVENUE_EVENT,e._toJSONObject())}else G.log.error("Invalid revenue input type. Expected Revenue object but saw "+U(e))},Wn.prototype.logRevenue=function(e,t,n){return this._apiKeySet("logRevenue()")&&or(e)&&(void 0===t||or(t))?this._logEvent(y.REVENUE_EVENT,{},{productId:n,special:"revenue_amount",quantity:t||1,price:e},null,null,null,null,null):-1},Wn.prototype.removeEvents=function(e,t){ir(this,"_unsentEvents",e),ir(this,"_unsentIdentifys",t)};var ir=function(e,t,n){if(!(n<0)){for(var r=[],o=0;on&&r.push(e[t][o]);e[t]=r}};Wn.prototype.sendEvents=function(e){if(this._apiKeySet("sendEvents()"))if(this.options.optOut)"function"===U(e)&&e(0,"No request sent",{reason:"optOut is set to true"});else if(0!==this._unsentCount())if(this._sending)"function"===U(e)&&e(0,"No request sent",{reason:"Request already in progress"});else{this._sending=!0;var t=(this.options.forceHttps?"https":"https:"===window.location.protocol?"https":"http")+"://"+this.options.apiEndpoint+"/",n=Math.min(this._unsentCount(),this.options.uploadBatchSize),r=this._mergeEventsAndIdentifys(n),o=r.maxEventId,i=r.maxIdentifyId,s=JSON.stringify(r.eventsToSend),a=(new Date).getTime(),u={client:this.options.apiKey,e:s,v:y.API_VERSION,upload_time:a,checksum:ne(y.API_VERSION+this.options.apiKey+s+a)},c=this;new Gn(t,u).send(function(t,r){c._sending=!1;try{200===t&&"success"===r?(c.removeEvents(o,i),c.options.saveEvents&&c.saveEvents(),c._sendEventsIfReady(e)||"function"!==U(e)||e(t,r)):413===t?(1===c.options.uploadBatchSize&&c.removeEvents(o,i),c.options.uploadBatchSize=Math.ceil(n/2),c.sendEvents(e)):"function"===U(e)&&e(t,r)}catch(e){}})}else"function"===U(e)&&e(0,"No request sent",{reason:"No events to send"});else"function"===U(e)&&e(0,"No request sent",{reason:"API key not set"})},Wn.prototype._mergeEventsAndIdentifys=function(e){for(var t=[],n=0,r=-1,o=0,i=-1;t.length=this._unsentIdentifys.length,u=n>=this._unsentEvents.length;if(u&&a){G.log.error("Merging Events and Identifys, less events and identifys than expected");break}a?r=(s=this._unsentEvents[n++]).event_id:u?i=(s=this._unsentIdentifys[o++]).event_id:!("sequence_number"in this._unsentEvents[n])||this._unsentEvents[n].sequence_number>6|192):(t+=String.fromCharCode(i>>12|224),t+=String.fromCharCode(i>>6&63|128)),t+=String.fromCharCode(63&i|128))}return t},T=function(e){for(var t="",n=0,i=0,r=0,o=0;n>2,o=(3&t)<<4|(n=e.charCodeAt(c++))>>4,s=(15&n)<<2|(i=e.charCodeAt(c++))>>6,a=63&i,isNaN(n)?s=a=64:isNaN(i)&&(a=64),u=u+j._keyStr.charAt(r)+j._keyStr.charAt(o)+j._keyStr.charAt(s)+j._keyStr.charAt(a);return u},decode:function(e){try{if(window.btoa&&window.atob)return decodeURIComponent(escape(window.atob(e)))}catch(e){}return j._decode(e)},_decode:function(e){var t,n,i,r,o,s,a="",u=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");u>4,n=(15&r)<<4|(o=j._keyStr.indexOf(e.charAt(u++)))>>2,i=(3&o)<<6|(s=j._keyStr.indexOf(e.charAt(u++))),a+=String.fromCharCode(t),64!==o&&(a+=String.fromCharCode(n)),64!==s&&(a+=String.fromCharCode(i));return a=T(a)}},C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P=Object.assign||function(e){for(var t=1;t=D.ERROR&&L(e)},warn:function(e){M>=D.WARN&&L(e)},info:function(e){M>=D.INFO&&L(e)}},L=function(e){try{console.log("[Amplitude] "+e)}catch(e){}},F=function(e){return"string"===q(e)&&e.length>t?e.substring(0,t):e},K=function(e){var t=q(e);if("object"!==t)return B.error("Error: invalid properties format. Expecting Javascript object, received "+t+", ignoring"),{};if(Object.keys(e).length>a)return B.error("Error: too many properties (more than 1000), ignoring"),{};var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=i,o=q(r);"string"!==o&&(r=String(r),B.warn("WARNING: Non-string property key, received type "+o+', coercing to string "'+r+'"'));var s=G(r,e[i]);null!==s&&(n[r]=s)}return n},z=["null","nan","undefined","function","arguments","regexp","element"],G=function e(t,n){var i=q(n);if(-1!==z.indexOf(i))B.warn('WARNING: Property key "'+t+'" with invalid value type '+i+", ignoring"),n=null;else if("error"===i)n=String(n),B.warn('WARNING: Property key "'+t+'" with value type error, coercing to '+n);else if("array"===i){for(var r=[],o=0;o>16)+(t>>16)+(n>>16)<<16|65535&n}function a(e,t,n,i,r,o){return l((s=l(l(t,e),l(i,o)))<<(a=r)|s>>>32-a,n);var s,a}function d(e,t,n,i,r,o,s){return a(t&n|~t&i,e,t,r,o,s)}function f(e,t,n,i,r,o,s){return a(t&i|n&~i,e,t,r,o,s)}function h(e,t,n,i,r,o,s){return a(t^n^i,e,t,r,o,s)}function g(e,t,n,i,r,o,s){return a(n^(t|~i),e,t,r,o,s)}function u(e,t){var n,i,r,o,s;e[t>>5]|=128<>>9<<4)]=t;var a=1732584193,u=-271733879,c=-1732584194,p=271733878;for(n=0;n>5]>>>t%32&255);return n}function p(e){var t,n=[];for(n[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+i.charAt(15&t);return r}function n(e){return unescape(encodeURIComponent(e))}function r(e){return c(u(p(t=n(e)),8*t.length));var t}function o(e,t){return function(e,t){var n,i,r=p(e),o=[],s=[];for(o[15]=s[15]=void 0,16>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)}),ke="4.6.0",Ae={apiEndpoint:"api.amplitude.com",batchEvents:!1,cookieExpiration:3650,cookieName:"amplitude_id",deviceIdFromUrlParam:!1,domain:"",eventUploadPeriodMillis:3e4,eventUploadThreshold:30,forceHttps:!0,includeGclid:!1,includeReferrer:!1,includeUtm:!1,language:{language:navigator&&(navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage)||void 0}.language,logLevel:"WARN",optOut:!1,platform:"Web",savedMaxCount:1e3,saveEvents:!0,saveParamsReferrerOncePerSession:!0,secureCookie:!1,sessionTimeout:18e5,trackingOptions:{city:!0,country:!0,device_model:!0,dma:!0,ip_address:!0,language:!0,os_name:!0,os_version:!0,platform:!0,region:!0,version_name:!0},unsetParamsReferrerOnNewSession:!1,unsentKey:"amplitude_unsent",unsentIdentifyKey:"amplitude_unsent_identify",uploadBatchSize:100},Te=function(e){this._instanceName=$(e)?d:e.toLowerCase(),this._legacyStorageSuffix=this._instanceName===d?"":"_"+this._instanceName,this._unsentEvents=[],this._unsentIdentifys=[],this._ua=new Ne(navigator.userAgent).getResult(),this.options=P({},Ae,{trackingOptions:P({},Ae.trackingOptions)}),this.cookieStorage=(new de).getStorage(),this._q=[],this._sending=!1,this._updateScheduled=!1,this._eventId=0,this._identifyId=0,this._lastEventTime=null,this._newSession=!1,this._sequenceNumber=0,this._sessionId=null,this._userAgent=navigator&&navigator.userAgent||null};Te.prototype.Identify=he,Te.prototype.Revenue=Ee,Te.prototype.init=function(e,t,n,i){if("string"!==q(e)||$(e))V.error("Invalid apiKey. Please re-initialize with a valid apiKey");else try{this.options.apiKey=e,this._storageSuffix="_"+e+this._legacyStorageSuffix,je(this.options,n),"string"===q(this.options.logLevel)&&W(this.options.logLevel);var r=Be(this);if(this._apiPropertiesTrackingOptions=0this.options.sessionTimeout)&&(this.options.unsetParamsReferrerOnNewSession&&this._unsetUTMParams(),this._newSession=!0,this._sessionId=l,this.options.saveParamsReferrerOncePerSession&&this._trackParamsAndReferrer()),this.options.saveParamsReferrerOncePerSession||this._trackParamsAndReferrer(),this._lastEventTime=l,qe(this),this._sendEventsIfReady()}catch(e){V.error(e)}finally{"function"===q(i)&&i(this)}},Te.prototype._trackParamsAndReferrer=function(){this.options.includeUtm&&this._initUtmData(),this.options.includeReferrer&&this._saveReferrer(this._getReferrer()),this.options.includeGclid&&this._saveGclid(this._getUrlParams())};var je=function i(r,o){if("object"===q(o)){var e=function(e){if(r.hasOwnProperty(e)){var t=o[e],n=q(r[e]);Z(t,e+" option",n)&&("boolean"===n?r[e]=!!t:"string"===n&&!$(t)||"number"===n&&0=this.options.eventUploadThreshold?(this.sendEvents(e),!0):(this._updateScheduled||(this._updateScheduled=!0,setTimeout(function(){this._updateScheduled=!1,this.sendEvents()}.bind(this),this.options.eventUploadPeriodMillis)),!1):(this.sendEvents(e),!0))},Te.prototype._getFromStorage=function(e,t){return e.getItem(t+this._storageSuffix)},Te.prototype._getFromStorageLegacy=function(e,t){return e.getItem(t+this._legacyStorageSuffix)},Te.prototype._setInStorage=function(e,t,n){e.setItem(t+this._storageSuffix,n)};var Ce=function(e){var t=e.cookieStorage.get(e.options.cookieName+e._storageSuffix);if("object"!==q(t)&&!("object"===q(t=e.cookieStorage.get(e.options.cookieName+e._legacyStorageSuffix))&&t.deviceId&&t.sessionId&&t.lastEventTime)){var n=function(e){var t=le.getItem(e);return le.removeItem(e),t},i="string"===q(e.options.apiKey)&&"_"+e.options.apiKey.slice(0,6)||"",r=n(w+i),o=n(I+i),s=n(b+i);null!=s&&(s="true"===String(s));var a=parseInt(n(_)),u=parseInt(n(v)),c=parseInt(n(g)),p=parseInt(n(y)),l=parseInt(n(m)),d=function(e){return"object"===q(t)&&t[e]};e.options.deviceId=d("deviceId")||r,e.options.userId=d("userId")||o,e._sessionId=d("sessionId")||a||e._sessionId,e._lastEventTime=d("lastEventTime")||u||e._lastEventTime,e._eventId=d("eventId")||c||e._eventId,e._identifyId=d("identifyId")||p||e._identifyId,e._sequenceNumber=d("sequenceNumber")||l||e._sequenceNumber,e.options.optOut=s||!1,t&&void 0!==t.optOut&&null!==t.optOut&&(e.options.optOut="true"===String(t.optOut)),qe(e)}},Pe=function(e){var t=e.cookieStorage.get(e.options.cookieName+e._storageSuffix);if("object"===q(t))Re(e,t);else{var n=e.cookieStorage.get(e.options.cookieName+e._legacyStorageSuffix);"object"===q(n)&&(e.cookieStorage.remove(e.options.cookieName+e._legacyStorageSuffix),Re(e,n))}},Re=function(e,t){t.deviceId&&(e.options.deviceId=t.deviceId),t.userId&&(e.options.userId=t.userId),null!==t.optOut&&void 0!==t.optOut&&(e.options.optOut=t.optOut),t.sessionId&&(e._sessionId=parseInt(t.sessionId)),t.lastEventTime&&(e._lastEventTime=parseInt(t.lastEventTime)),t.eventId&&(e._eventId=parseInt(t.eventId)),t.identifyId&&(e._identifyId=parseInt(t.identifyId)),t.sequenceNumber&&(e._sequenceNumber=parseInt(t.sequenceNumber))},qe=function(e){e.cookieStorage.set(e.options.cookieName+e._storageSuffix,{deviceId:e.options.deviceId,userId:e.options.userId,optOut:e.options.optOut,sessionId:e._sessionId,lastEventTime:e._lastEventTime,eventId:e._eventId,identifyId:e._identifyId,sequenceNumber:e._sequenceNumber})};Te.prototype._initUtmData=function(e,t){e=e||this._getUrlParams(),t=t||this.cookieStorage.get("__utmz");var n,i,r,o,s,a,u,c,p,l,d,f=(i=e,r=(n=t)?"?"+n.split(".").slice(-1)[0].replace(/\|/g,"&"):"",s=(o=function(e,t,n,i){return X(e,t)||X(n,i)})(O,i,"utmcsr",r),a=o(E,i,"utmcmd",r),u=o(N,i,"utmccn",r),c=o(x,i,"utmctr",r),p=o(k,i,"utmcct",r),l={},(d=function(e,t){$(t)||(l[e]=t)})(O,s),d(E,a),d(N,u),d(x,c),d(k,p),l);Ue(this,f)},Te.prototype._unsetUTMParams=function(){var e=new he;e.unset(S),e.unset(O),e.unset(E),e.unset(N),e.unset(x),e.unset(k),this.identify(e)};var Ue=function(e,t){if("object"===q(t)&&0!==Object.keys(t).length){var n=new he;for(var i in t)t.hasOwnProperty(i)&&(n.setOnce("initial_"+i,t[i]),n.set(i,t[i]));e.identify(n)}};Te.prototype._getReferrer=function(){return document.referrer},Te.prototype._getUrlParams=function(){return location.search},Te.prototype._saveGclid=function(e){var t=X("gclid",e);$(t)||Ue(this,{gclid:t})},Te.prototype._getDeviceIdFromUrlParam=function(e){return X(l,e)},Te.prototype._getReferringDomain=function(e){if($(e))return null;var t=e.split("/");return 3<=t.length?t[2]:null},Te.prototype._saveReferrer=function(e){if(!$(e)){var t={referrer:e,referring_domain:this._getReferringDomain(e)};Ue(this,t)}},Te.prototype.saveEvents=function(){try{this._setInStorage(le,this.options.unsentKey,JSON.stringify(this._unsentEvents))}catch(e){}try{this._setInStorage(le,this.options.unsentIdentifyKey,JSON.stringify(this._unsentIdentifys))}catch(e){}},Te.prototype.setDomain=function(e){if(Z(e,"domain","string"))try{this.cookieStorage.options({domain:e}),this.options.domain=this.cookieStorage.options().domain,Pe(this),qe(this)}catch(e){V.error(e)}},Te.prototype.setUserId=function(e){try{this.options.userId=null!=e&&""+e||null,qe(this)}catch(e){V.error(e)}},Te.prototype.setGroup=function(e,t){if(this._apiKeySet("setGroup()")&&Z(e,"groupType","string")&&!$(e)){var n={};n[e]=t;var i=(new he).set(e,t);this._logEvent(f,null,null,i.userPropertiesOperations,n,null,null,null)}},Te.prototype.setOptOut=function(e){if(Z(e,"enable","boolean"))try{this.options.optOut=e,qe(this)}catch(e){V.error(e)}},Te.prototype.setSessionId=function(e){if(Z(e,"sessionId","number"))try{this._sessionId=e,qe(this)}catch(e){V.error(e)}},Te.prototype.resetSessionId=function(){this.setSessionId((new Date).getTime())},Te.prototype.regenerateDeviceId=function(){this.setDeviceId(xe()+"R")},Te.prototype.setDeviceId=function(e){if(Z(e,"deviceId","string"))try{$(e)||(this.options.deviceId=""+e,qe(this))}catch(e){V.error(e)}},Te.prototype.setUserProperties=function(e){if(this._apiKeySet("setUserProperties()")&&Z(e,"userProperties","object")){var t=H(Y(e));if(0!==Object.keys(t).length){var n=new he;for(var i in t)t.hasOwnProperty(i)&&n.set(i,t[i]);this.identify(n)}}},Te.prototype.clearUserProperties=function(){if(this._apiKeySet("clearUserProperties()")){var e=new he;e.clearAll(),this.identify(e)}};var De=function(e,t){for(var n=0;nthis.options.sessionTimeout)&&(this._sessionId=p),this._lastEventTime=p,qe(this),i=i||{};var l=P({},this._apiPropertiesTrackingOptions);n=P({},n||{},l),t=t||{},r=r||{},o=o||{};var d={device_id:this.options.deviceId,user_id:this.options.userId,timestamp:p,event_id:u,session_id:this._sessionId||-1,event_type:e,version_name:Me(this,"version_name")&&this.options.versionName||null,platform:Me(this,"platform")?this.options.platform:null,os_name:Me(this,"os_name")&&this._ua.browser.name||null,os_version:Me(this,"os_version")&&this._ua.browser.major||null,device_model:Me(this,"device_model")&&this._ua.os.name||null,language:Me(this,"language")?this.options.language:null,api_properties:n,event_properties:H(Y(t)),user_properties:H(Y(i)),uuid:xe(),library:{name:"amplitude-js",version:ke},sequence_number:c,groups:H(Q(r)),group_properties:H(Y(o)),user_agent:this._userAgent};return e===f||e===h?(this._unsentIdentifys.push(d),this._limitEventsQueued(this._unsentIdentifys)):(this._unsentEvents.push(d),this._limitEventsQueued(this._unsentEvents)),this.options.saveEvents&&this.saveEvents(),this._sendEventsIfReady(a)||"function"!==q(a)||a(0,"No request sent",{reason:"No events to send or upload queued"}),u}catch(e){V.error(e)}else"function"===q(a)&&a(0,"No request sent",{reason:"Missing eventType"})};var Me=function(e,t){return!!e.options.trackingOptions[t]},Be=function(e){for(var t=["city","country","dma","ip_address","region"],n={},i=0;ithis.options.savedMaxCount&&e.splice(0,e.length-this.options.savedMaxCount)},Te.prototype.logEvent=function(e,t,n){return this.logEventWithTimestamp(e,t,null,n)},Te.prototype.logEventWithTimestamp=function(e,t,n,i){return this._apiKeySet("logEvent()")?Z(e,"eventType","string")?$(e)?("function"===q(i)&&i(0,"No request sent",{reason:"Missing eventType"}),-1):this._logEvent(e,t,null,null,null,null,n,i):("function"===q(i)&&i(0,"No request sent",{reason:"Invalid type for eventType"}),-1):("function"===q(i)&&i(0,"No request sent",{reason:"API key not set"}),-1)},Te.prototype.logEventWithGroups=function(e,t,n,i){return this._apiKeySet("logEventWithGroups()")?Z(e,"eventType","string")?this._logEvent(e,t,null,null,n,null,null,i):("function"===q(i)&&i(0,"No request sent",{reason:"Invalid type for eventType"}),-1):("function"===q(i)&&i(0,"No request sent",{reason:"API key not set"}),-1)};var Le=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};Te.prototype.logRevenueV2=function(e){if(this._apiKeySet("logRevenueV2()"))if("object"===q(e)&&e.hasOwnProperty("_q")&&(e=De(new Ee,e)),e instanceof Ee){if(e&&e._isValidRevenue())return this.logEvent(i,e._toJSONObject())}else V.error("Invalid revenue input type. Expected Revenue object but saw "+q(e))},Te.prototype.logRevenue=function(e,t,n){return this._apiKeySet("logRevenue()")&&Le(e)&&(void 0===t||Le(t))?this._logEvent(i,{},{productId:n,special:"revenue_amount",quantity:t||1,price:e},null,null,null,null,null):-1},Te.prototype.removeEvents=function(e,t){Fe(this,"_unsentEvents",e),Fe(this,"_unsentIdentifys",t)};var Fe=function(e,t,n){if(!(n<0)){for(var i=[],r=0;rn&&i.push(e[t][r]);e[t]=i}};Te.prototype.sendEvents=function(n){if(this._apiKeySet("sendEvents()"))if(this.options.optOut)"function"===q(n)&&n(0,"No request sent",{reason:"optOut is set to true"});else if(0!==this._unsentCount())if(this._sending)"function"===q(n)&&n(0,"No request sent",{reason:"Request already in progress"});else{this._sending=!0;var e=(this.options.forceHttps?"https":"https:"===window.location.protocol?"https":"http")+"://"+this.options.apiEndpoint+"/",i=Math.min(this._unsentCount(),this.options.uploadBatchSize),t=this._mergeEventsAndIdentifys(i),r=t.maxEventId,o=t.maxIdentifyId,s=JSON.stringify(t.eventsToSend),a=(new Date).getTime(),u={client:this.options.apiKey,e:s,v:p,upload_time:a,checksum:ge(p+this.options.apiKey+s+a)},c=this;new Oe(e,u).send(function(e,t){c._sending=!1;try{200===e&&"success"===t?(c.removeEvents(r,o),c.options.saveEvents&&c.saveEvents(),c._sendEventsIfReady(n)||"function"!==q(n)||n(e,t)):413===e?(1===c.options.uploadBatchSize&&c.removeEvents(r,o),c.options.uploadBatchSize=Math.ceil(i/2),c.sendEvents(n)):"function"===q(n)&&n(e,t)}catch(e){}})}else"function"===q(n)&&n(0,"No request sent",{reason:"No events to send"});else"function"===q(n)&&n(0,"No request sent",{reason:"API key not set"})},Te.prototype._mergeEventsAndIdentifys=function(e){for(var t=[],n=0,i=-1,r=0,o=-1;t.length=this._unsentIdentifys.length,u=n>=this._unsentEvents.length;if(u&&a){V.error("Merging Events and Identifys, less events and identifys than expected");break}a?i=(s=this._unsentEvents[n++]).event_id:u?o=(s=this._unsentIdentifys[r++]).event_id:!("sequence_number"in this._unsentEvents[n])||this._unsentEvents[n].sequence_number", - "version": "4.5.2", + "version": "4.6.0", "license": "MIT", "description": "Javascript library for Amplitude Analytics", "keywords": [ @@ -11,43 +11,44 @@ "repository": "git://github.com/amplitude/amplitude-javascript.git", "main": "amplitude.js", "dependencies": { - "@segment/top-domain": "^3.0.0", "blueimp-md5": "^2.10.0", "json3": "^3.3.2", - "lodash": "^4.17.4", - "ua-parser-js": "github:amplitude/ua-parser-js#ed538f1" + "query-string": "5", + "@amplitude/ua-parser-js": "0.7.11" }, "devDependencies": { - "babel-core": "^6.26.0", + "babel-core": "6", + "babel-plugin-external-helpers": "^6.22.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-polyfill": "^6.26.0", - "babel-preset-env": "^1.6.1", + "babel-preset-env": "1", "chai": "^4.1.2", "express": "^4.16.2", "fs-extra": "^4.0.2", "jsdoc": "3.4.0", - "jshint": "^2.6.3", - "karma": "^1.7.1", + "jshint": "^2.9.6", + "karma": "^3.1.3", "karma-chai": "^0.1.0", "karma-chrome-launcher": "^2.2.0", "karma-firefox-launcher": "^1.0.1", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", "karma-sauce-launcher": "^1.2.0", - "karma-sourcemap-loader": "^0.3.7", "karma-sinon": "^1.0.5", + "karma-sourcemap-loader": "^0.3.7", "mocha": "^4.0.1", - "rollup": "^0.49.3", + "rollup": "^0.56.0", "rollup-plugin-babel": "^3.0.2", - "rollup-plugin-commonjs": "^8.2.6", - "rollup-plugin-json": "^2.3.0", + "rollup-plugin-commonjs": "8", "rollup-plugin-legacy": "^1.0.0", - "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-resolve": "^3.0.0", + "rollup-plugin-replace": "^2.1.0", "rollup-plugin-uglify": "^2.0.1", "sinon": "^4.1.2", "uglify-js": "^2.0.0" }, "scripts": { - "test": "make test" + "test": "make test", + "dev": "node test/browser/server.js" } } diff --git a/rollup.config.js b/rollup.config.js index 00b62897..33c4f03f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,24 +1,29 @@ import resolve from 'rollup-plugin-node-resolve'; import commonjs from 'rollup-plugin-commonjs'; -import builtins from 'rollup-plugin-node-builtins'; +import replace from 'rollup-plugin-replace'; import babel from 'rollup-plugin-babel'; - export default { - input: 'src/index.js', + input: 'src/index.compat.js', output: { + name: 'amplitude', file: 'amplitude.js', format: 'umd', }, - name: 'amplitude', plugins: [ - builtins(), babel({ - exclude: 'node_modules/**' + exclude: 'node_modules/**', + externalHelpersWhitelist: ['defineProperty', 'extends', 'typeof'], + plugins: ['external-helpers', 'transform-object-rest-spread'], }), resolve({ browser: true, }), + replace({ + BUILD_COMPAT_SNIPPET: 'true', + BUILD_COMPAT_2_0: 'true', + BUILD_COMPAT_LOCAL_STORAGE: 'true', + }), commonjs(), ], } diff --git a/rollup.nocompat.js b/rollup.nocompat.js new file mode 100644 index 00000000..362f3347 --- /dev/null +++ b/rollup.nocompat.js @@ -0,0 +1,29 @@ +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import replace from 'rollup-plugin-replace'; +import babel from 'rollup-plugin-babel'; + +export default { + input: 'src/index.js', + output: { + name: 'amplitude', + file: 'amplitude.nocompat.js', + format: 'umd', + }, + plugins: [ + babel({ + exclude: 'node_modules/**', + externalHelpersWhitelist: ['defineProperty', 'extends', 'typeof'], + plugins: ['external-helpers', 'transform-object-rest-spread'], + }), + resolve({ + browser: true, + }), + replace({ + BUILD_COMPAT_SNIPPET: 'false', + BUILD_COMPAT_2_0: 'false', + BUILD_COMPAT_LOCAL_STORAGE: 'false', + }), + commonjs(), + ], +} diff --git a/rollup.nocompat.min.js b/rollup.nocompat.min.js new file mode 100644 index 00000000..84e31f41 --- /dev/null +++ b/rollup.nocompat.min.js @@ -0,0 +1,7 @@ +import config from './rollup.nocompat.js'; +import uglify from 'rollup-plugin-uglify'; + +config.plugins.push(uglify()); +config.output.file = 'amplitude.nocompat.min.js'; + +export default config; diff --git a/src/amplitude-client.js b/src/amplitude-client.js index 70f30408..c3cb518e 100644 --- a/src/amplitude-client.js +++ b/src/amplitude-client.js @@ -4,11 +4,10 @@ import getUtmData from './utm'; import Identify from './identify'; import localStorage from './localstorage'; // jshint ignore:line import md5 from 'blueimp-md5'; -import merge from 'lodash/merge'; import Request from './xhr'; import Revenue from './revenue'; import type from './type'; -import UAParser from 'ua-parser-js'; +import UAParser from '@amplitude/ua-parser-js'; import utils from './utils'; import UUID from './uuid'; import version from './version'; @@ -27,7 +26,7 @@ var AmplitudeClient = function AmplitudeClient(instanceName) { this._unsentEvents = []; this._unsentIdentifys = []; this._ua = new UAParser(navigator.userAgent).getResult(); - this.options = merge({}, DEFAULT_OPTIONS); + this.options = {...DEFAULT_OPTIONS, trackingOptions: {...DEFAULT_OPTIONS.trackingOptions}}; this.cookieStorage = new cookieStorage().getStorage(); this._q = []; // queue for proxied functions before script load this._sending = false; @@ -79,7 +78,8 @@ AmplitudeClient.prototype.init = function init(apiKey, opt_userId, opt_config, o this.cookieStorage.options({ expirationDays: this.options.cookieExpiration, - domain: this.options.domain + domain: this.options.domain, + secure: this.options.secureCookie, }); this.options.domain = this.cookieStorage.options().domain; @@ -970,8 +970,8 @@ AmplitudeClient.prototype._logEvent = function _logEvent(eventType, eventPropert _saveCookieData(this); userProperties = userProperties || {}; - var trackingOptions = merge({}, this._apiPropertiesTrackingOptions); - apiProperties = merge(trackingOptions, (apiProperties || {})); + var trackingOptions = {...this._apiPropertiesTrackingOptions}; + apiProperties = {...(apiProperties || {}), ...trackingOptions}; eventProperties = eventProperties || {}; groups = groups || {}; groupProperties = groupProperties || {}; @@ -1173,29 +1173,31 @@ AmplitudeClient.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { } }; -/** - * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 - * @public - * @deprecated - * @param {number} price - price of revenue event - * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. - * @param {string} product - (optional) product identifier - * @example amplitudeClient.logRevenue(3.99, 1, 'product_1234'); - */ -AmplitudeClient.prototype.logRevenue = function logRevenue(price, quantity, product) { - // Test that the parameters are of the right type. - if (!this._apiKeySet('logRevenue()') || !_isNumber(price) || (quantity !== undefined && !_isNumber(quantity))) { - // utils.log('Price and quantity arguments to logRevenue must be numbers'); - return -1; - } +if (BUILD_COMPAT_2_0) { + /** + * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 + * @public + * @deprecated + * @param {number} price - price of revenue event + * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. + * @param {string} product - (optional) product identifier + * @example amplitudeClient.logRevenue(3.99, 1, 'product_1234'); + */ + AmplitudeClient.prototype.logRevenue = function logRevenue(price, quantity, product) { + // Test that the parameters are of the right type. + if (!this._apiKeySet('logRevenue()') || !_isNumber(price) || (quantity !== undefined && !_isNumber(quantity))) { + // utils.log('Price and quantity arguments to logRevenue must be numbers'); + return -1; + } - return this._logEvent(Constants.REVENUE_EVENT, {}, { - productId: product, - special: 'revenue_amount', - quantity: quantity || 1, - price: price - }, null, null, null, null, null); -}; + return this._logEvent(Constants.REVENUE_EVENT, {}, { + productId: product, + special: 'revenue_amount', + quantity: quantity || 1, + price: price + }, null, null, null, null, null); + }; +} /** * Remove events in storage with event ids up to and including maxEventId. @@ -1374,14 +1376,16 @@ AmplitudeClient.prototype._mergeEventsAndIdentifys = function _mergeEventsAndIde }; }; -/** - * Set global user properties. Note this is deprecated, and we recommend using setUserProperties - * @public - * @deprecated - */ -AmplitudeClient.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { - this.setUserProperties(userProperties); -}; +if (BUILD_COMPAT_2_0) { + /** + * Set global user properties. Note this is deprecated, and we recommend using setUserProperties + * @public + * @deprecated + */ + AmplitudeClient.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { + this.setUserProperties(userProperties); + }; +} /** * Get the current version of Amplitude's Javascript SDK. diff --git a/src/amplitude-snippet.js b/src/amplitude-snippet.js index 903fdeec..1702d408 100644 --- a/src/amplitude-snippet.js +++ b/src/amplitude-snippet.js @@ -3,7 +3,7 @@ var as = document.createElement('script'); as.type = 'text/javascript'; as.async = true; - as.src = 'https://cdn.amplitude.com/libs/amplitude-4.5.2-min.gz.js'; + as.src = 'https://cdn.amplitude.com/libs/amplitude-4.6.0-min.gz.js'; as.onload = function() {if(window.amplitude.runQueuedFunctions) {window.amplitude.runQueuedFunctions();} else {console.log('[Amplitude] Error: could not load SDK');}}; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(as, s); diff --git a/src/amplitude.js b/src/amplitude.js index 913e35e9..220f201a 100644 --- a/src/amplitude.js +++ b/src/amplitude.js @@ -1,7 +1,6 @@ import AmplitudeClient from './amplitude-client'; import Constants from './constants'; import Identify from './identify'; -import assign from 'lodash/assign'; import Revenue from './revenue'; import type from './type'; import utils from './utils'; @@ -17,7 +16,7 @@ import DEFAULT_OPTIONS from './options'; * @example var amplitude = new Amplitude(); */ var Amplitude = function Amplitude() { - this.options = assign({}, DEFAULT_OPTIONS); + this.options = {...DEFAULT_OPTIONS}; this._q = []; this._instances = {}; // mapping of instance names to instances }; @@ -35,326 +34,330 @@ Amplitude.prototype.getInstance = function getInstance(instance) { return client; }; -/** - * Initializes the Amplitude Javascript SDK with your apiKey and any optional configurations. - * This is required before any other methods can be called. - * @public - * @param {string} apiKey - The API key for your app. - * @param {string} opt_userId - (optional) An identifier for this user. - * @param {object} opt_config - (optional) Configuration options. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#configuration-options} for list of options and default values. - * @param {function} opt_callback - (optional) Provide a callback function to run after initialization is complete. - * @deprecated Please use amplitude.getInstance().init(apiKey, opt_userId, opt_config, opt_callback); - * @example amplitude.init('API_KEY', 'USER_ID', {includeReferrer: true, includeUtm: true}, function() { alert('init complete'); }); - */ -Amplitude.prototype.init = function init(apiKey, opt_userId, opt_config, opt_callback) { - this.getInstance().init(apiKey, opt_userId, opt_config, function(instance) { - // make options such as deviceId available for callback functions - this.options = instance.options; - if (type(opt_callback) === 'function') { - opt_callback(instance); +if (BUILD_COMPAT_SNIPPET) { + /** + * Run functions queued up by proxy loading snippet + * @private + */ + Amplitude.prototype.runQueuedFunctions = function () { + // run queued up old versions of functions + for (var i = 0; i < this._q.length; i++) { + var fn = this[this._q[i][0]]; + if (type(fn) === 'function') { + fn.apply(this, this._q[i].slice(1)); + } } - }.bind(this)); -}; + this._q = []; // clear function queue after running -/** - * Run functions queued up by proxy loading snippet - * @private - */ -Amplitude.prototype.runQueuedFunctions = function () { - // run queued up old versions of functions - for (var i = 0; i < this._q.length; i++) { - var fn = this[this._q[i][0]]; - if (type(fn) === 'function') { - fn.apply(this, this._q[i].slice(1)); + // run queued up functions on instances + for (var instance in this._instances) { + if (this._instances.hasOwnProperty(instance)) { + this._instances[instance].runQueuedFunctions(); + } } - } - this._q = []; // clear function queue after running - - // run queued up functions on instances - for (var instance in this._instances) { - if (this._instances.hasOwnProperty(instance)) { - this._instances[instance].runQueuedFunctions(); - } - } -}; - -/** - * Returns true if a new session was created during initialization, otherwise false. - * @public - * @return {boolean} Whether a new session was created during initialization. - * @deprecated Please use amplitude.getInstance().isNewSession(); - */ -Amplitude.prototype.isNewSession = function isNewSession() { - return this.getInstance().isNewSession(); -}; - -/** - * Returns the id of the current session. - * @public - * @return {number} Id of the current session. - * @deprecated Please use amplitude.getInstance().getSessionId(); - */ -Amplitude.prototype.getSessionId = function getSessionId() { - return this.getInstance().getSessionId(); -}; - -/** - * Increments the eventId and returns it. - * @private - */ -Amplitude.prototype.nextEventId = function nextEventId() { - return this.getInstance().nextEventId(); -}; - -/** - * Increments the identifyId and returns it. - * @private - */ -Amplitude.prototype.nextIdentifyId = function nextIdentifyId() { - return this.getInstance().nextIdentifyId(); -}; - -/** - * Increments the sequenceNumber and returns it. - * @private - */ -Amplitude.prototype.nextSequenceNumber = function nextSequenceNumber() { - return this.getInstance().nextSequenceNumber(); -}; - -/** - * Saves unsent events and identifies to localStorage. JSON stringifies event queues before saving. - * Note: this is called automatically every time events are logged, unless you explicitly set option saveEvents to false. - * @private - */ -Amplitude.prototype.saveEvents = function saveEvents() { - this.getInstance().saveEvents(); -}; - -/** - * Sets a customer domain for the amplitude cookie. Useful if you want to support cross-subdomain tracking. - * @public - * @param {string} domain to set. - * @deprecated Please use amplitude.getInstance().setDomain(domain); - * @example amplitude.setDomain('.amplitude.com'); - */ -Amplitude.prototype.setDomain = function setDomain(domain) { - this.getInstance().setDomain(domain); -}; - -/** - * Sets an identifier for the current user. - * @public - * @param {string} userId - identifier to set. Can be null. - * @deprecated Please use amplitude.getInstance().setUserId(userId); - * @example amplitude.setUserId('joe@gmail.com'); - */ -Amplitude.prototype.setUserId = function setUserId(userId) { - this.getInstance().setUserId(userId); -}; - -/** - * Add user to a group or groups. You need to specify a groupType and groupName(s). - * For example you can group people by their organization. - * In that case groupType is "orgId" and groupName would be the actual ID(s). - * groupName can be a string or an array of strings to indicate a user in multiple gruups. - * You can also call setGroup multiple times with different groupTypes to track multiple types of groups (up to 5 per app). - * Note: this will also set groupType: groupName as a user property. - * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information. - * @public - * @param {string} groupType - the group type (ex: orgId) - * @param {string|list} groupName - the name of the group (ex: 15), or a list of names of the groups - * @deprecated Please use amplitude.getInstance().setGroup(groupType, groupName); - * @example amplitude.setGroup('orgId', 15); // this adds the current user to orgId 15. - */ -Amplitude.prototype.setGroup = function(groupType, groupName) { - this.getInstance().setGroup(groupType, groupName); -}; - -/** - * Sets whether to opt current user out of tracking. - * @public - * @param {boolean} enable - if true then no events will be logged or sent. - * @deprecated Please use amplitude.getInstance().setOptOut(enable); - * @example: amplitude.setOptOut(true); - */ -Amplitude.prototype.setOptOut = function setOptOut(enable) { - this.getInstance().setOptOut(enable); -}; - -/** - * Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you - * are doing. This can be used in conjunction with `setUserId(null)` to anonymize users after they log out. - * With a null userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. - * This uses src/uuid.js to regenerate the deviceId. - * @public - * @deprecated Please use amplitude.getInstance().regenerateDeviceId(); - */ -Amplitude.prototype.regenerateDeviceId = function regenerateDeviceId() { - this.getInstance().regenerateDeviceId(); -}; - -/** - * Sets a custom deviceId for current user. Note: this is not recommended unless you know what you are doing - * (like if you have your own system for managing deviceIds). Make sure the deviceId you set is sufficiently unique - * (we recommend something like a UUID - see src/uuid.js for an example of how to generate) to prevent conflicts with other devices in our system. - * @public - * @param {string} deviceId - custom deviceId for current user. - * @deprecated Please use amplitude.getInstance().setDeviceId(deviceId); - * @example amplitude.setDeviceId('45f0954f-eb79-4463-ac8a-233a6f45a8f0'); - */ -Amplitude.prototype.setDeviceId = function setDeviceId(deviceId) { - this.getInstance().setDeviceId(deviceId); -}; - -/** - * Sets user properties for the current user. - * @public - * @param {object} - object with string keys and values for the user properties to set. - * @param {boolean} - DEPRECATED opt_replace: in earlier versions of the JS SDK the user properties object was kept in - * memory and replace = true would replace the object in memory. Now the properties are no longer stored in memory, so replace is deprecated. - * @deprecated Please use amplitude.getInstance.setUserProperties(userProperties); - * @example amplitude.setUserProperties({'gender': 'female', 'sign_up_complete': true}) - */ -Amplitude.prototype.setUserProperties = function setUserProperties(userProperties) { - this.getInstance().setUserProperties(userProperties); -}; - -/** - * Clear all of the user properties for the current user. Note: clearing user properties is irreversible! - * @public - * @deprecated Please use amplitude.getInstance().clearUserProperties(); - * @example amplitude.clearUserProperties(); - */ -Amplitude.prototype.clearUserProperties = function clearUserProperties(){ - this.getInstance().clearUserProperties(); -}; - -/** - * Send an identify call containing user property operations to Amplitude servers. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} - * for more information on the Identify API and user property operations. - * @param {Identify} identify_obj - the Identify object containing the user property operations to send. - * @param {Amplitude~eventCallback} opt_callback - (optional) callback function to run when the identify event has been sent. - * Note: the server response code and response body from the identify event upload are passed to the callback function. - * @deprecated Please use amplitude.getInstance().identify(identify); - * @example - * var identify = new amplitude.Identify().set('colors', ['rose', 'gold']).add('karma', 1).setOnce('sign_up_date', '2016-03-31'); - * amplitude.identify(identify); - */ -Amplitude.prototype.identify = function(identify_obj, opt_callback) { - this.getInstance().identify(identify_obj, opt_callback); -}; - -/** - * Set a versionName for your application. - * @public - * @param {string} versionName - The version to set for your application. - * @deprecated Please use amplitude.getInstance().setVersionName(versionName); - * @example amplitude.setVersionName('1.12.3'); - */ -Amplitude.prototype.setVersionName = function setVersionName(versionName) { - this.getInstance().setVersionName(versionName); -}; - -/** - * This is the callback for logEvent and identify calls. It gets called after the event/identify is uploaded, - * and the server response code and response body from the upload request are passed to the callback function. - * @callback Amplitude~eventCallback - * @param {number} responseCode - Server response code for the event / identify upload request. - * @param {string} responseBody - Server response body for the event / identify upload request. - */ - -/** - * Log an event with eventType and eventProperties - * @public - * @param {string} eventType - name of event - * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. - * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. - * Note: the server response code and response body from the event upload are passed to the callback function. - * @deprecated Please use amplitude.getInstance().logEvent(eventType, eventProperties, opt_callback); - * @example amplitude.logEvent('Clicked Homepage Button', {'finished_flow': false, 'clicks': 15}); - */ -Amplitude.prototype.logEvent = function logEvent(eventType, eventProperties, opt_callback) { - return this.getInstance().logEvent(eventType, eventProperties, opt_callback); -}; - -/** - * Log an event with eventType, eventProperties, and groups. Use this to set event-level groups. - * Note: the group(s) set only apply for the specific event type being logged and does not persist on the user - * (unless you explicitly set it with setGroup). - * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information - * about groups and Count by Distinct on the Amplitude platform. - * @public - * @param {string} eventType - name of event - * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. - * @param {object} groups - (optional) an object with string groupType: groupName values for the event being logged. - * groupName can be a string or an array of strings. - * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. - * Note: the server response code and response body from the event upload are passed to the callback function. - * Deprecated Please use amplitude.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); - * @example amplitude.logEventWithGroups('Clicked Button', null, {'orgId': 24}); - */ -Amplitude.prototype.logEventWithGroups = function(eventType, eventProperties, groups, opt_callback) { - return this.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); -}; - -/** - * Log revenue with Revenue interface. The new revenue interface allows for more revenue fields like - * revenueType and event properties. - * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#tracking-revenue} - * for more information on the Revenue interface and logging revenue. - * @public - * @param {Revenue} revenue_obj - the revenue object containing the revenue data being logged. - * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); - * @example var revenue = new amplitude.Revenue().setProductId('productIdentifier').setPrice(10.99); - * amplitude.logRevenueV2(revenue); - */ -Amplitude.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { - return this.getInstance().logRevenueV2(revenue_obj); -}; - -/** - * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 - * @public - * @param {number} price - price of revenue event - * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. - * @param {string} product - (optional) product identifier - * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); - * @example amplitude.logRevenue(3.99, 1, 'product_1234'); - */ -Amplitude.prototype.logRevenue = function logRevenue(price, quantity, product) { - return this.getInstance().logRevenue(price, quantity, product); -}; - -/** - * Remove events in storage with event ids up to and including maxEventId. - * @private - */ -Amplitude.prototype.removeEvents = function removeEvents(maxEventId, maxIdentifyId) { - this.getInstance().removeEvents(maxEventId, maxIdentifyId); -}; - -/** - * Send unsent events. Note: this is called automatically after events are logged if option batchEvents is false. - * If batchEvents is true, then events are only sent when batch criterias are met. - * @private - * @param {Amplitude~eventCallback} callback - (optional) callback to run after events are sent. - * Note the server response code and response body are passed to the callback as input arguments. - */ -Amplitude.prototype.sendEvents = function sendEvents(callback) { - this.getInstance().sendEvents(callback); -}; - -/** - * Set global user properties. Note this is deprecated, and we recommend using setUserProperties - * @public - * @deprecated - */ -Amplitude.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { - this.getInstance().setUserProperties(userProperties); -}; + }; +} + +if (BUILD_COMPAT_2_0) { + /** + * Initializes the Amplitude Javascript SDK with your apiKey and any optional configurations. + * This is required before any other methods can be called. + * @public + * @param {string} apiKey - The API key for your app. + * @param {string} opt_userId - (optional) An identifier for this user. + * @param {object} opt_config - (optional) Configuration options. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#configuration-options} for list of options and default values. + * @param {function} opt_callback - (optional) Provide a callback function to run after initialization is complete. + * @deprecated Please use amplitude.getInstance().init(apiKey, opt_userId, opt_config, opt_callback); + * @example amplitude.init('API_KEY', 'USER_ID', {includeReferrer: true, includeUtm: true}, function() { alert('init complete'); }); + */ + Amplitude.prototype.init = function init(apiKey, opt_userId, opt_config, opt_callback) { + this.getInstance().init(apiKey, opt_userId, opt_config, function(instance) { + // make options such as deviceId available for callback functions + this.options = instance.options; + if (type(opt_callback) === 'function') { + opt_callback(instance); + } + }.bind(this)); + }; + + /** + * Returns true if a new session was created during initialization, otherwise false. + * @public + * @return {boolean} Whether a new session was created during initialization. + * @deprecated Please use amplitude.getInstance().isNewSession(); + */ + Amplitude.prototype.isNewSession = function isNewSession() { + return this.getInstance().isNewSession(); + }; + + /** + * Returns the id of the current session. + * @public + * @return {number} Id of the current session. + * @deprecated Please use amplitude.getInstance().getSessionId(); + */ + Amplitude.prototype.getSessionId = function getSessionId() { + return this.getInstance().getSessionId(); + }; + + /** + * Increments the eventId and returns it. + * @private + */ + Amplitude.prototype.nextEventId = function nextEventId() { + return this.getInstance().nextEventId(); + }; + + /** + * Increments the identifyId and returns it. + * @private + */ + Amplitude.prototype.nextIdentifyId = function nextIdentifyId() { + return this.getInstance().nextIdentifyId(); + }; + + /** + * Increments the sequenceNumber and returns it. + * @private + */ + Amplitude.prototype.nextSequenceNumber = function nextSequenceNumber() { + return this.getInstance().nextSequenceNumber(); + }; + + /** + * Saves unsent events and identifies to localStorage. JSON stringifies event queues before saving. + * Note: this is called automatically every time events are logged, unless you explicitly set option saveEvents to false. + * @private + */ + Amplitude.prototype.saveEvents = function saveEvents() { + this.getInstance().saveEvents(); + }; + + /** + * Sets a customer domain for the amplitude cookie. Useful if you want to support cross-subdomain tracking. + * @public + * @param {string} domain to set. + * @deprecated Please use amplitude.getInstance().setDomain(domain); + * @example amplitude.setDomain('.amplitude.com'); + */ + Amplitude.prototype.setDomain = function setDomain(domain) { + this.getInstance().setDomain(domain); + }; + + /** + * Sets an identifier for the current user. + * @public + * @param {string} userId - identifier to set. Can be null. + * @deprecated Please use amplitude.getInstance().setUserId(userId); + * @example amplitude.setUserId('joe@gmail.com'); + */ + Amplitude.prototype.setUserId = function setUserId(userId) { + this.getInstance().setUserId(userId); + }; + + /** + * Add user to a group or groups. You need to specify a groupType and groupName(s). + * For example you can group people by their organization. + * In that case groupType is "orgId" and groupName would be the actual ID(s). + * groupName can be a string or an array of strings to indicate a user in multiple gruups. + * You can also call setGroup multiple times with different groupTypes to track multiple types of groups (up to 5 per app). + * Note: this will also set groupType: groupName as a user property. + * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information. + * @public + * @param {string} groupType - the group type (ex: orgId) + * @param {string|list} groupName - the name of the group (ex: 15), or a list of names of the groups + * @deprecated Please use amplitude.getInstance().setGroup(groupType, groupName); + * @example amplitude.setGroup('orgId', 15); // this adds the current user to orgId 15. + */ + Amplitude.prototype.setGroup = function(groupType, groupName) { + this.getInstance().setGroup(groupType, groupName); + }; + + /** + * Sets whether to opt current user out of tracking. + * @public + * @param {boolean} enable - if true then no events will be logged or sent. + * @deprecated Please use amplitude.getInstance().setOptOut(enable); + * @example: amplitude.setOptOut(true); + */ + Amplitude.prototype.setOptOut = function setOptOut(enable) { + this.getInstance().setOptOut(enable); + }; + + /** + * Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you + * are doing. This can be used in conjunction with `setUserId(null)` to anonymize users after they log out. + * With a null userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. + * This uses src/uuid.js to regenerate the deviceId. + * @public + * @deprecated Please use amplitude.getInstance().regenerateDeviceId(); + */ + Amplitude.prototype.regenerateDeviceId = function regenerateDeviceId() { + this.getInstance().regenerateDeviceId(); + }; + + /** + * Sets a custom deviceId for current user. Note: this is not recommended unless you know what you are doing + * (like if you have your own system for managing deviceIds). Make sure the deviceId you set is sufficiently unique + * (we recommend something like a UUID - see src/uuid.js for an example of how to generate) to prevent conflicts with other devices in our system. + * @public + * @param {string} deviceId - custom deviceId for current user. + * @deprecated Please use amplitude.getInstance().setDeviceId(deviceId); + * @example amplitude.setDeviceId('45f0954f-eb79-4463-ac8a-233a6f45a8f0'); + */ + Amplitude.prototype.setDeviceId = function setDeviceId(deviceId) { + this.getInstance().setDeviceId(deviceId); + }; + + /** + * Sets user properties for the current user. + * @public + * @param {object} - object with string keys and values for the user properties to set. + * @param {boolean} - DEPRECATED opt_replace: in earlier versions of the JS SDK the user properties object was kept in + * memory and replace = true would replace the object in memory. Now the properties are no longer stored in memory, so replace is deprecated. + * @deprecated Please use amplitude.getInstance.setUserProperties(userProperties); + * @example amplitude.setUserProperties({'gender': 'female', 'sign_up_complete': true}) + */ + Amplitude.prototype.setUserProperties = function setUserProperties(userProperties) { + this.getInstance().setUserProperties(userProperties); + }; + + /** + * Clear all of the user properties for the current user. Note: clearing user properties is irreversible! + * @public + * @deprecated Please use amplitude.getInstance().clearUserProperties(); + * @example amplitude.clearUserProperties(); + */ + Amplitude.prototype.clearUserProperties = function clearUserProperties(){ + this.getInstance().clearUserProperties(); + }; + + /** + * Send an identify call containing user property operations to Amplitude servers. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#user-properties-and-user-property-operations} + * for more information on the Identify API and user property operations. + * @param {Identify} identify_obj - the Identify object containing the user property operations to send. + * @param {Amplitude~eventCallback} opt_callback - (optional) callback function to run when the identify event has been sent. + * Note: the server response code and response body from the identify event upload are passed to the callback function. + * @deprecated Please use amplitude.getInstance().identify(identify); + * @example + * var identify = new amplitude.Identify().set('colors', ['rose', 'gold']).add('karma', 1).setOnce('sign_up_date', '2016-03-31'); + * amplitude.identify(identify); + */ + Amplitude.prototype.identify = function(identify_obj, opt_callback) { + this.getInstance().identify(identify_obj, opt_callback); + }; + + /** + * Set a versionName for your application. + * @public + * @param {string} versionName - The version to set for your application. + * @deprecated Please use amplitude.getInstance().setVersionName(versionName); + * @example amplitude.setVersionName('1.12.3'); + */ + Amplitude.prototype.setVersionName = function setVersionName(versionName) { + this.getInstance().setVersionName(versionName); + }; + + /** + * This is the callback for logEvent and identify calls. It gets called after the event/identify is uploaded, + * and the server response code and response body from the upload request are passed to the callback function. + * @callback Amplitude~eventCallback + * @param {number} responseCode - Server response code for the event / identify upload request. + * @param {string} responseBody - Server response body for the event / identify upload request. + */ + + /** + * Log an event with eventType and eventProperties + * @public + * @param {string} eventType - name of event + * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. + * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. + * Note: the server response code and response body from the event upload are passed to the callback function. + * @deprecated Please use amplitude.getInstance().logEvent(eventType, eventProperties, opt_callback); + * @example amplitude.logEvent('Clicked Homepage Button', {'finished_flow': false, 'clicks': 15}); + */ + Amplitude.prototype.logEvent = function logEvent(eventType, eventProperties, opt_callback) { + return this.getInstance().logEvent(eventType, eventProperties, opt_callback); + }; + + /** + * Log an event with eventType, eventProperties, and groups. Use this to set event-level groups. + * Note: the group(s) set only apply for the specific event type being logged and does not persist on the user + * (unless you explicitly set it with setGroup). + * See the [SDK Readme]{@link https://github.com/amplitude/Amplitude-Javascript#setting-groups} for more information + * about groups and Count by Distinct on the Amplitude platform. + * @public + * @param {string} eventType - name of event + * @param {object} eventProperties - (optional) an object with string keys and values for the event properties. + * @param {object} groups - (optional) an object with string groupType: groupName values for the event being logged. + * groupName can be a string or an array of strings. + * @param {Amplitude~eventCallback} opt_callback - (optional) a callback function to run after the event is logged. + * Note: the server response code and response body from the event upload are passed to the callback function. + * Deprecated Please use amplitude.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); + * @example amplitude.logEventWithGroups('Clicked Button', null, {'orgId': 24}); + */ + Amplitude.prototype.logEventWithGroups = function(eventType, eventProperties, groups, opt_callback) { + return this.getInstance().logEventWithGroups(eventType, eventProperties, groups, opt_callback); + }; + + /** + * Log revenue with Revenue interface. The new revenue interface allows for more revenue fields like + * revenueType and event properties. + * See [Readme]{@link https://github.com/amplitude/Amplitude-Javascript#tracking-revenue} + * for more information on the Revenue interface and logging revenue. + * @public + * @param {Revenue} revenue_obj - the revenue object containing the revenue data being logged. + * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); + * @example var revenue = new amplitude.Revenue().setProductId('productIdentifier').setPrice(10.99); + * amplitude.logRevenueV2(revenue); + */ + Amplitude.prototype.logRevenueV2 = function logRevenueV2(revenue_obj) { + return this.getInstance().logRevenueV2(revenue_obj); + }; + + /** + * Log revenue event with a price, quantity, and product identifier. DEPRECATED - use logRevenueV2 + * @public + * @param {number} price - price of revenue event + * @param {number} quantity - (optional) quantity of products in revenue event. If no quantity specified default to 1. + * @param {string} product - (optional) product identifier + * @deprecated Please use amplitude.getInstance().logRevenueV2(revenue_obj); + * @example amplitude.logRevenue(3.99, 1, 'product_1234'); + */ + Amplitude.prototype.logRevenue = function logRevenue(price, quantity, product) { + return this.getInstance().logRevenue(price, quantity, product); + }; + + /** + * Remove events in storage with event ids up to and including maxEventId. + * @private + */ + Amplitude.prototype.removeEvents = function removeEvents(maxEventId, maxIdentifyId) { + this.getInstance().removeEvents(maxEventId, maxIdentifyId); + }; + + /** + * Send unsent events. Note: this is called automatically after events are logged if option batchEvents is false. + * If batchEvents is true, then events are only sent when batch criterias are met. + * @private + * @param {Amplitude~eventCallback} callback - (optional) callback to run after events are sent. + * Note the server response code and response body are passed to the callback as input arguments. + */ + Amplitude.prototype.sendEvents = function sendEvents(callback) { + this.getInstance().sendEvents(callback); + }; + + /** + * Set global user properties. Note this is deprecated, and we recommend using setUserProperties + * @public + * @deprecated + */ + Amplitude.prototype.setGlobalUserProperties = function setGlobalUserProperties(userProperties) { + this.getInstance().setUserProperties(userProperties); + }; +} /** * Get the current version of Amplitude's Javascript SDK. diff --git a/src/base-cookie.js b/src/base-cookie.js new file mode 100644 index 00000000..804ff955 --- /dev/null +++ b/src/base-cookie.js @@ -0,0 +1,48 @@ +const get = (name) => { + try { + var ca = document.cookie.split(';'); + var value = null; + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + if (c.indexOf(name) === 0) { + value = c.substring(name.length, c.length); + break; + } + } + + return value; + + } catch (e) { + return null; + } +}; + + +const set = (name, value, opts) => { + var expires = value !== null ? opts.expirationDays : -1 ; + if (expires) { + var date = new Date(); + date.setTime(date.getTime() + (expires * 24 * 60 * 60 * 1000)); + expires = date; + } + var str = name + '=' + value; + if (expires) { + str += '; expires=' + expires.toUTCString(); + } + str += '; path=/'; + if (opts.domain) { + str += '; domain=' + opts.domain; + } + if (opts.secure) { + str += '; Secure'; + } + document.cookie = str; +}; + +export default { + set, + get, +}; diff --git a/src/cookie.js b/src/cookie.js index 25c1525b..c62c4da4 100644 --- a/src/cookie.js +++ b/src/cookie.js @@ -3,8 +3,9 @@ */ import Base64 from './base64'; -import topDomain from '@segment/top-domain'; import utils from './utils'; +import getLocation from './get-location'; +import baseCookie from './base-cookie'; var _options = { @@ -20,6 +21,45 @@ var reset = function() { }; }; +const getHost = (url) => { + const a = document.createElement('a'); + a.href = url; + return a.hostname || location.hostname; +}; + +const topDomain = (url) => { + const host = getHost(url); + const parts = host.split('.'); + const last = parts[parts.length - 1]; + const levels = []; + + if (parts.length === 4 && last === parseInt(last, 10)) { + return levels; + } + + if (parts.length <= 1) { + return levels; + } + + for (let i = parts.length - 2; i >= 0; --i) { + levels.push(parts.slice(i).join('.')); + } + + for (let i = 0; i < levels.length; ++i) { + const cname = '__tld_test__'; + const domain = levels[i]; + const opts = { domain: '.' + domain }; + + baseCookie.set(cname, 1, opts); + if (baseCookie.get(cname)) { + baseCookie.set(cname, null, opts); + return domain; + } + } + + return ''; +}; + var options = function(opts) { if (arguments.length === 0) { @@ -29,8 +69,9 @@ var options = function(opts) { opts = opts || {}; _options.expirationDays = opts.expirationDays; + _options.secure = opts.secure; - var domain = (!utils.isEmptyString(opts.domain)) ? opts.domain : '.' + topDomain(window.location.href); + var domain = (!utils.isEmptyString(opts.domain)) ? opts.domain : '.' + topDomain(getLocation().href); var token = Math.random(); _options.domain = domain; set('amplitude_test', token); @@ -40,6 +81,8 @@ var options = function(opts) { } remove('amplitude_test'); _options.domain = domain; + + return _options; }; var _domainSpecific = function(name) { @@ -53,34 +96,24 @@ var _domainSpecific = function(name) { var get = function(name) { - try { - var nameEq = _domainSpecific(name) + '='; - var ca = document.cookie.split(';'); - var value = null; - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) === ' ') { - c = c.substring(1, c.length); - } - if (c.indexOf(nameEq) === 0) { - value = c.substring(nameEq.length, c.length); - break; - } - } + var nameEq = _domainSpecific(name) + '='; + const value = baseCookie.get(nameEq); + try { if (value) { return JSON.parse(Base64.decode(value)); } - return null; } catch (e) { return null; } + + return null; }; var set = function(name, value) { try { - _set(_domainSpecific(name), Base64.encode(JSON.stringify(value)), _options); + baseCookie.set(_domainSpecific(name), Base64.encode(JSON.stringify(value)), _options); return true; } catch (e) { return false; @@ -88,28 +121,9 @@ var set = function(name, value) { }; -var _set = function(name, value, opts) { - var expires = value !== null ? opts.expirationDays : -1 ; - if (expires) { - var date = new Date(); - date.setTime(date.getTime() + (expires * 24 * 60 * 60 * 1000)); - expires = date; - } - var str = name + '=' + value; - if (expires) { - str += '; expires=' + expires.toUTCString(); - } - str += '; path=/'; - if (opts.domain) { - str += '; domain=' + opts.domain; - } - document.cookie = str; -}; - - var remove = function(name) { try { - _set(_domainSpecific(name), null, _options); + baseCookie.set(_domainSpecific(name), null, _options); return true; } catch (e) { return false; @@ -123,5 +137,4 @@ export default { get: get, set: set, remove: remove - }; diff --git a/src/cookiestorage.js b/src/cookiestorage.js index a4206956..5ef9feea 100644 --- a/src/cookiestorage.js +++ b/src/cookiestorage.js @@ -42,12 +42,14 @@ cookieStorage.prototype.getStorage = function() { this.storage = { _options: { expirationDays: undefined, - domain: undefined + domain: undefined, + secure: false, }, reset: function() { this._options = { expirationDays: undefined, - domain: undefined + domain: undefined, + secure: false, }; }, options: function(opts) { @@ -58,7 +60,7 @@ cookieStorage.prototype.getStorage = function() { this._options.expirationDays = opts.expirationDays || this._options.expirationDays; // localStorage is specific to subdomains this._options.domain = opts.domain || this._options.domain || window.location.hostname; - return this._options; + return this._options.secure = opts.secure || false; }, get: function(name) { try { diff --git a/src/get-location.js b/src/get-location.js new file mode 100644 index 00000000..0b8457f1 --- /dev/null +++ b/src/get-location.js @@ -0,0 +1,5 @@ +const getLocation = () => { + return window.location; +}; + +export default getLocation; diff --git a/src/index.compat.js b/src/index.compat.js new file mode 100644 index 00000000..3e3ba40e --- /dev/null +++ b/src/index.compat.js @@ -0,0 +1,2 @@ +import 'json3'; +export {default} from './index'; diff --git a/src/index.js b/src/index.js index c157d125..3a542369 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,4 @@ /* jshint expr:true */ -import 'json3'; import Amplitude from './amplitude'; var old = window.amplitude || {}; diff --git a/src/localstorage.js b/src/localstorage.js index 0a4a4592..9f59fbfc 100644 --- a/src/localstorage.js +++ b/src/localstorage.js @@ -3,99 +3,106 @@ /* * Implement localStorage to support Firefox 2-3 and IE 5-7 */ -var localStorage; // jshint ignore:line -// test that Window.localStorage is available and works -function windowLocalStorageAvailable() { - var uid = new Date(); - var result; - try { - window.localStorage.setItem(uid, uid); - result = window.localStorage.getItem(uid) === String(uid); - window.localStorage.removeItem(uid); - return result; - } catch (e) { - // localStorage not available - } - return false; +if (!BUILD_COMPAT_LOCAL_STORAGE) { + localStorage = window.localStorage; } -if (windowLocalStorageAvailable()) { - localStorage = window.localStorage; -} else if (window.globalStorage) { - // Firefox 2-3 use globalStorage - // See https://developer.mozilla.org/en/dom/storage#globalStorage - try { - localStorage = window.globalStorage[window.location.hostname]; - } catch (e) { - // Something bad happened... +if (BUILD_COMPAT_LOCAL_STORAGE) { + var localStorage; // jshint ignore:line + + // test that Window.localStorage is available and works + const windowLocalStorageAvailable = () => { + var uid = new Date(); + var result; + try { + window.localStorage.setItem(uid, uid); + result = window.localStorage.getItem(uid) === String(uid); + window.localStorage.removeItem(uid); + return result; + } catch (e) { + // localStorage not available + } + return false; + }; + + if (windowLocalStorageAvailable()) { + localStorage = window.localStorage; + } else if (window.globalStorage) { + // Firefox 2-3 use globalStorage + // See https://developer.mozilla.org/en/dom/storage#globalStorage + try { + localStorage = window.globalStorage[window.location.hostname]; + } catch (e) { + // Something bad happened... + } + } else { + // IE 5-7 use userData + // See http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx + var div = document.createElement('div'), + attrKey = 'localStorage'; + div.style.display = 'none'; + document.getElementsByTagName('head')[0].appendChild(div); + if (div.addBehavior) { + div.addBehavior('#default#userdata'); + localStorage = { + length: 0, + setItem: function(k, v) { + div.load(attrKey); + if (!div.getAttribute(k)) { + this.length++; + } + div.setAttribute(k, v); + div.save(attrKey); + }, + getItem: function(k) { + div.load(attrKey); + return div.getAttribute(k); + }, + removeItem: function(k) { + div.load(attrKey); + if (div.getAttribute(k)) { + this.length--; + } + div.removeAttribute(k); + div.save(attrKey); + }, + clear: function() { + div.load(attrKey); + var i = 0; + var attr; + while (attr = div.XMLDocument.documentElement.attributes[i++]) { + div.removeAttribute(attr.name); + } + div.save(attrKey); + this.length = 0; + }, + key: function(k) { + div.load(attrKey); + return div.XMLDocument.documentElement.attributes[k]; + } + }; + div.load(attrKey); + localStorage.length = div.XMLDocument.documentElement.attributes.length; + } else { + /* Nothing we can do ... */ + } } -} else { - // IE 5-7 use userData - // See http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx - var div = document.createElement('div'), - attrKey = 'localStorage'; - div.style.display = 'none'; - document.getElementsByTagName('head')[0].appendChild(div); - if (div.addBehavior) { - div.addBehavior('#default#userdata'); + if (!localStorage) { localStorage = { length: 0, setItem: function(k, v) { - div.load(attrKey); - if (!div.getAttribute(k)) { - this.length++; - } - div.setAttribute(k, v); - div.save(attrKey); }, getItem: function(k) { - div.load(attrKey); - return div.getAttribute(k); }, removeItem: function(k) { - div.load(attrKey); - if (div.getAttribute(k)) { - this.length--; - } - div.removeAttribute(k); - div.save(attrKey); }, clear: function() { - div.load(attrKey); - var i = 0; - var attr; - while (attr = div.XMLDocument.documentElement.attributes[i++]) { - div.removeAttribute(attr.name); - } - div.save(attrKey); - this.length = 0; }, key: function(k) { - div.load(attrKey); - return div.XMLDocument.documentElement.attributes[k]; } }; - div.load(attrKey); - localStorage.length = div.XMLDocument.documentElement.attributes.length; - } else { - /* Nothing we can do ... */ } } -if (!localStorage) { - localStorage = { - length: 0, - setItem: function(k, v) { - }, - getItem: function(k) { - }, - removeItem: function(k) { - }, - clear: function() { - }, - key: function(k) { - } - }; -} export default localStorage; diff --git a/src/options.js b/src/options.js index de73cab3..559c1bdb 100644 --- a/src/options.js +++ b/src/options.js @@ -21,6 +21,7 @@ export default { savedMaxCount: 1000, saveEvents: true, saveParamsReferrerOncePerSession: true, + secureCookie: false, sessionTimeout: 30 * 60 * 1000, trackingOptions: { city: true, diff --git a/src/version.js b/src/version.js index 5ca8fc85..21421399 100644 --- a/src/version.js +++ b/src/version.js @@ -1 +1 @@ -export default '4.5.2'; +export default '4.6.0'; diff --git a/src/xhr.js b/src/xhr.js index 35993bdf..ff8a6999 100644 --- a/src/xhr.js +++ b/src/xhr.js @@ -1,4 +1,4 @@ -import querystring from 'querystring'; +import queryString from 'query-string'; /* * Simple AJAX request object @@ -26,7 +26,7 @@ Request.prototype.send = function(callback) { }; xdr.ontimeout = function () {}; xdr.onprogress = function() {}; - xdr.send(querystring.stringify(this.data)); + xdr.send(queryString.stringify(this.data)); } else { var xhr = new XMLHttpRequest(); xhr.open('POST', this.url, true); @@ -36,7 +36,7 @@ Request.prototype.send = function(callback) { } }; xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - xhr.send(querystring.stringify(this.data)); + xhr.send(queryString.stringify(this.data)); } //log('sent request to ' + this.url + ' with data ' + decodeURIComponent(queryString(this.data))); }; diff --git a/test/amplitude-client.js b/test/amplitude-client.js index da320775..5720f05b 100644 --- a/test/amplitude-client.js +++ b/test/amplitude-client.js @@ -5,7 +5,7 @@ import CookieStorage from '../src/cookiestorage.js'; import Base64 from '../src/base64.js'; import cookie from '../src/cookie.js'; import utils from '../src/utils.js'; -import querystring from 'querystring'; +import queryString from 'query-string'; import Identify from '../src/identify.js'; import Revenue from '../src/revenue.js'; import constants from '../src/constants.js'; @@ -606,7 +606,7 @@ describe('AmplitudeClient', function() { // check request assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.equal(events[0].event_id, 49); assert.equal(events[1].event_type, '$identify'); @@ -642,7 +642,7 @@ it ('should load saved events from localStorage new keys and send events', funct // check request assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.equal(events[0].event_id, 49); assert.equal(events[1].event_type, '$identify'); @@ -796,7 +796,7 @@ it ('should load saved events from localStorage new keys and send events', funct assert.equal(amplitude.options.userId, userId); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, eventType); @@ -821,7 +821,7 @@ it ('should load saved events from localStorage new keys and send events', funct assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -853,7 +853,7 @@ it ('should load saved events from localStorage new keys and send events', funct assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -878,7 +878,7 @@ it ('should load saved events from localStorage new keys and send events', funct it('should generate an identify event with groups set', function() { amplitude.setGroup('orgId', 15); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify identify event @@ -1051,7 +1051,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -1102,7 +1102,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -1219,7 +1219,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$groupidentify'); assert.deepEqual(events[0].event_properties, {}); @@ -1272,7 +1272,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 1); assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$groupidentify'); assert.deepEqual(events[0].event_properties, {}); @@ -1375,7 +1375,7 @@ describe('setVersionName', function() { assert.equal(amplitude.options.trackingOptions.platform, false); amplitude.logEvent('Event Type 1'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].language, null); assert.equal(events[0].platform, null); }); @@ -1383,7 +1383,7 @@ describe('setVersionName', function() { it('should send trackingOptions in api properties', function() { amplitude.logEvent('Event Type 2'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); // verify country is not sent since it matches the default value of true assert.deepEqual(events[0].api_properties, { @@ -1444,19 +1444,19 @@ describe('setVersionName', function() { it('should send api key', function() { amplitude.logEvent('Event Type 2'); assert.lengthOf(server.requests, 1); - assert.equal(querystring.parse(server.requests[0].requestBody).client, apiKey); + assert.equal(queryString.parse(server.requests[0].requestBody).client, apiKey); }); it('should send api version', function() { amplitude.logEvent('Event Type 3'); assert.lengthOf(server.requests, 1); - assert.equal(querystring.parse(server.requests[0].requestBody).v, '2'); + assert.equal(queryString.parse(server.requests[0].requestBody).v, '2'); }); it('should send event JSON', function() { amplitude.logEvent('Event Type 4'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.equal(events[0].event_type, 'Event Type 4'); }); @@ -1464,7 +1464,7 @@ describe('setVersionName', function() { it('should send language', function() { amplitude.logEvent('Event Should Send Language'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.isNotNull(events[0].language); }); @@ -1472,7 +1472,7 @@ describe('setVersionName', function() { it('should not send trackingOptions in api properties', function() { amplitude.logEvent('Event Should Not Send Tracking Properties'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.deepEqual(events[0].api_properties, {}); }); @@ -1480,7 +1480,7 @@ describe('setVersionName', function() { it('should send platform', function() { amplitude.logEvent('Event Should Send Platform'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.equal(events[0].platform, 'Web'); }); @@ -1488,7 +1488,7 @@ describe('setVersionName', function() { it('should accept properties', function() { amplitude.logEvent('Event Type 5', {prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.deepEqual(events[0].event_properties, {prop: true}); }); @@ -1502,7 +1502,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 4); assert.deepEqual(events[0].event_properties, {index: 1}); assert.deepEqual(events[3].event_properties, {index: 100}); @@ -1520,7 +1520,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 6}); assert.deepEqual(events[9].event_properties, {index: 100}); @@ -1539,7 +1539,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 4}); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_properties, {index: 4}); }); @@ -1578,7 +1578,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1587,7 +1587,7 @@ describe('setVersionName', function() { server.respond(); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 6); assert.deepEqual(events[0].event_properties, {index: 10}); assert.deepEqual(events[5].event_properties, {index: 100}); @@ -1606,7 +1606,7 @@ describe('setVersionName', function() { } assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1625,7 +1625,7 @@ describe('setVersionName', function() { server.respondWith('success'); server.respond(); assert.lengthOf(amplitude._unsentEvents, 0); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[4].event_properties, {index: 14}); }); @@ -1648,7 +1648,7 @@ describe('setVersionName', function() { assert.lengthOf(server.requests, 1); server.respondWith('success'); server.respond(); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_type, 'Event'); }); @@ -1668,7 +1668,7 @@ describe('setVersionName', function() { assert.lengthOf(server.requests, 1); server.respondWith('success'); server.respond(); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.deepEqual(events[1].event_type, 'Event2'); @@ -1724,7 +1724,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1733,7 +1733,7 @@ describe('setVersionName', function() { server.respond(); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[4].event_properties, {index: 4}); @@ -1755,7 +1755,7 @@ describe('setVersionName', function() { server.respond(); } - var events = JSON.parse(querystring.parse(server.requests[6].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[6].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_properties, {index: 2}); }); @@ -1909,7 +1909,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}, callback); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 16); // after 413 response received, callback should not have fired @@ -1921,7 +1921,7 @@ describe('setVersionName', function() { // after sending first backoff batch, callback still should not have fired assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 8); server.respondWith('success'); server.respond(); @@ -1931,7 +1931,7 @@ describe('setVersionName', function() { // after sending second backoff batch, callback should fire assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 8); server.respondWith('success'); server.respond(); @@ -1974,7 +1974,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 3); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); for (var i = 0; i < 3; i++) { assert.equal(events[i].event_type, '$identify'); @@ -2007,7 +2007,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 0); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); for (var i = 0; i < 3; i++) { assert.equal(events[i].event_type, 'test'); @@ -2037,7 +2037,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); // event should come before identify - maintain order using sequence number @@ -2082,7 +2082,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 2); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 6); // verify the correct coalescing @@ -2134,7 +2134,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentIdentifys, 2); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); // event should come before identify - prioritize events with no sequence number @@ -2186,7 +2186,7 @@ describe('setVersionName', function() { assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[2].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[2].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.isTrue('$add' in events[0].user_properties); @@ -2216,7 +2216,7 @@ describe('setVersionName', function() { assert.equal(amplitude._unsentCount(), 1); assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[2].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[2].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, 'test'); assert.deepEqual(events[0].user_properties, {}); @@ -2225,7 +2225,7 @@ describe('setVersionName', function() { it('should truncate long event property strings', function() { var longString = new Array(5000).join('a'); amplitude.logEvent('test', {'key': longString}); - var event = JSON.parse(querystring.parse(server.requests[0].requestBody).e)[0]; + var event = JSON.parse(queryString.parse(server.requests[0].requestBody).e)[0]; assert.isTrue('key' in event.event_properties); assert.lengthOf(event.event_properties['key'], 4096); @@ -2234,7 +2234,7 @@ describe('setVersionName', function() { it('should truncate long user property strings', function() { var longString = new Array(5000).join('a'); amplitude.identify(new Identify().set('key', longString)); - var event = JSON.parse(querystring.parse(server.requests[0].requestBody).e)[0]; + var event = JSON.parse(queryString.parse(server.requests[0].requestBody).e)[0]; assert.isTrue('$set' in event.user_properties); assert.lengthOf(event.user_properties['$set']['key'], 4096); @@ -2298,7 +2298,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude._unsentEvents, 5); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[0].event_properties, {}); @@ -2346,7 +2346,7 @@ describe('setVersionName', function() { amplitude.identify(identify); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.equal(events[0].event_type, 'test event'); @@ -2405,7 +2405,7 @@ describe('setVersionName', function() { amplitude.logEventWithGroups('Test', eventProperties, groups, callback); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify event is correctly formatted @@ -2438,7 +2438,7 @@ describe('setVersionName', function() { // log an event and verify UA field is filled out amplitude.logEvent('testEvent'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, 'testEvent'); assert.isTrue(events[0].user_agent.indexOf(userAgentString) > -1); @@ -2448,7 +2448,7 @@ describe('setVersionName', function() { var timestamp = 2000; amplitude.logEventWithTimestamp('test', null, timestamp, null); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify the event is correct @@ -2463,7 +2463,7 @@ describe('setVersionName', function() { clock.tick(timestamp); amplitude.logEventWithTimestamp('test', null, null, null); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify the event is correct @@ -2478,7 +2478,7 @@ describe('setVersionName', function() { clock.tick(timestamp); amplitude.logEventWithTimestamp('test', null, 'invalid', null); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify the event is correct @@ -2523,7 +2523,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event Type 1'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); }); @@ -2550,7 +2550,7 @@ describe('setVersionName', function() { amplitude.identify(new Identify().add('test', 100)); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].user_properties, {$add: {'test': 6}}); assert.deepEqual(events[9].user_properties, {$add: {'test': 100}}); @@ -2579,7 +2579,7 @@ describe('setVersionName', function() { amplitude.setUserProperties({user_prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].user_properties.utm_campaign, undefined); assert.equal(events[0].user_properties.utm_content, undefined); assert.equal(events[0].user_properties.utm_medium, undefined); @@ -2596,7 +2596,7 @@ describe('setVersionName', function() { amplitude.logEvent('UTM Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2629,7 +2629,7 @@ describe('setVersionName', function() { } assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2646,7 +2646,7 @@ describe('setVersionName', function() { amplitude.logEvent('UTM Test Event', {}); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.deepEqual(events[0].user_properties, {}); }); @@ -2667,7 +2667,7 @@ describe('setVersionName', function() { amplitude.logEvent('UTM Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2691,7 +2691,7 @@ describe('setVersionName', function() { // even though same session, utm params are sent again assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2724,8 +2724,8 @@ describe('setVersionName', function() { server.respondWith('success'); server.respond(); - var firstSessionEvents = JSON.parse(querystring.parse(server.requests[0].requestBody).e); - var secondSessionEvents = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var firstSessionEvents = JSON.parse(queryString.parse(server.requests[0].requestBody).e); + var secondSessionEvents = JSON.parse(queryString.parse(server.requests[1].requestBody).e); var firstSessionInit = firstSessionEvents[0]; var secondSessionInit = secondSessionEvents[0]; var secondSessionEvent = secondSessionEvents[1]; @@ -2784,8 +2784,8 @@ describe('setVersionName', function() { server.respond(); amplitude._getUrlParams.restore(); - var firstSessionEvents = JSON.parse(querystring.parse(server.requests[0].requestBody).e); - var secondSessionEvents = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var firstSessionEvents = JSON.parse(queryString.parse(server.requests[0].requestBody).e); + var secondSessionEvents = JSON.parse(queryString.parse(server.requests[1].requestBody).e); var firstSessionInit = firstSessionEvents[0]; var secondSessionInit = secondSessionEvents[0]; var secondSessionEvent = secondSessionEvents[1]; @@ -2858,7 +2858,7 @@ describe('setVersionName', function() { amplitude.setUserProperties({user_prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].user_properties.referrer, undefined); assert.equal(events[0].user_properties.referring_domain, undefined); }); @@ -2868,7 +2868,7 @@ describe('setVersionName', function() { amplitude.init(apiKey, undefined, {includeReferrer: true, batchEvents: true, eventUploadThreshold: 2}); amplitude.logEvent('Referrer Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); // first event should be identify with initial_referrer and referrer @@ -2902,7 +2902,7 @@ describe('setVersionName', function() { amplitude.init(apiKey, undefined, {includeReferrer: true, batchEvents: true, eventUploadThreshold: 2}); amplitude.logEvent('Referrer Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); // first event should be identify with initial_referrer and referrer @@ -2928,7 +2928,7 @@ describe('setVersionName', function() { // even though session is same, referrer is sent again assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { @@ -2964,7 +2964,7 @@ describe('setVersionName', function() { }); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); // validate the events @@ -3013,7 +3013,7 @@ describe('setVersionName', function() { amplitude.init(apiKey, undefined, {includeGclid: true, batchEvents: true, eventUploadThreshold: 2}); amplitude.logEvent('Gclid test event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); // first event should be identify with gclid @@ -3033,7 +3033,7 @@ describe('setVersionName', function() { // even though session is same, gclid is sent again assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { @@ -3058,7 +3058,7 @@ describe('setVersionName', function() { */ function revenueEqual(api, event) { assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.deepEqual(events[0].api_properties, api || {}); assert.deepEqual(events[0].event_properties, event || {}); } @@ -3132,7 +3132,7 @@ describe('setVersionName', function() { amplitude.logRevenueV2(revenue); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); var event = events[0]; assert.equal(event.event_type, 'revenue_amount'); @@ -3169,7 +3169,7 @@ describe('setVersionName', function() { ]}; amplitude.logRevenueV2(proxyRevenue); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); var event = events[0]; assert.equal(event.event_type, 'revenue_amount'); @@ -3200,7 +3200,7 @@ describe('setVersionName', function() { clock.tick(30 * 60 * 1000 + 1); amplitude.logEvent('Event Type 1'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.notEqual(events[0].session_id, sessionId); assert.notEqual(amplitude._sessionId, sessionId); diff --git a/test/amplitude.js b/test/amplitude.js index 00526c13..300f90f3 100644 --- a/test/amplitude.js +++ b/test/amplitude.js @@ -5,7 +5,7 @@ import CookieStorage from '../src/cookiestorage.js'; import Base64 from '../src/base64.js'; import cookie from '../src/cookie.js'; import utils from '../src/utils.js'; -import querystring from 'querystring'; +import queryString from 'query-string'; import Identify from '../src/identify.js'; import Revenue from '../src/revenue.js'; @@ -152,8 +152,8 @@ describe('Amplitude', function() { // verify separate apiKeys in server requests assert.lengthOf(server.requests, 3); - assert.equal(JSON.parse(querystring.parse(server.requests[1].requestBody).client), 1); - assert.equal(JSON.parse(querystring.parse(server.requests[2].requestBody).client), 2); + assert.equal(JSON.parse(queryString.parse(server.requests[1].requestBody).client), 1); + assert.equal(JSON.parse(queryString.parse(server.requests[2].requestBody).client), 2); // verify separate cookie data var cookieData = cookie.get(amplitude.options.cookieName + '_' + apiKey); @@ -638,7 +638,7 @@ describe('Amplitude', function() { // check request assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.equal(events[0].event_id, 49); assert.equal(events[1].event_type, '$identify'); @@ -714,7 +714,7 @@ describe('Amplitude', function() { assert.equal(amplitude.options.userId, userId); assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, eventType); @@ -739,7 +739,7 @@ describe('Amplitude', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 1); assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -771,7 +771,7 @@ describe('Amplitude', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 1); assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -796,7 +796,7 @@ describe('Amplitude', function() { it('should generate an identify event with groups set', function() { amplitude.setGroup('orgId', 15); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify identify event @@ -944,7 +944,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 1); assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -995,7 +995,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 1); assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].event_properties, {}); @@ -1118,19 +1118,19 @@ describe('setVersionName', function() { it('should send api key', function() { amplitude.logEvent('Event Type 2'); assert.lengthOf(server.requests, 1); - assert.equal(querystring.parse(server.requests[0].requestBody).client, apiKey); + assert.equal(queryString.parse(server.requests[0].requestBody).client, apiKey); }); it('should send api version', function() { amplitude.logEvent('Event Type 3'); assert.lengthOf(server.requests, 1); - assert.equal(querystring.parse(server.requests[0].requestBody).v, '2'); + assert.equal(queryString.parse(server.requests[0].requestBody).v, '2'); }); it('should send event JSON', function() { amplitude.logEvent('Event Type 4'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.equal(events[0].event_type, 'Event Type 4'); }); @@ -1138,7 +1138,7 @@ describe('setVersionName', function() { it('should send language', function() { amplitude.logEvent('Event Should Send Language'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.isNotNull(events[0].language); }); @@ -1146,7 +1146,7 @@ describe('setVersionName', function() { it('should accept properties', function() { amplitude.logEvent('Event Type 5', {prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.deepEqual(events[0].event_properties, {prop: true}); }); @@ -1160,7 +1160,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 4); assert.deepEqual(events[0].event_properties, {index: 1}); assert.deepEqual(events[3].event_properties, {index: 100}); @@ -1178,7 +1178,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 6}); assert.deepEqual(events[9].event_properties, {index: 100}); @@ -1197,7 +1197,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 4}); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_properties, {index: 4}); }); @@ -1236,7 +1236,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1245,7 +1245,7 @@ describe('setVersionName', function() { server.respond(); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 6); assert.deepEqual(events[0].event_properties, {index: 10}); assert.deepEqual(events[5].event_properties, {index: 100}); @@ -1264,7 +1264,7 @@ describe('setVersionName', function() { } assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1283,7 +1283,7 @@ describe('setVersionName', function() { server.respondWith('success'); server.respond(); assert.lengthOf(amplitude.getInstance()._unsentEvents, 0); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[4].event_properties, {index: 14}); }); @@ -1306,7 +1306,7 @@ describe('setVersionName', function() { assert.lengthOf(server.requests, 1); server.respondWith('success'); server.respond(); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_type, 'Event'); }); @@ -1326,7 +1326,7 @@ describe('setVersionName', function() { assert.lengthOf(server.requests, 1); server.respondWith('success'); server.respond(); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); assert.deepEqual(events[1].event_type, 'Event2'); @@ -1382,7 +1382,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[9].event_properties, {index: 9}); @@ -1391,7 +1391,7 @@ describe('setVersionName', function() { server.respond(); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[0].event_properties, {index: 0}); assert.deepEqual(events[4].event_properties, {index: 4}); @@ -1413,7 +1413,7 @@ describe('setVersionName', function() { server.respond(); } - var events = JSON.parse(querystring.parse(server.requests[6].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[6].requestBody).e); assert.lengthOf(events, 1); assert.deepEqual(events[0].event_properties, {index: 2}); }); @@ -1567,7 +1567,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event', {index: 100}, callback); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 16); // after 413 response received, callback should not have fired @@ -1579,7 +1579,7 @@ describe('setVersionName', function() { // after sending first backoff batch, callback still should not have fired assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 8); server.respondWith('success'); server.respond(); @@ -1589,7 +1589,7 @@ describe('setVersionName', function() { // after sending second backoff batch, callback should fire assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.lengthOf(events, 8); server.respondWith('success'); server.respond(); @@ -1632,7 +1632,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 3); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); for (var i = 0; i < 3; i++) { assert.equal(events[i].event_type, '$identify'); @@ -1665,7 +1665,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 0); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); for (var i = 0; i < 3; i++) { assert.equal(events[i].event_type, 'test'); @@ -1695,7 +1695,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 1); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); // event should come before identify - maintain order using sequence number @@ -1740,7 +1740,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 2); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 6); // verify the correct coalescing @@ -1792,7 +1792,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentIdentifys, 2); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 3); // event should come before identify - prioritize events with no sequence number @@ -1844,7 +1844,7 @@ describe('setVersionName', function() { assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[2].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[2].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, '$identify'); assert.isTrue('$add' in events[0].user_properties); @@ -1874,7 +1874,7 @@ describe('setVersionName', function() { assert.equal(amplitude.getInstance()._unsentCount(), 1); assert.lengthOf(server.requests, 3); - var events = JSON.parse(querystring.parse(server.requests[2].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[2].requestBody).e); assert.lengthOf(events, 1); assert.equal(events[0].event_type, 'test'); assert.deepEqual(events[0].user_properties, {}); @@ -1883,7 +1883,7 @@ describe('setVersionName', function() { it('should truncate long event property strings', function() { var longString = new Array(5000).join('a'); amplitude.logEvent('test', {'key': longString}); - var event = JSON.parse(querystring.parse(server.requests[0].requestBody).e)[0]; + var event = JSON.parse(queryString.parse(server.requests[0].requestBody).e)[0]; assert.isTrue('key' in event.event_properties); assert.lengthOf(event.event_properties['key'], 4096); @@ -1892,7 +1892,7 @@ describe('setVersionName', function() { it('should truncate long user property strings', function() { var longString = new Array(5000).join('a'); amplitude.identify(new Identify().set('key', longString)); - var event = JSON.parse(querystring.parse(server.requests[0].requestBody).e)[0]; + var event = JSON.parse(queryString.parse(server.requests[0].requestBody).e)[0]; assert.isTrue('$set' in event.user_properties); assert.lengthOf(event.user_properties['$set']['key'], 4096); @@ -1956,7 +1956,7 @@ describe('setVersionName', function() { assert.lengthOf(amplitude.getInstance()._unsentEvents, 5); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 5); assert.deepEqual(events[0].event_properties, {}); @@ -2031,7 +2031,7 @@ describe('setVersionName', function() { amplitude.logEventWithGroups('Test', eventProperties, groups, callback); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); // verify event is correctly formatted @@ -2091,7 +2091,7 @@ describe('setVersionName', function() { amplitude.logEvent('Event Type 1'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 1); }); @@ -2118,7 +2118,7 @@ describe('setVersionName', function() { amplitude.identify(new Identify().add('test', 100)); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 10); assert.deepEqual(events[0].user_properties, {$add: {'test': 6}}); assert.deepEqual(events[9].user_properties, {$add: {'test': 100}}); @@ -2145,7 +2145,7 @@ describe('setVersionName', function() { amplitude.setUserProperties({user_prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].user_properties.utm_campaign, undefined); assert.equal(events[0].user_properties.utm_content, undefined); assert.equal(events[0].user_properties.utm_medium, undefined); @@ -2162,7 +2162,7 @@ describe('setVersionName', function() { amplitude.logEvent('UTM Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2195,7 +2195,7 @@ describe('setVersionName', function() { } assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].event_type, '$identify'); assert.deepEqual(events[0].user_properties, { '$setOnce': { @@ -2212,7 +2212,7 @@ describe('setVersionName', function() { amplitude.logEvent('UTM Test Event', {}); assert.lengthOf(server.requests, 2); - var events = JSON.parse(querystring.parse(server.requests[1].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[1].requestBody).e); assert.deepEqual(events[0].user_properties, {}); }); }); @@ -2237,7 +2237,7 @@ describe('setVersionName', function() { amplitude.setUserProperties({user_prop: true}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events[0].user_properties.referrer, undefined); assert.equal(events[0].user_properties.referring_domain, undefined); }); @@ -2248,7 +2248,7 @@ describe('setVersionName', function() { amplitude.init(apiKey, undefined, {includeReferrer: true, batchEvents: true, eventUploadThreshold: 2}); amplitude.logEvent('Referrer Test Event', {}); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.lengthOf(events, 2); var expected = { @@ -2287,7 +2287,7 @@ describe('setVersionName', function() { */ function revenueEqual(api, event) { assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.deepEqual(events[0].api_properties, api || {}); assert.deepEqual(events[0].event_properties, event || {}); } @@ -2361,7 +2361,7 @@ describe('setVersionName', function() { amplitude.logRevenueV2(revenue); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); var event = events[0]; assert.equal(event.event_type, 'revenue_amount'); @@ -2398,7 +2398,7 @@ describe('setVersionName', function() { ]}; amplitude.logRevenueV2(proxyRevenue); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); var event = events[0]; assert.equal(event.event_type, 'revenue_amount'); @@ -2428,7 +2428,7 @@ describe('setVersionName', function() { clock.tick(30 * 60 * 1000 + 1); amplitude.logEvent('Event Type 1'); assert.lengthOf(server.requests, 1); - var events = JSON.parse(querystring.parse(server.requests[0].requestBody).e); + var events = JSON.parse(queryString.parse(server.requests[0].requestBody).e); assert.equal(events.length, 1); assert.notEqual(events[0].session_id, sessionId); assert.notEqual(amplitude.getInstance()._sessionId, sessionId); diff --git a/test/browser/server.js b/test/browser/server.js index f3ff21ba..4b5a266a 100644 --- a/test/browser/server.js +++ b/test/browser/server.js @@ -1,7 +1,22 @@ -var express = require('express'); -var server = express(); +const express = require('express'); +const https = require('https'); +const fs = require('fs'); -server.use(express.static(__dirname + '/../..')); -var port = 9000; -server.listen(port); +const port = 9000; +const httpsPort = 9001; + +const app = express(); +app.use(express.static(__dirname + '/../..')); +app.use(express.static(__dirname)); +app.listen(port); console.log('Listening on port ' + port + '...'); + +if (!!process.env.USE_SSL) { + const options = { + key: fs.readFileSync(`${__dirname}/wildcard.amplidev.com.key`), + cert: fs.readFileSync(`${__dirname}/wildcard.amplidev.com.crt`) + }; + https.createServer(options, app).listen(httpsPort); + console.log(`Listening with https on port ${httpsPort}...`); +} + diff --git a/test/cookie.js b/test/cookie.js index be9d3956..bd60b6de 100644 --- a/test/cookie.js +++ b/test/cookie.js @@ -1,4 +1,6 @@ import cookie from '../src/cookie.js'; +import baseCookie from '../src/base-cookie'; +import getLocation from '../src/get-location'; describe('Cookie', function() { @@ -44,11 +46,5 @@ describe('Cookie', function() { cookie.options({ expirationDays: 365 }); assert.equal(cookie.options().expirationDays, 365); }); - - it('should fallback to no domain when it cant set the test cookie', function(){ - cookie.options({ domain: 'xyz.com' }); - assert.isNull(cookie.options().domain); - assert.isNull(cookie.get('amplitude_test')); - }); }); }); diff --git a/test/ua-parser.js b/test/ua-parser.js index 117c0046..825c5d67 100644 --- a/test/ua-parser.js +++ b/test/ua-parser.js @@ -1,5 +1,5 @@ -import UAParser from 'ua-parser-js'; +import UAParser from '@amplitude/ua-parser-js'; describe('ua-parser', function() { it('should find an os and device for all agents', function () { diff --git a/yarn.lock b/yarn.lock index 8bc09627..5941d974 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,66 +2,90 @@ # yarn lockfile v1 -"@segment/top-domain@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@segment/top-domain/-/top-domain-3.0.0.tgz#02e5a5a4fd42a9f6cf886b05e82f104012a3c3a7" +"@amplitude/ua-parser-js@0.7.11": + version "0.7.11" + resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.11.tgz#e3e411912aa88b1832ce3fb4dd4996839bd39243" + integrity sha512-uBYLbl5dRh0w7yWATTiKwfzae4EU6B/jHK6xsY8vRgbNEfwJZLG44Z18B1sBGjeaUYCk2nP8lWNehKGeQf3jgw== + +"@sinonjs/commons@^1.0.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" + integrity sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA== dependencies: - component-cookie "^1.1.2" - component-url "^0.2.1" + type-detect "4.0.8" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +"@sinonjs/formatio@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + integrity sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg== + dependencies: + samsam "1.3.0" -abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: - version "0.12.4" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" +"@sinonjs/formatio@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.1.0.tgz#6ac9d1eb1821984d84c4996726e45d1646d8cce5" + integrity sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg== dependencies: - xtend "~3.0.0" + "@sinonjs/samsam" "^2 || ^3" -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" +"@sinonjs/samsam@^2 || ^3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.1.1.tgz#8e2eceb2353f6626e2867352e3def951d3366240" + integrity sha512-ILlwvQUwAiaVBzr3qz8oT1moM7AIUHqUc2UmEjQcH9lLe+E+BZPwUMuc9FFojMswRK4r96x5zDTTrowMLw/vuA== dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" + "@sinonjs/commons" "^1.0.2" + array-from "^2.1.1" + lodash "^4.17.11" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: - mime-types "~2.1.16" + mime-types "~2.1.18" negotiator "0.6.1" acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== adm-zip@~0.4.3: - version "0.4.7" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + version "0.4.13" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" + integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: - extend "~3.0.0" - semver "~5.0.1" + es6-promisify "^5.0.0" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +ajv@^6.5.5: + version "6.9.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" + integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -70,35 +94,42 @@ align-text@^0.1.1, align-text@^0.1.3: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== archiver-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= dependencies: glob "^7.0.0" graceful-fs "^4.1.0" @@ -107,9 +138,10 @@ archiver-utils@^1.3.0: normalize-path "^2.0.0" readable-stream "^2.0.0" -archiver@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" +archiver@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc" + integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw= dependencies: archiver-utils "^1.3.0" async "^2.0.0" @@ -118,12 +150,12 @@ archiver@1.3.0: lodash "^4.8.0" readable-stream "^2.0.0" tar-stream "^1.5.0" - walkdir "^0.0.11" - zip-stream "^1.1.0" + zip-stream "^1.2.0" are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -131,96 +163,139 @@ are-we-there-yet@~1.1.2: arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -asn1.js@^4.0.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: +async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" + integrity sha1-twnMAoCpw28J9FNr6CPIOKkEniU= dependencies: lodash "^4.8.0" async@^2.0.0, async@^2.1.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - lodash "^4.14.0" + lodash "^4.17.11" async@~1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/async/-/async-1.4.2.tgz#6c9edcb11ced4f0dd2f2d40db0d49a109c088aab" + integrity sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" +babel-core@6, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -232,19 +307,20 @@ babel-core@^6.26.0: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" + convert-source-map "^1.5.1" + debug "^2.6.9" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.7" + private "^0.1.8" slash "^1.0.0" - source-map "^0.5.6" + source-map "^0.5.7" babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -252,12 +328,13 @@ babel-generator@^6.26.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.6" + source-map "^0.5.7" trim-right "^1.0.1" babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -266,6 +343,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -275,6 +353,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -284,6 +363,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -292,6 +372,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -302,6 +383,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -309,6 +391,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -316,6 +399,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -323,6 +407,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -331,6 +416,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -341,6 +427,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -352,6 +439,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -359,30 +447,48 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + integrity sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E= dependencies: babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -391,18 +497,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -413,6 +522,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -427,6 +537,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -434,12 +545,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -447,12 +560,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -461,20 +576,23 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -484,6 +602,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -492,6 +611,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -500,6 +620,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -507,6 +628,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -518,6 +640,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -525,12 +648,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -539,18 +664,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -559,20 +687,31 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -580,14 +719,16 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" +babel-preset-env@1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -616,13 +757,14 @@ babel-preset-env@^1.6.1: babel-plugin-transform-es2015-unicode-regex "^6.22.0" babel-plugin-transform-exponentiation-operator "^6.22.0" babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" + browserslist "^3.2.6" invariant "^2.2.2" semver "^5.3.0" babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -635,6 +777,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -642,6 +785,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -652,6 +796,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -666,6 +811,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -675,101 +821,113 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== bl@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" - dependencies: - readable-stream "^2.0.5" - -bl@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== dependencies: - readable-stream "~1.0.26" - -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + readable-stream "^2.3.5" + safe-buffer "^5.1.1" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== bluebird@^3.3.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== bluebird@~2.9.34: version "2.9.34" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.34.tgz#2f7b4ec80216328a9fddebdf69c8d4942feff7d8" + integrity sha1-L3tOyAIWMoqf3evfacjUlC/v99g= blueimp-md5@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.10.0.tgz#02f0843921f90dca14f5b8920a38593201d6964d" + integrity sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@1.18.2, body-parser@^1.16.1: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +body-parser@1.18.3, body-parser@^1.16.1: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= dependencies: bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -777,159 +935,155 @@ brace-expansion@^1.1.7: braces@^0.1.2: version "0.1.5" resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= dependencies: expand-range "^0.1.0" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-resolve@^1.11.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-fs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-fs/-/browserify-fs-1.0.0.tgz#f075aa8a729d4d1716d066620e386fcc1311a96f" - dependencies: - level-filesystem "^1.0.1" - level-js "^2.1.3" - levelup "^0.18.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== -browserslist@^2.1.2: - version "2.9.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.0.tgz#706aca15c53be15610f466e348cbfa0c00a6a379" +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: - caniuse-lite "^1.0.30000760" - electron-to-chromium "^1.3.27" + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" buffer-crc32@^0.2.1: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-es6@^4.9.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" +buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" -builtin-modules@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +builtin-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" + integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= -caniuse-lite@^1.0.30000760: - version "1.0.30000766" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000766.tgz#8a095cc5eb9923c27008ce4d0db23e65a3e28843" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +caniuse-lite@^1.0.30000844: + version "1.0.30000936" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000936.tgz#5d33b118763988bf721b9b8ad436d0400e4a116b" + integrity sha512-orX4IdpbFhdNO7bTBhSbahp1EBpqzBc+qrvTRVUFfZgA4zta7TdM6PN5ZxkEUgDnz36m+PfWGcdX7AVfFWItJw== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= catharsis@~0.8.7: version "0.8.9" resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.9.tgz#98cc890ca652dd2ef0e70b37925310ff9e90fc8b" + integrity sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is= dependencies: underscore-contrib "~0.3.0" center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -938,42 +1092,62 @@ chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chalk@^2.0.1, chalk@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - ansi-styles "^3.1.0" + ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" - supports-color "^4.0.0" + supports-color "^5.3.0" -check-error@^1.0.1: +check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -chokidar@^1.4.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" +chokidar@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.1.tgz#adc39ad55a2adf26548bd2afa048f611091f9184" + integrity sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.0" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +circular-json@^0.5.5: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" cli@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= dependencies: exit "0.1.2" glob "^7.1.1" @@ -981,82 +1155,85 @@ cli@~1.0.0: cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" wordwrap "0.0.2" -clone@~0.1.9: - version "0.1.19" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== combine-lists@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= dependencies: lodash "^4.5.0" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" -commander@2.11.0, commander@^2.9.0, commander@~2.11.0: +commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-cookie@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/component-cookie/-/component-cookie-1.1.3.tgz#053e14a3bd7748154f55724fd39a60c01994ebed" - dependencies: - debug "*" - -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - -component-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/component-url/-/component-url-0.2.1.tgz#4e4f4799c43ead9fd3ce91b5a305d220208fee47" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= compress-commons@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" + integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= dependencies: buffer-crc32 "^0.2.1" crc32-stream "^2.0.0" @@ -1066,236 +1243,225 @@ compress-commons@^1.2.0: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= connect@^3.6.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da" + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" - finalhandler "1.0.6" + finalhandler "1.1.0" parseurl "~1.3.2" utils-merge "1.0.1" console-browserify@1.1.x: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.4.tgz#b8897c062c4d769dd30a0ac5c73976c47f92ea0d" + integrity sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= crc32-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= dependencies: crc "^3.4.4" readable-stream "^2.0.0" crc@^3.4.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" - -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + buffer "^5.1.0" custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" +date-format@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" + integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@*, debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.8: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" +debug@3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: - ms "0.7.1" + ms "2.0.0" -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" +debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "0.7.2" + ms "^2.1.1" decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-eql@^3.0.0: +deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" -deferred-leveldown@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: - abstract-leveldown "~0.12.1" + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1, depd@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + integrity sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== diff@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" - -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= dependencies: custom-event "~1.0.0" ent "~2.2.0" @@ -1303,176 +1469,179 @@ dom-serialize@^2.2.0: void-elements "^2.0.0" dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" + domelementtype "^1.3.0" + entities "^1.1.1" -domelementtype@1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= dependencies: domelementtype "1" domutils@1.5: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= dependencies: dom-serializer "0" domelementtype "1" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.27: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" +electron-to-chromium@^1.3.47: + version "1.3.113" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" -engine.io-client@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.2" + debug "~3.1.0" + engine.io-parser "~2.1.1" has-cors "1.1.0" indexof "0.0.1" - parsejson "0.0.3" parseqs "0.0.5" parseuri "0.0.5" - ws "1.1.2" - xmlhttprequest-ssl "1.5.3" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== dependencies: after "0.8.2" - arraybuffer.slice "0.0.6" + arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.7" - wtf-8 "1.0.0" + blob "0.0.5" + has-binary2 "~1.0.2" -engine.io@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" +engine.io@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== dependencies: - accepts "1.3.3" + accepts "~1.3.4" base64id "1.0.0" cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.2" - ws "1.1.2" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -errno@^0.1.1, errno@~0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" +es6-promise@^4.0.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: - prr "~0.0.0" + es6-promise "^4.0.3" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= espree@~2.2.3: version "2.2.5" resolved "https://registry.yarnpkg.com/espree/-/espree-2.2.5.tgz#df691b9310889402aeb29cc066708c56690b854b" + integrity sha1-32kbkxCIlAKuspzAZnCMVmkLhUs= estree-walker@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= -estree-walker@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" - -estree-walker@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.0.tgz#aae3b57c42deb8010e349c892462f0e71c5dd1aa" +estree-walker@^0.5.0, estree-walker@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== exit@0.1.2, exit@0.1.x: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= dependencies: array-slice "^0.2.3" array-unique "^0.2.1" @@ -1481,12 +1650,27 @@ expand-braces@^0.1.1: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= dependencies: is-number "^0.1.1" repeat-string "^0.2.2" @@ -1494,75 +1678,137 @@ expand-range@^0.1.0: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" express@^4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: - accepts "~1.3.4" + accepts "~1.3.5" array-flatten "1.1.1" - body-parser "1.18.2" + body-parser "1.18.3" content-disposition "0.5.2" content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "1.1.1" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + statuses "~1.4.0" + type-is "~1.6.16" utils-merge "1.0.1" vary "~1.1.2" -extend@3, extend@^3.0.0, extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" -extsprintf@1.3.0, extsprintf@^1.2.0: +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" -finalhandler@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -1572,109 +1818,119 @@ finalhandler@1.0.6: statuses "~1.3.1" unpipe "~1.0.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" parseurl "~1.3.2" - statuses "~1.3.1" + statuses "~1.4.0" unpipe "~1.0.0" -for-in@^1.0.1: +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + +follow-redirects@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + dependencies: + debug "^3.2.6" + +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" -foreach@~2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" -formatio@1.2.0, formatio@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" - dependencies: - samsam "1.x" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= dependencies: null-check "^1.0.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -fwd-stream@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fwd-stream/-/fwd-stream-1.0.4.tgz#ed281cabed46feecf921ee32dc4c50b372ac7cfa" +fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: - readable-stream "~1.0.26-4" + nan "^2.9.2" + node-pre-gyp "^0.10.0" gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1685,29 +1941,27 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -1715,12 +1969,34 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" -glob@7.1.2, glob@^7.0.0, glob@^7.0.5, glob@^7.1.1: +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.1, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1732,107 +2008,105 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.5, glob@^7.1.1: globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" + ajv "^6.5.5" + har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: - isarray "0.0.1" + isarray "2.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: - inherits "^2.0.1" + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + is-number "^3.0.0" + kind-of "^4.0.0" he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -1840,6 +2114,7 @@ home-or-tmp@^2.0.0: htmlparser2@3.8.x: version "3.8.3" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= dependencies: domelementtype "1" domhandler "2.3" @@ -1847,219 +2122,359 @@ htmlparser2@3.8.x: entities "1.0" readable-stream "1.1" -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: - depd "1.1.1" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" http-proxy@^1.13.0: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: - assert-plus "^0.2.0" + assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: - agent-base "2" - debug "2" - extend "3" + safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== -idb-wrapper@^1.5.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.1.tgz#6a32670122e173a84ecc5cfa9668fa2ceb221b04" +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" -indexof@0.0.1, indexof@~0.0.1: +indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - -is-my-json-valid@^2.12.4: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-object@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-0.1.2.tgz#00efbc08816c33cfc4ac8251d132e10dc65098d7" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is@~0.2.6: - version "0.2.7" - resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= -isbuffer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b" +isbinaryfile@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -js-tokens@^3.0.0, js-tokens@^3.0.2: +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js2xmlparser@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" + integrity sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA= jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdoc@3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.4.0.tgz#341cdb06e44a113d9541efd212c95a488064e9ee" + integrity sha1-NBzbBuRKET2VQe/SEslaSIBk6e4= dependencies: async "~1.4.0" bluebird "~2.9.34" @@ -2077,91 +2492,96 @@ jsdoc@3.4.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -jshint@^2.6.3: - version "2.9.5" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.5.tgz#1e7252915ce681b40827ee14248c46d34e9aa62c" +jshint@^2.9.6: + version "2.10.1" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.1.tgz#06bd4cea090c424405aa0987de741341ff17f6bc" + integrity sha512-9GpPfKeffYBl7oBDX2lHPG16j0AM7D2bn3aLy9DaWTr6CWa0i/7UGhX8WLZ7V14QQnnr4hXbjauTLYg06F+HYw== dependencies: cli "~1.0.0" console-browserify "1.1.x" exit "0.1.x" htmlparser2 "3.8.x" - lodash "3.7.x" + lodash "~4.17.10" minimatch "~3.0.2" shelljs "0.3.x" strip-json-comments "1.0.x" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@3.3.2, json3@^3.3.2: +json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" json-schema "0.2.3" verror "1.10.0" -just-extend@^1.1.26: - version "1.1.27" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== karma-chai@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" + integrity sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o= karma-chrome-launcher@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== dependencies: fs-access "^1.0.0" which "^1.2.1" karma-firefox-launcher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.1.tgz#ce58f47c2013a88156d55a5d61337c099cf5bb51" + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339" + integrity sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA== karma-mocha-reporter@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" + integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA= dependencies: chalk "^2.1.0" log-symbols "^2.1.0" @@ -2170,12 +2590,14 @@ karma-mocha-reporter@^2.2.5: karma-mocha@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" + integrity sha1-7qrH/8DiAetjxGdEDStpx883eL8= dependencies: minimist "1.2.0" karma-sauce-launcher@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/karma-sauce-launcher/-/karma-sauce-launcher-1.2.0.tgz#6f2558ddef3cf56879fa27540c8ae9f8bfd16bca" + integrity sha512-lEhtGRGS+3Yw6JSx/vJY9iQyHNtTjcojrSwNzqNUOaDceKDu9dPZqA/kr69bUO9G2T6GKbu8AZgXqy94qo31Jg== dependencies: q "^1.5.0" sauce-connect-launcher "^1.2.2" @@ -2185,20 +2607,23 @@ karma-sauce-launcher@^1.2.0: karma-sinon@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/karma-sinon/-/karma-sinon-1.0.5.tgz#4e3443f2830fdecff624d3747163f1217daa2a9a" + integrity sha1-TjRD8oMP3s/2JNN0cWPxIX2qKpo= karma-sourcemap-loader@^0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + integrity sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg= dependencies: graceful-fs "^4.1.2" -karma@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-1.7.1.tgz#85cc08e9e0a22d7ce9cca37c4a1be824f6a2b1ae" +karma@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.4.tgz#3890ca9722b10d1d14b726e1335931455788499e" + integrity sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw== dependencies: bluebird "^3.3.0" body-parser "^1.16.1" - chokidar "^1.4.1" + chokidar "^2.0.3" colors "^1.1.0" combine-lists "^1.0.0" connect "^3.6.0" @@ -2206,213 +2631,169 @@ karma@^1.7.1: di "^0.0.1" dom-serialize "^2.2.0" expand-braces "^0.1.1" + flatted "^2.0.0" glob "^7.1.1" graceful-fs "^4.1.2" http-proxy "^1.13.0" isbinaryfile "^3.0.0" - lodash "^3.8.0" - log4js "^0.6.31" - mime "^1.3.4" + lodash "^4.17.5" + log4js "^3.0.0" + mime "^2.3.1" minimatch "^3.0.2" optimist "^0.6.1" qjobs "^1.1.4" range-parser "^1.2.0" rimraf "^2.6.0" safe-buffer "^5.0.1" - socket.io "1.7.3" - source-map "^0.5.3" - tmp "0.0.31" - useragent "^2.1.12" + socket.io "2.1.1" + source-map "^0.6.1" + tmp "0.0.33" + useragent "2.3.0" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= dependencies: readable-stream "^2.0.5" -level-blobs@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/level-blobs/-/level-blobs-0.1.7.tgz#9ab9b97bb99f1edbf9f78a3433e21ed56386bdaf" - dependencies: - level-peek "1.0.6" - once "^1.3.0" - readable-stream "^1.0.26-4" - -level-filesystem@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/level-filesystem/-/level-filesystem-1.2.0.tgz#a00aca9919c4a4dfafdca6a8108d225aadff63b3" - dependencies: - concat-stream "^1.4.4" - errno "^0.1.1" - fwd-stream "^1.0.4" - level-blobs "^0.1.7" - level-peek "^1.0.6" - level-sublevel "^5.2.0" - octal "^1.0.0" - once "^1.3.0" - xtend "^2.2.0" - -level-fix-range@2.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-2.0.0.tgz#c417d62159442151a19d9a2367868f1724c2d548" - dependencies: - clone "~0.1.9" - -level-fix-range@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-1.0.2.tgz#bf15b915ae36d8470c821e883ddf79cd16420828" - -"level-hooks@>=4.4.0 <5": - version "4.5.0" - resolved "https://registry.yarnpkg.com/level-hooks/-/level-hooks-4.5.0.tgz#1b9ae61922930f3305d1a61fc4d83c8102c0dd93" - dependencies: - string-range "~1.2" - -level-js@^2.1.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-2.2.4.tgz#bc055f4180635d4489b561c9486fa370e8c11697" - dependencies: - abstract-leveldown "~0.12.0" - idb-wrapper "^1.5.0" - isbuffer "~0.0.0" - ltgt "^2.1.2" - typedarray-to-buffer "~1.0.0" - xtend "~2.1.2" - -level-peek@1.0.6, level-peek@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/level-peek/-/level-peek-1.0.6.tgz#bec51c72a82ee464d336434c7c876c3fcbcce77f" - dependencies: - level-fix-range "~1.0.2" - -level-sublevel@^5.2.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-5.2.3.tgz#744c12c72d2e72be78dde3b9b5cd84d62191413a" - dependencies: - level-fix-range "2.0" - level-hooks ">=4.4.0 <5" - string-range "~1.2.1" - xtend "~2.0.4" - -levelup@^0.18.2: - version "0.18.6" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.18.6.tgz#e6a01cb089616c8ecc0291c2a9bd3f0c44e3e5eb" - dependencies: - bl "~0.8.1" - deferred-leveldown "~0.2.0" - errno "~0.1.1" - prr "~0.0.0" - readable-stream "~1.0.26" - semver "~2.3.1" - xtend "~3.0.0" - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash@3.7.x: - version "3.7.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" - -lodash@4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652" - -lodash@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.5.0, lodash@^4.8.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@4.17.11, lodash@^4.16.6, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.8.0, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log-symbols@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" -log4js@^0.6.31: - version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" +log4js@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" + integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== dependencies: - readable-stream "~1.0.2" - semver "~4.3.3" - -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" + circular-json "^0.5.5" + date-format "^1.2.0" + debug "^3.1.0" + rfdc "^1.1.2" + streamroller "0.7.0" -lolex@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.0.tgz#d6bad0f0aa5caebffcfebb09fb2caa89baaff51c" +lolex@^2.2.0, lolex@^2.3.2: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" - -lru-cache@2.2.x: - version "2.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + js-tokens "^3.0.0 || ^4.0.0" -ltgt@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.0.tgz#b65ba5fcb349a29924c8e333f7c6a5562f2e4842" +lru-cache@4.1.x: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" magic-string@^0.22.4: - version "0.22.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== dependencies: - vlq "^0.2.1" + vlq "^0.2.2" -marked@~0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" +magic-string@^0.25.1: + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + dependencies: + sourcemap-codec "^1.4.4" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" + object-visit "^1.0.0" + +marked@~0.3.4: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -2428,62 +2809,103 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@1.4.1, mime@^1.3.4: +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== + +mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" + +mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" +mime@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@1.2.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1: +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mocha@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.0.1.tgz#0aee5a95cf69a4618820f5e51fa31717117daf1b" + version "4.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" + integrity sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA== dependencies: browser-stdout "1.3.0" commander "2.11.0" @@ -2496,68 +2918,116 @@ mocha@^4.0.1: mkdirp "0.5.1" supports-color "4.4.0" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@^2.3.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= nise@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.0.tgz#079d6cadbbcb12ba30e38f1c999f36ad4d6baa53" + version "1.4.8" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.8.tgz#ce91c31e86cf9b2c4cac49d7fcd7f56779bfd6b0" + integrity sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw== dependencies: - formatio "^1.2.0" - just-extend "^1.1.26" - lolex "^1.6.0" + "@sinonjs/formatio" "^3.1.0" + just-extend "^4.0.2" + lolex "^2.3.2" path-to-regexp "^1.7.0" text-encoding "^0.6.4" -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" - hawk "3.1.3" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.3.0.tgz#7f01e8e44408341379ca98cfd756e7b29bd2626c" + integrity sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -2567,278 +3037,277 @@ npmlog@^4.0.2: null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= -object-keys@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.2.0.tgz#cddec02998b091be42bf1035ae32e49f1cb6ea67" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: - foreach "~2.0.1" - indexof "~0.0.1" - is "~0.2.6" + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" -octal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" is-extglob "^1.0.0" is-glob "^2.0.0" -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - dependencies: - better-assert "~1.0.0" - parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= dependencies: isarray "0.0.1" -pathval@^1.0.0: +pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= -pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -private@^0.1.6, private@^0.1.7: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-es6@^0.11.2: - version "0.11.6" - resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" - ipaddr.js "1.5.2" + ipaddr.js "1.8.0" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= q@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qjobs@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" +query-string@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: - safe-buffer "^5.1.0" + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" -randomfill@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" + http-errors "1.6.3" + iconv-lite "0.4.23" unpipe "1.0.0" -rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -2846,66 +3315,54 @@ rc@^1.1.7: readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^1.0.26-4: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" - string_decoder "~1.0.3" + string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~1.0.2, readable-stream@~1.0.26, readable-stream@~1.0.26-4: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -2914,12 +3371,22 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -2928,135 +3395,127 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request@2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" +request@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.0.0" + uuid "^3.3.2" -requires-port@1.x.x: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= requizzle@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.1.tgz#6943c3530c4d9a7e46f1cddd51c158fc670cdbde" + integrity sha1-aUPDUwxNmn5G8c3dUcFY/GcM294= dependencies: underscore "~1.6.0" -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.1.6, resolve@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rfdc@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" + integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" + glob "^7.1.3" rollup-plugin-babel@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz#a2765dea0eaa8aece351c983573300d17497495b" + version "3.0.7" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e" + integrity sha512-bVe2y0z/V5Ax1qU8NX/0idmzIwJPdUGu8Xx3vXH73h0yGjxfv2gkFI82MBVg49SlsFlLTBadBHb67zy4TWM3hA== dependencies: rollup-pluginutils "^1.5.0" -rollup-plugin-commonjs@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz#27e5b9069ff94005bb01e01bb46a1e4873784677" +rollup-plugin-commonjs@8: + version "8.4.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== dependencies: acorn "^5.2.1" estree-walker "^0.5.0" @@ -3064,108 +3523,118 @@ rollup-plugin-commonjs@^8.2.6: resolve "^1.4.0" rollup-pluginutils "^2.0.1" -rollup-plugin-json@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz#3c07a452c1b5391be28006fbfff3644056ce0add" - dependencies: - rollup-pluginutils "^2.0.1" - rollup-plugin-legacy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rollup-plugin-legacy/-/rollup-plugin-legacy-1.0.0.tgz#d08bdfc4410bd13827f4278c51870d3d8dbd1ea3" + integrity sha1-0IvfxEEL0Tgn9CeMUYcNPY29HqM= dependencies: rollup-pluginutils "^1.5.2" -rollup-plugin-node-builtins@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz#24a1fed4a43257b6b64371d8abc6ce1ab14597e9" - dependencies: - browserify-fs "^1.0.0" - buffer-es6 "^4.9.2" - crypto-browserify "^3.11.0" - process-es6 "^0.11.2" - rollup-plugin-node-resolve@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" + version "3.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" + integrity sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg== dependencies: - browser-resolve "^1.11.0" - builtin-modules "^1.1.0" + builtin-modules "^2.0.0" is-module "^1.0.0" resolve "^1.1.6" +rollup-plugin-replace@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.1.0.tgz#f9c07a4a89a2f8be912ee54b3f0f68d91e9ed0ae" + integrity sha512-SxrAIgpH/B5/W4SeULgreOemxcpEgKs2gcD42zXw50bhqGWmcnlXneVInQpAqzA/cIly4bJrOpeelmB9p4YXSQ== + dependencies: + magic-string "^0.25.1" + minimatch "^3.0.2" + rollup-pluginutils "^2.0.1" + rollup-plugin-uglify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-2.0.1.tgz#67b37ad1efdafbd83af4c36b40c189ee4866c969" + integrity sha1-Z7N60e/a+9g69MNrQMGJ7khmyWk= dependencies: uglify-js "^3.0.9" rollup-pluginutils@^1.5.0, rollup-pluginutils@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + integrity sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg= dependencies: estree-walker "^0.2.1" minimatch "^3.0.2" rollup-pluginutils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" + version "2.3.3" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" + integrity sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA== dependencies: - estree-walker "^0.3.0" + estree-walker "^0.5.2" micromatch "^2.3.11" -rollup@^0.49.3: - version "0.49.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.49.3.tgz#4cce32643dd8cf2154c69ff0e43470067db0adbf" +rollup@^0.56.0: + version "0.56.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.56.5.tgz#40fe3cf0cd1659d469baad11f4d5b6336c14ce84" + integrity sha512-IGPk5vdWrsc4vkiW9XMeXr5QMtxmvATTttTi59w2jBQWe9G/MMQtn8teIBAj+DdK51TrpVT6P0aQUaQUlUYCJA== -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -samsam@1.x: +samsam@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" + integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== sauce-connect-launcher@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz#d2f931ad7ae8fdabf1968a440e7b20417aca7f86" + version "1.2.4" + resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz#8d38f85242a9fbede1b2303b559f7e20c5609a1c" + integrity sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA== dependencies: adm-zip "~0.4.3" async "^2.1.2" - https-proxy-agent "~1.0.0" + https-proxy-agent "^2.2.1" lodash "^4.16.6" rimraf "^2.5.4" saucelabs@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.4.0.tgz#b934a9af9da2874b3f40aae1fcde50a4466f5f38" + version "1.5.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== dependencies: - https-proxy-agent "^1.0.0" + https-proxy-agent "^2.2.1" -semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semver@~4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@~5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" +semver@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -3174,324 +3643,446 @@ send@0.16.1: ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.2" - send "0.16.1" + send "0.16.2" set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.9" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shelljs@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= sinon@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.1.2.tgz#65610521d926fb53742dd84cd599f0b89a82f440" + version "4.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" + integrity sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w== dependencies: + "@sinonjs/formatio" "^2.0.0" diff "^3.1.0" - formatio "1.2.0" lodash.get "^4.4.2" lolex "^2.2.0" nise "^1.2.0" - supports-color "^4.4.0" - type-detect "^4.0.0" + supports-color "^5.1.0" + type-detect "^4.0.5" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: - hoek "2.x.x" + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= -socket.io-client@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== dependencies: backo2 "1.0.2" + base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.3" - has-binary "0.1.7" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" indexof "0.0.1" object-component "0.0.3" + parseqs "0.0.5" parseuri "0.0.5" - socket.io-parser "2.3.1" + socket.io-parser "~3.2.0" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" -socket.io@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== dependencies: - debug "2.3.3" - engine.io "1.8.3" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.7.3" - socket.io-parser "2.3.1" + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" -source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@~0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" -"statuses@>= 1.3.1 < 2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= -string-range@~1.2, string-range@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/string-range/-/string-range-1.2.2.tgz#a893ed347e72299bc83befbbf2a692a8d239d5dd" +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +streamroller@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" + integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== + dependencies: + date-format "^1.2.0" + debug "^3.1.0" + mkdirp "^0.5.1" + readable-stream "^2.3.0" -string-width@^1.0.1, string-width@^1.0.2: +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-json-comments@1.0.x, strip-json-comments@~1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= supports-color@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== dependencies: has-flag "^2.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^4.0.0, supports-color@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" +supports-color@^5.1.0, supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - has-flag "^2.0.0" + has-flag "^3.0.0" "taffydb@https://github.com/hegemonic/taffydb/tarball/7d100bcee0e997ee4977e273cdce60bd8933050e": version "2.6.2" resolved "https://github.com/hegemonic/taffydb/tarball/7d100bcee0e997ee4977e273cdce60bd8933050e#3c549d2f5712d7d1d109ad6bb1a4084f1b7add4e" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - tar-stream@^1.5.0: - version "1.5.5" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" + buffer-alloc "^1.2.0" end-of-stream "^1.0.0" - readable-stream "^2.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" xtend "^4.0.0" -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= -tmp@0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -tmp@0.0.x: +tmp@0.0.33, tmp@0.0.x: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= -tough-cookie@~2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" punycode "^1.4.1" trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-detect@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.5.tgz#d70e5bc81db6de2a381bcaca0c6e0cbdc7635de2" +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" - mime-types "~2.1.15" - -typedarray-to-buffer@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz#9bb8ba0e841fb3f4cf1fe7c245e9f3fa8a5fe99c" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -"ua-parser-js@github:amplitude/ua-parser-js#ed538f1": - version "0.7.10" - resolved "https://codeload.github.com/amplitude/ua-parser-js/tar.gz/ed538f16f5c6ecd8357da989b617d4f156dcf35d" + mime-types "~2.1.18" uglify-js@^2.0.0: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -3499,188 +4090,227 @@ uglify-js@^2.0.0: uglify-to-browserify "~1.0.0" uglify-js@^3.0.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.9.tgz#dffca799308cf327ec3ac77eeacb8e196ce3b452" + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: - commander "~2.11.0" + commander "~2.17.1" source-map "~0.6.1" uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== underscore-contrib@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/underscore-contrib/-/underscore-contrib-0.3.0.tgz#665b66c24783f8fa2b18c9f8cbb0e2c7d48c26c7" + integrity sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc= dependencies: underscore "1.6.0" -underscore.string@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - dependencies: - sprintf-js "^1.0.3" - util-deprecate "^1.0.2" - underscore@1.6.0, underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= underscore@~1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -useragent@^2.1.12: - version "2.2.1" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: - lru-cache "2.2.x" + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +useragent@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" + integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== + dependencies: + lru-cache "4.1.x" tmp "0.0.x" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== vargs@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" + integrity sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8= vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vlq@^0.2.1: +vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - -walkdir@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= wd@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/wd/-/wd-1.4.1.tgz#6b1ab39aab1728ee276c1a2b6d7321da68b16e8c" + version "1.11.1" + resolved "https://registry.yarnpkg.com/wd/-/wd-1.11.1.tgz#21a33e21977ad20522bb189f6529c3b55ac3862c" + integrity sha512-XNK6EbOrXF7cG8f3pbps6mb/+xPGZH2r1AL1zGJluGynA/Xt6ip1Tvqj2AkavyDFworreaGXoe+0AP/r7EX9pg== dependencies: - archiver "1.3.0" + archiver "2.1.1" async "2.0.1" - lodash "4.16.2" + lodash "4.17.11" mkdirp "^0.5.1" q "1.4.1" - request "2.79.0" - underscore.string "3.3.4" + request "2.88.0" vargs "0.1.0" which@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= wrench@~1.5.8: version "1.5.9" resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.5.9.tgz#411691c63a9b2531b1700267279bdeca23b2142a" + integrity sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo= -ws@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: - options ">=0.0.5" - ultron "1.0.x" - -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" -xtend@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xtend@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.0.6.tgz#5ea657a6dba447069c2e59c58a1138cb0c5e6cee" - dependencies: - is-object "~0.1.2" - object-keys "~0.2.0" - -xtend@~2.1.2: +yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -3690,10 +4320,12 @@ yargs@~3.10.0: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -zip-stream@^1.1.0: +zip-stream@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" + integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= dependencies: archiver-utils "^1.3.0" compress-commons "^1.2.0"