{"version":3,"file":"AppUtil.62417a28.js","sources":["../../node_modules/component-emitter/index.js","../../node_modules/fast-safe-stringify/index.js","../../node_modules/superagent/lib/is-object.js","../../node_modules/superagent/lib/request-base.js","../../node_modules/superagent/lib/utils.js","../../node_modules/superagent/lib/response-base.js","../../node_modules/superagent/lib/agent-base.js","../../node_modules/superagent/lib/client.js","../../app/javascript/app/utils/UserUtil.js","../../app/javascript/app/services/RestService.js","../../app/javascript/app/services/UserService.js","../../app/javascript/app/utils/ArrayUtil.js","../../app/javascript/app/utils/FieldUtil.js","../../app/javascript/app/utils/TableUtil.js","../../app/javascript/app/utils/UIUtil.js","../../app/javascript/app/services/AppService.js","../../app/javascript/app/managers/AppManager.js","../../app/javascript/app/managers/PermissionManager.js","../../app/javascript/app/services/SiteService.js","../../app/javascript/app/utils/AppUtil.js"],"sourcesContent":["\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n // Remove event specific arrays for event types that no\r\n // one is subscribed for to avoid memory leak.\r\n if (callbacks.length === 0) {\r\n delete this._callbacks['$' + event];\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n\r\n var args = new Array(arguments.length - 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n for (var i = 1; i < arguments.length; i++) {\r\n args[i - 1] = arguments[i];\r\n }\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n","module.exports = stringify\nstringify.default = stringify\nstringify.stable = deterministicStringify\nstringify.stableStringify = deterministicStringify\n\nvar arr = []\nvar replacerStack = []\n\n// Regular stringify\nfunction stringify (obj, replacer, spacer) {\n decirc(obj, '', [], undefined)\n var res\n if (replacerStack.length === 0) {\n res = JSON.stringify(obj, replacer, spacer)\n } else {\n res = JSON.stringify(obj, replaceGetterValues(replacer), spacer)\n }\n while (arr.length !== 0) {\n var part = arr.pop()\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3])\n } else {\n part[0][part[1]] = part[2]\n }\n }\n return res\n}\nfunction decirc (val, k, stack, parent) {\n var i\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)\n if (propertyDescriptor.get !== undefined) {\n if (propertyDescriptor.configurable) {\n Object.defineProperty(parent, k, { value: '[Circular]' })\n arr.push([parent, k, val, propertyDescriptor])\n } else {\n replacerStack.push([val, k])\n }\n } else {\n parent[k] = '[Circular]'\n arr.push([parent, k, val])\n }\n return\n }\n }\n stack.push(val)\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n decirc(val[i], i, stack, val)\n }\n } else {\n var keys = Object.keys(val)\n for (i = 0; i < keys.length; i++) {\n var key = keys[i]\n decirc(val[key], key, stack, val)\n }\n }\n stack.pop()\n }\n}\n\n// Stable-stringify\nfunction compareFunction (a, b) {\n if (a < b) {\n return -1\n }\n if (a > b) {\n return 1\n }\n return 0\n}\n\nfunction deterministicStringify (obj, replacer, spacer) {\n var tmp = deterministicDecirc(obj, '', [], undefined) || obj\n var res\n if (replacerStack.length === 0) {\n res = JSON.stringify(tmp, replacer, spacer)\n } else {\n res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer)\n }\n while (arr.length !== 0) {\n var part = arr.pop()\n if (part.length === 4) {\n Object.defineProperty(part[0], part[1], part[3])\n } else {\n part[0][part[1]] = part[2]\n }\n }\n return res\n}\n\nfunction deterministicDecirc (val, k, stack, parent) {\n var i\n if (typeof val === 'object' && val !== null) {\n for (i = 0; i < stack.length; i++) {\n if (stack[i] === val) {\n var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)\n if (propertyDescriptor.get !== undefined) {\n if (propertyDescriptor.configurable) {\n Object.defineProperty(parent, k, { value: '[Circular]' })\n arr.push([parent, k, val, propertyDescriptor])\n } else {\n replacerStack.push([val, k])\n }\n } else {\n parent[k] = '[Circular]'\n arr.push([parent, k, val])\n }\n return\n }\n }\n if (typeof val.toJSON === 'function') {\n return\n }\n stack.push(val)\n // Optimize for Arrays. Big arrays could kill the performance otherwise!\n if (Array.isArray(val)) {\n for (i = 0; i < val.length; i++) {\n deterministicDecirc(val[i], i, stack, val)\n }\n } else {\n // Create a temporary object in the required way\n var tmp = {}\n var keys = Object.keys(val).sort(compareFunction)\n for (i = 0; i < keys.length; i++) {\n var key = keys[i]\n deterministicDecirc(val[key], key, stack, val)\n tmp[key] = val[key]\n }\n if (parent !== undefined) {\n arr.push([parent, k, val])\n parent[k] = tmp\n } else {\n return tmp\n }\n }\n stack.pop()\n }\n}\n\n// wraps replacer function to handle values we couldn't replace\n// and mark them as [Circular]\nfunction replaceGetterValues (replacer) {\n replacer = replacer !== undefined ? replacer : function (k, v) { return v }\n return function (key, val) {\n if (replacerStack.length > 0) {\n for (var i = 0; i < replacerStack.length; i++) {\n var part = replacerStack[i]\n if (part[1] === key && part[0] === val) {\n val = '[Circular]'\n replacerStack.splice(i, 1)\n break\n }\n }\n }\n return replacer.call(this, key, val)\n }\n}\n","\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\nfunction isObject(obj) {\n return obj !== null && _typeof(obj) === 'object';\n}\n\nmodule.exports = isObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pcy1vYmplY3QuanMiXSwibmFtZXMiOlsiaXNPYmplY3QiLCJvYmoiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7Ozs7QUFRQSxTQUFTQSxRQUFULENBQWtCQyxHQUFsQixFQUF1QjtBQUNyQixTQUFPQSxHQUFHLEtBQUssSUFBUixJQUFnQixRQUFPQSxHQUFQLE1BQWUsUUFBdEM7QUFDRDs7QUFFREMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCSCxRQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiJdfQ==","\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * Module of mixed-in functions shared between node and client code\n */\nvar isObject = require('./is-object');\n/**\n * Expose `RequestBase`.\n */\n\n\nmodule.exports = RequestBase;\n/**\n * Initialize a new `RequestBase`.\n *\n * @api public\n */\n\nfunction RequestBase(obj) {\n if (obj) return mixin(obj);\n}\n/**\n * Mixin the prototype properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\n\nfunction mixin(obj) {\n for (var key in RequestBase.prototype) {\n if (Object.prototype.hasOwnProperty.call(RequestBase.prototype, key)) obj[key] = RequestBase.prototype[key];\n }\n\n return obj;\n}\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.clearTimeout = function () {\n clearTimeout(this._timer);\n clearTimeout(this._responseTimeoutTimer);\n clearTimeout(this._uploadTimeoutTimer);\n delete this._timer;\n delete this._responseTimeoutTimer;\n delete this._uploadTimeoutTimer;\n return this;\n};\n/**\n * Override default response body parser\n *\n * This function will be called to convert incoming data into request.body\n *\n * @param {Function}\n * @api public\n */\n\n\nRequestBase.prototype.parse = function (fn) {\n this._parser = fn;\n return this;\n};\n/**\n * Set format of binary response body.\n * In browser valid formats are 'blob' and 'arraybuffer',\n * which return Blob and ArrayBuffer, respectively.\n *\n * In Node all values result in Buffer.\n *\n * Examples:\n *\n * req.get('/')\n * .responseType('blob')\n * .end(callback);\n *\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.responseType = function (val) {\n this._responseType = val;\n return this;\n};\n/**\n * Override default request body serializer\n *\n * This function will be called to convert data set via .send or .attach into payload to send\n *\n * @param {Function}\n * @api public\n */\n\n\nRequestBase.prototype.serialize = function (fn) {\n this._serializer = fn;\n return this;\n};\n/**\n * Set timeouts.\n *\n * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.\n * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.\n * - upload is the time since last bit of data was sent or received. This timeout works only if deadline timeout is off\n *\n * Value of 0 or false means no timeout.\n *\n * @param {Number|Object} ms or {response, deadline}\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.timeout = function (options) {\n if (!options || _typeof(options) !== 'object') {\n this._timeout = options;\n this._responseTimeout = 0;\n this._uploadTimeout = 0;\n return this;\n }\n\n for (var option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option)) {\n switch (option) {\n case 'deadline':\n this._timeout = options.deadline;\n break;\n\n case 'response':\n this._responseTimeout = options.response;\n break;\n\n case 'upload':\n this._uploadTimeout = options.upload;\n break;\n\n default:\n console.warn('Unknown timeout option', option);\n }\n }\n }\n\n return this;\n};\n/**\n * Set number of retry attempts on error.\n *\n * Failed requests will be retried 'count' times if timeout or err.code >= 500.\n *\n * @param {Number} count\n * @param {Function} [fn]\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.retry = function (count, fn) {\n // Default to 1 if no count passed or true\n if (arguments.length === 0 || count === true) count = 1;\n if (count <= 0) count = 0;\n this._maxRetries = count;\n this._retries = 0;\n this._retryCallback = fn;\n return this;\n};\n\nvar ERROR_CODES = ['ECONNRESET', 'ETIMEDOUT', 'EADDRINFO', 'ESOCKETTIMEDOUT'];\n/**\n * Determine if a request should be retried.\n * (Borrowed from segmentio/superagent-retry)\n *\n * @param {Error} err an error\n * @param {Response} [res] response\n * @returns {Boolean} if segment should be retried\n */\n\nRequestBase.prototype._shouldRetry = function (err, res) {\n if (!this._maxRetries || this._retries++ >= this._maxRetries) {\n return false;\n }\n\n if (this._retryCallback) {\n try {\n var override = this._retryCallback(err, res);\n\n if (override === true) return true;\n if (override === false) return false; // undefined falls back to defaults\n } catch (err_) {\n console.error(err_);\n }\n }\n\n if (res && res.status && res.status >= 500 && res.status !== 501) return true;\n\n if (err) {\n if (err.code && ERROR_CODES.includes(err.code)) return true; // Superagent timeout\n\n if (err.timeout && err.code === 'ECONNABORTED') return true;\n if (err.crossDomain) return true;\n }\n\n return false;\n};\n/**\n * Retry request\n *\n * @return {Request} for chaining\n * @api private\n */\n\n\nRequestBase.prototype._retry = function () {\n this.clearTimeout(); // node\n\n if (this.req) {\n this.req = null;\n this.req = this.request();\n }\n\n this._aborted = false;\n this.timedout = false;\n this.timedoutError = null;\n return this._end();\n};\n/**\n * Promise support\n *\n * @param {Function} resolve\n * @param {Function} [reject]\n * @return {Request}\n */\n\n\nRequestBase.prototype.then = function (resolve, reject) {\n var _this = this;\n\n if (!this._fullfilledPromise) {\n var self = this;\n\n if (this._endCalled) {\n console.warn('Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises');\n }\n\n this._fullfilledPromise = new Promise(function (resolve, reject) {\n self.on('abort', function () {\n if (_this.timedout && _this.timedoutError) {\n reject(_this.timedoutError);\n return;\n }\n\n var err = new Error('Aborted');\n err.code = 'ABORTED';\n err.status = _this.status;\n err.method = _this.method;\n err.url = _this.url;\n reject(err);\n });\n self.end(function (err, res) {\n if (err) reject(err);else resolve(res);\n });\n });\n }\n\n return this._fullfilledPromise.then(resolve, reject);\n};\n\nRequestBase.prototype.catch = function (cb) {\n return this.then(undefined, cb);\n};\n/**\n * Allow for extension\n */\n\n\nRequestBase.prototype.use = function (fn) {\n fn(this);\n return this;\n};\n\nRequestBase.prototype.ok = function (cb) {\n if (typeof cb !== 'function') throw new Error('Callback required');\n this._okCallback = cb;\n return this;\n};\n\nRequestBase.prototype._isResponseOK = function (res) {\n if (!res) {\n return false;\n }\n\n if (this._okCallback) {\n return this._okCallback(res);\n }\n\n return res.status >= 200 && res.status < 300;\n};\n/**\n * Get request header `field`.\n * Case-insensitive.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\n\nRequestBase.prototype.get = function (field) {\n return this._header[field.toLowerCase()];\n};\n/**\n * Get case-insensitive header `field` value.\n * This is a deprecated internal API. Use `.get(field)` instead.\n *\n * (getHeader is no longer used internally by the superagent code base)\n *\n * @param {String} field\n * @return {String}\n * @api private\n * @deprecated\n */\n\n\nRequestBase.prototype.getHeader = RequestBase.prototype.get;\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n * Case-insensitive.\n *\n * Examples:\n *\n * req.get('/')\n * .set('Accept', 'application/json')\n * .set('X-API-Key', 'foobar')\n * .end(callback);\n *\n * req.get('/')\n * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n * .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.set = function (field, val) {\n if (isObject(field)) {\n for (var key in field) {\n if (Object.prototype.hasOwnProperty.call(field, key)) this.set(key, field[key]);\n }\n\n return this;\n }\n\n this._header[field.toLowerCase()] = val;\n this.header[field] = val;\n return this;\n};\n/**\n * Remove header `field`.\n * Case-insensitive.\n *\n * Example:\n *\n * req.get('/')\n * .unset('User-Agent')\n * .end(callback);\n *\n * @param {String} field field name\n */\n\n\nRequestBase.prototype.unset = function (field) {\n delete this._header[field.toLowerCase()];\n delete this.header[field];\n return this;\n};\n/**\n * Write the field `name` and `val`, or multiple fields with one object\n * for \"multipart/form-data\" request bodies.\n *\n * ``` js\n * request.post('/upload')\n * .field('foo', 'bar')\n * .end(callback);\n *\n * request.post('/upload')\n * .field({ foo: 'bar', baz: 'qux' })\n * .end(callback);\n * ```\n *\n * @param {String|Object} name name of field\n * @param {String|Blob|File|Buffer|fs.ReadStream} val value of field\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.field = function (name, val) {\n // name should be either a string or an object.\n if (name === null || undefined === name) {\n throw new Error('.field(name, val) name can not be empty');\n }\n\n if (this._data) {\n throw new Error(\".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()\");\n }\n\n if (isObject(name)) {\n for (var key in name) {\n if (Object.prototype.hasOwnProperty.call(name, key)) this.field(key, name[key]);\n }\n\n return this;\n }\n\n if (Array.isArray(val)) {\n for (var i in val) {\n if (Object.prototype.hasOwnProperty.call(val, i)) this.field(name, val[i]);\n }\n\n return this;\n } // val should be defined now\n\n\n if (val === null || undefined === val) {\n throw new Error('.field(name, val) val can not be empty');\n }\n\n if (typeof val === 'boolean') {\n val = String(val);\n }\n\n this._getFormData().append(name, val);\n\n return this;\n};\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request} request\n * @api public\n */\n\n\nRequestBase.prototype.abort = function () {\n if (this._aborted) {\n return this;\n }\n\n this._aborted = true;\n if (this.xhr) this.xhr.abort(); // browser\n\n if (this.req) this.req.abort(); // node\n\n this.clearTimeout();\n this.emit('abort');\n return this;\n};\n\nRequestBase.prototype._auth = function (user, pass, options, base64Encoder) {\n switch (options.type) {\n case 'basic':\n this.set('Authorization', \"Basic \".concat(base64Encoder(\"\".concat(user, \":\").concat(pass))));\n break;\n\n case 'auto':\n this.username = user;\n this.password = pass;\n break;\n\n case 'bearer':\n // usage would be .auth(accessToken, { type: 'bearer' })\n this.set('Authorization', \"Bearer \".concat(user));\n break;\n\n default:\n break;\n }\n\n return this;\n};\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\n\nRequestBase.prototype.withCredentials = function (on) {\n // This is browser-only functionality. Node side is no-op.\n if (on === undefined) on = true;\n this._withCredentials = on;\n return this;\n};\n/**\n * Set the max redirects to `n`. Does nothing in browser XHR implementation.\n *\n * @param {Number} n\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.redirects = function (n) {\n this._maxRedirects = n;\n return this;\n};\n/**\n * Maximum size of buffered response body, in bytes. Counts uncompressed size.\n * Default 200MB.\n *\n * @param {Number} n number of bytes\n * @return {Request} for chaining\n */\n\n\nRequestBase.prototype.maxResponseSize = function (n) {\n if (typeof n !== 'number') {\n throw new TypeError('Invalid argument');\n }\n\n this._maxResponseSize = n;\n return this;\n};\n/**\n * Convert to a plain javascript object (not JSON string) of scalar properties.\n * Note as this method is designed to return a useful non-this value,\n * it cannot be chained.\n *\n * @return {Object} describing method, url, and data of this request\n * @api public\n */\n\n\nRequestBase.prototype.toJSON = function () {\n return {\n method: this.method,\n url: this.url,\n data: this._data,\n headers: this._header\n };\n};\n/**\n * Send `data` as the request body, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n * // manual json\n * request.post('/user')\n * .type('json')\n * .send('{\"name\":\"tj\"}')\n * .end(callback)\n *\n * // auto json\n * request.post('/user')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // manual x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send('name=tj')\n * .end(callback)\n *\n * // auto x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // defaults to x-www-form-urlencoded\n * request.post('/user')\n * .send('name=tobi')\n * .send('species=ferret')\n * .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n// eslint-disable-next-line complexity\n\n\nRequestBase.prototype.send = function (data) {\n var isObj = isObject(data);\n var type = this._header['content-type'];\n\n if (this._formData) {\n throw new Error(\".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()\");\n }\n\n if (isObj && !this._data) {\n if (Array.isArray(data)) {\n this._data = [];\n } else if (!this._isHost(data)) {\n this._data = {};\n }\n } else if (data && this._data && this._isHost(this._data)) {\n throw new Error(\"Can't merge these send calls\");\n } // merge\n\n\n if (isObj && isObject(this._data)) {\n for (var key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) this._data[key] = data[key];\n }\n } else if (typeof data === 'string') {\n // default to x-www-form-urlencoded\n if (!type) this.type('form');\n type = this._header['content-type'];\n\n if (type === 'application/x-www-form-urlencoded') {\n this._data = this._data ? \"\".concat(this._data, \"&\").concat(data) : data;\n } else {\n this._data = (this._data || '') + data;\n }\n } else {\n this._data = data;\n }\n\n if (!isObj || this._isHost(data)) {\n return this;\n } // default to json\n\n\n if (!type) this.type('json');\n return this;\n};\n/**\n * Sort `querystring` by the sort function\n *\n *\n * Examples:\n *\n * // default order\n * request.get('/user')\n * .query('name=Nick')\n * .query('search=Manny')\n * .sortQuery()\n * .end(callback)\n *\n * // customized sort function\n * request.get('/user')\n * .query('name=Nick')\n * .query('search=Manny')\n * .sortQuery(function(a, b){\n * return a.length - b.length;\n * })\n * .end(callback)\n *\n *\n * @param {Function} sort\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequestBase.prototype.sortQuery = function (sort) {\n // _sort default to true but otherwise can be a function or boolean\n this._sort = typeof sort === 'undefined' ? true : sort;\n return this;\n};\n/**\n * Compose querystring to append to req.url\n *\n * @api private\n */\n\n\nRequestBase.prototype._finalizeQueryString = function () {\n var query = this._query.join('&');\n\n if (query) {\n this.url += (this.url.includes('?') ? '&' : '?') + query;\n }\n\n this._query.length = 0; // Makes the call idempotent\n\n if (this._sort) {\n var index = this.url.indexOf('?');\n\n if (index >= 0) {\n var queryArr = this.url.slice(index + 1).split('&');\n\n if (typeof this._sort === 'function') {\n queryArr.sort(this._sort);\n } else {\n queryArr.sort();\n }\n\n this.url = this.url.slice(0, index) + '?' + queryArr.join('&');\n }\n }\n}; // For backwards compat only\n\n\nRequestBase.prototype._appendQueryString = function () {\n console.warn('Unsupported');\n};\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\n\nRequestBase.prototype._timeoutError = function (reason, timeout, errno) {\n if (this._aborted) {\n return;\n }\n\n var err = new Error(\"\".concat(reason + timeout, \"ms exceeded\"));\n err.timeout = timeout;\n err.code = 'ECONNABORTED';\n err.errno = errno;\n this.timedout = true;\n this.timedoutError = err;\n this.abort();\n this.callback(err);\n};\n\nRequestBase.prototype._setTimeouts = function () {\n var self = this; // deadline\n\n if (this._timeout && !this._timer) {\n this._timer = setTimeout(function () {\n self._timeoutError('Timeout of ', self._timeout, 'ETIME');\n }, this._timeout);\n } // response timeout\n\n\n if (this._responseTimeout && !this._responseTimeoutTimer) {\n this._responseTimeoutTimer = setTimeout(function () {\n self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');\n }, this._responseTimeout);\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LWJhc2UuanMiXSwibmFtZXMiOlsiaXNPYmplY3QiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsIlJlcXVlc3RCYXNlIiwib2JqIiwibWl4aW4iLCJrZXkiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJjbGVhclRpbWVvdXQiLCJfdGltZXIiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJfdXBsb2FkVGltZW91dFRpbWVyIiwicGFyc2UiLCJmbiIsIl9wYXJzZXIiLCJyZXNwb25zZVR5cGUiLCJ2YWwiLCJfcmVzcG9uc2VUeXBlIiwic2VyaWFsaXplIiwiX3NlcmlhbGl6ZXIiLCJ0aW1lb3V0Iiwib3B0aW9ucyIsIl90aW1lb3V0IiwiX3Jlc3BvbnNlVGltZW91dCIsIl91cGxvYWRUaW1lb3V0Iiwib3B0aW9uIiwiZGVhZGxpbmUiLCJyZXNwb25zZSIsInVwbG9hZCIsImNvbnNvbGUiLCJ3YXJuIiwicmV0cnkiLCJjb3VudCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIl9tYXhSZXRyaWVzIiwiX3JldHJpZXMiLCJfcmV0cnlDYWxsYmFjayIsIkVSUk9SX0NPREVTIiwiX3Nob3VsZFJldHJ5IiwiZXJyIiwicmVzIiwib3ZlcnJpZGUiLCJlcnJfIiwiZXJyb3IiLCJzdGF0dXMiLCJjb2RlIiwiaW5jbHVkZXMiLCJjcm9zc0RvbWFpbiIsIl9yZXRyeSIsInJlcSIsInJlcXVlc3QiLCJfYWJvcnRlZCIsInRpbWVkb3V0IiwidGltZWRvdXRFcnJvciIsIl9lbmQiLCJ0aGVuIiwicmVzb2x2ZSIsInJlamVjdCIsIl9mdWxsZmlsbGVkUHJvbWlzZSIsInNlbGYiLCJfZW5kQ2FsbGVkIiwiUHJvbWlzZSIsIm9uIiwiRXJyb3IiLCJtZXRob2QiLCJ1cmwiLCJlbmQiLCJjYXRjaCIsImNiIiwidW5kZWZpbmVkIiwidXNlIiwib2siLCJfb2tDYWxsYmFjayIsIl9pc1Jlc3BvbnNlT0siLCJnZXQiLCJmaWVsZCIsIl9oZWFkZXIiLCJ0b0xvd2VyQ2FzZSIsImdldEhlYWRlciIsInNldCIsImhlYWRlciIsInVuc2V0IiwibmFtZSIsIl9kYXRhIiwiQXJyYXkiLCJpc0FycmF5IiwiaSIsIlN0cmluZyIsIl9nZXRGb3JtRGF0YSIsImFwcGVuZCIsImFib3J0IiwieGhyIiwiZW1pdCIsIl9hdXRoIiwidXNlciIsInBhc3MiLCJiYXNlNjRFbmNvZGVyIiwidHlwZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJ3aXRoQ3JlZGVudGlhbHMiLCJfd2l0aENyZWRlbnRpYWxzIiwicmVkaXJlY3RzIiwibiIsIl9tYXhSZWRpcmVjdHMiLCJtYXhSZXNwb25zZVNpemUiLCJUeXBlRXJyb3IiLCJfbWF4UmVzcG9uc2VTaXplIiwidG9KU09OIiwiZGF0YSIsImhlYWRlcnMiLCJzZW5kIiwiaXNPYmoiLCJfZm9ybURhdGEiLCJfaXNIb3N0Iiwic29ydFF1ZXJ5Iiwic29ydCIsIl9zb3J0IiwiX2ZpbmFsaXplUXVlcnlTdHJpbmciLCJxdWVyeSIsIl9xdWVyeSIsImpvaW4iLCJpbmRleCIsImluZGV4T2YiLCJxdWVyeUFyciIsInNsaWNlIiwic3BsaXQiLCJfYXBwZW5kUXVlcnlTdHJpbmciLCJfdGltZW91dEVycm9yIiwicmVhc29uIiwiZXJybm8iLCJjYWxsYmFjayIsIl9zZXRUaW1lb3V0cyIsInNldFRpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7O0FBR0EsSUFBTUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsYUFBRCxDQUF4QjtBQUVBOzs7OztBQUlBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJDLFdBQWpCO0FBRUE7Ozs7OztBQU1BLFNBQVNBLFdBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCO0FBQ3hCLE1BQUlBLEdBQUosRUFBUyxPQUFPQyxLQUFLLENBQUNELEdBQUQsQ0FBWjtBQUNWO0FBRUQ7Ozs7Ozs7OztBQVFBLFNBQVNDLEtBQVQsQ0FBZUQsR0FBZixFQUFvQjtBQUNsQixPQUFLLElBQU1FLEdBQVgsSUFBa0JI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MEQ7QUFDeEQsU0FBS0EscUJBQUwsR0FBNkI0SCxVQUFVLENBQUMsWUFBTTtBQUM1QzFFLE1BQUFBLElBQUksQ0FBQ3FFLGFBQUwsQ0FDRSxzQkFERixFQUVFckUsSUFBSSxDQUFDckMsZ0JBRlAsRUFHRSxXQUhGO0FBS0QsS0FOc0MsRUFNcEMsS0FBS0EsZ0JBTitCLENBQXZDO0FBT0Q7QUFDRixDQXBCRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIG9mIG1peGVkLWluIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiBub2RlIGFuZCBjbGllbnQgY29kZVxuICovXG5jb25zdCBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0QmFzZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0QmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0QmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0QmFzZShvYmopIHtcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XG59XG5cbi8qKlxuICogTWl4aW4gdGhlIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBSZXF1ZXN0QmFzZS5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJlcXVlc3RCYXNlLnByb3RvdHlwZSwga2V5KSlcbiAgICAgIG9ialtrZXldID0gUmVxdWVzdEJhc2UucHJvdG90eXBlW2tleV07XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwbG9hZFRpbWVvdXRUaW1lcik7XG4gIGRlbGV0ZSB0aGlzLl90aW1lcjtcbiAgZGVsZXRlIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyO1xuICBkZWxldGUgdGhpcy5fdXBsb2FkVGltZW91dFRpbWVyO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXNwb25zZSBib2R5IHBhcnNlclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBpbmNvbWluZyBkYXRhIGludG8gcmVxdWVzdC5ib2R5XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oZm4pIHtcbiAgdGhpcy5fcGFyc2VyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgZm9ybWF0IG9mIGJpbmFyeSByZXNwb25zZSBib2R5LlxuICogSW4gYnJvd3NlciB2YWxpZCBmb3JtYXRzIGFyZSAnYmxvYicgYW5kICdhcnJheWJ1ZmZlcicsXG4gKiB3aGljaCByZXR1cm4gQmxvYiBhbmQgQXJyYXlCdWZmZXIsIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBJbiBOb2RlIGFsbCB2YWx1ZXMgcmVzdWx0IGluIEJ1ZmZlci5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5yZXNwb25zZVR5cGUoJ2Jsb2InKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmVzcG9uc2VUeXBlID0gZnVuY3Rpb24odmFsKSB7XG4gIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIGRlZmF1bHQgcmVxdWVzdCBib2R5IHNlcmlhbGl6ZXJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGNvbnZlcnQgZGF0YSBzZXQgdmlhIC5zZW5kIG9yIC5hdHRhY2ggaW50byBwYXlsb2FkIHRvIHNlbmRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24oZm4pIHtcbiAgdGhpcy5fc2VyaWFsaXplciA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRpbWVvdXRzLlxuICpcbiAqIC0gcmVzcG9uc2UgdGltZW91dCBpcyB0aW1lIGJldHdlZW4gc2VuZGluZyByZXF1ZXN0IGFuZCByZWNlaXZpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3BvbnNlLiBJbmNsdWRlcyBETlMgYW5kIGNvbm5lY3Rpb24gdGltZS5cbiAqIC0gZGVhZGxpbmUgaXMgdGhlIHRpbWUgZnJvbSBzdGFydCBvZiB0aGUgcmVxdWVzdCB0byByZWNlaXZpbmcgcmVzcG9uc2UgYm9keSBpbiBmdWxsLiBJZiB0aGUgZGVhZGxpbmUgaXMgdG9vIHNob3J0IGxhcmdlIGZpbGVzIG1heSBub3QgbG9hZCBhdCBhbGwgb24gc2xvdyBjb25uZWN0aW9ucy5cbiAqIC0gdXBsb2FkIGlzIHRoZSB0aW1lICBzaW5jZSBsYXN0IGJpdCBvZiBkYXRhIHdhcyBzZW50IG9yIHJlY2VpdmVkLiBUaGlzIHRpbWVvdXQgd29ya3Mgb25seSBpZiBkZWFkbGluZSB0aW1lb3V0IGlzIG9mZlxuICpcbiAqIFZhbHVlIG9mIDAgb3IgZmFsc2UgbWVhbnMgbm8gdGltZW91dC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcnxPYmplY3R9IG1zIG9yIHtyZXNwb25zZSwgZGVhZGxpbmV9XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucztcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSAwO1xuICAgIHRoaXMuX3VwbG9hZFRpbWVvdXQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgb3B0aW9uKSkge1xuICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgY2FzZSAnZGVhZGxpbmUnOlxuICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBvcHRpb25zLmRlYWRsaW5lO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZXNwb25zZSc6XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0ID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXBsb2FkJzpcbiAgICAgICAgICB0aGlzLl91cGxvYWRUaW1lb3V0ID0gb3B0aW9ucy51cGxvYWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIHRpbWVvdXQgb3B0aW9uJywgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBvbiBlcnJvci5cbiAqXG4gKiBGYWlsZWQgcmVxdWVzdHMgd2lsbCBiZSByZXRyaWVkICdjb3VudCcgdGltZXMgaWYgdGltZW91dCBvciBlcnIuY29kZSA+PSA1MDAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJldHJ5ID0gZnVuY3Rpb24oY291bnQsIGZuKSB7XG4gIC8vIERlZmF1bHQgdG8gMSBpZiBubyBjb3VudCBwYXNzZWQgb3IgdHJ1ZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBjb3VudCA9PT0gdHJ1ZSkgY291bnQgPSAxO1xuICBpZiAoY291bnQgPD0gMCkgY291bnQgPSAwO1xuICB0aGlzLl9tYXhSZXRyaWVzID0gY291bnQ7XG4gIHRoaXMuX3JldHJpZXMgPSAwO1xuICB0aGlzLl9yZXRyeUNhbGxiYWNrID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuY29uc3QgRVJST1JfQ09ERVMgPSBbJ0VDT05OUkVTRVQnLCAnRVRJTUVET1VUJywgJ0VBRERSSU5GTycsICdFU09DS0VUVElNRURPVVQnXTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSByZXF1ZXN0IHNob3VsZCBiZSByZXRyaWVkLlxuICogKEJvcnJvd2VkIGZyb20gc2VnbWVudGlvL3N1cGVyYWdlbnQtcmV0cnkpXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyIGFuIGVycm9yXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSBbcmVzXSByZXNwb25zZVxuICogQHJldHVybnMge0Jvb2xlYW59IGlmIHNlZ21lbnQgc2hvdWxkIGJlIHJldHJpZWRcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9zaG91bGRSZXRyeSA9IGZ1bmN0aW9uKGVyciwgcmVzKSB7XG4gIGlmICghdGhpcy5fbWF4UmV0cmllcyB8fCB0aGlzLl9yZXRyaWVzKysgPj0gdGhpcy5fbWF4UmV0cmllcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9yZXRyeUNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5fcmV0cnlDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG92ZXJyaWRlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gdW5kZWZpbmVkIGZhbGxzIGJhY2sgdG8gZGVmYXVsdHNcbiAgICB9IGNhdGNoIChlcnJfKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycl8pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXMgJiYgcmVzLnN0YXR1cyAmJiByZXMuc3RhdHVzID49IDUwMCAmJiByZXMuc3RhdHVzICE9PSA1MDEpIHJldHVybiB0cnVlO1xuICBpZiAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICYmIEVSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gU3VwZXJhZ2VudCB0aW1lb3V0XG4gICAgaWYgKGVyci50aW1lb3V0ICYmIGVyci5jb2RlID09PSAnRUNPTk5BQk9SVEVEJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVyci5jcm9zc0RvbWFpbikgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHJ5IHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fcmV0cnkgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcblxuICAvLyBub2RlXG4gIGlmICh0aGlzLnJlcSkge1xuICAgIHRoaXMucmVxID0gbnVsbDtcbiAgICB0aGlzLnJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICB9XG5cbiAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnRpbWVkb3V0ID0gZmFsc2U7XG4gIHRoaXMudGltZWRvdXRFcnJvciA9IG51bGw7XG5cbiAgcmV0dXJuIHRoaXMuX2VuZCgpO1xufTtcblxuLyoqXG4gKiBQcm9taXNlIHN1cHBvcnRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVqZWN0XVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICBpZiAoIXRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnV2FybmluZzogc3VwZXJhZ2VudCByZXF1ZXN0IHdhcyBzZW50IHR3aWNlLCBiZWNhdXNlIGJvdGggLmVuZCgpIGFuZCAudGhlbigpIHdlcmUgY2FsbGVkLiBOZXZlciBjYWxsIC5lbmQoKSBpZiB5b3UgdXNlIHByb21pc2VzJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlbGYub24oJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50aW1lZG91dCAmJiB0aGlzLnRpbWVkb3V0RXJyb3IpIHtcbiAgICAgICAgICByZWplY3QodGhpcy50aW1lZG91dEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0Fib3J0ZWQnKTtcbiAgICAgICAgZXJyLmNvZGUgPSAnQUJPUlRFRCc7XG4gICAgICAgIGVyci5zdGF0dXMgPSB0aGlzLnN0YXR1cztcbiAgICAgICAgZXJyLm1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICAgICAgICBlcnIudXJsID0gdGhpcy51cmw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG4gICAgICBzZWxmLmVuZCgoZXJyLCByZXMpID0+IHtcbiAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG4gICAgICAgIGVsc2UgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZnVsbGZpbGxlZFByb21pc2UudGhlbihyZXNvbHZlLCByZWplY3QpO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLmNhdGNoID0gZnVuY3Rpb24oY2IpIHtcbiAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIGNiKTtcbn07XG5cbi8qKlxuICogQWxsb3cgZm9yIGV4dGVuc2lvblxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbihmbikge1xuICBmbih0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUub2sgPSBmdW5jdGlvbihjYikge1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIHJlcXVpcmVkJyk7XG4gIHRoaXMuX29rQ2FsbGJhY2sgPSBjYjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2lzUmVzcG9uc2VPSyA9IGZ1bmN0aW9uKHJlcykge1xuICBpZiAoIXJlcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9va0NhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuX29rQ2FsbGJhY2socmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDwgMzAwO1xufTtcblxuLyoqXG4gKiBHZXQgcmVxdWVzdCBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihmaWVsZCkge1xuICByZXR1cm4gdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBoZWFkZXIgYGZpZWxkYCB2YWx1ZS5cbiAqIFRoaXMgaXMgYSBkZXByZWNhdGVkIGludGVybmFsIEFQSS4gVXNlIGAuZ2V0KGZpZWxkKWAgaW5zdGVhZC5cbiAqXG4gKiAoZ2V0SGVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN1cGVyYWdlbnQgY29kZSBiYXNlKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXRIZWFkZXIgPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNldCgnWC1BUEktS2V5JywgJ2Zvb2JhcicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdYLUFQSS1LZXknOiAnZm9vYmFyJyB9KVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCkge1xuICBpZiAoaXNPYmplY3QoZmllbGQpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGQpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIGtleSkpXG4gICAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV0gPSB2YWw7XG4gIHRoaXMuaGVhZGVyW2ZpZWxkXSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC51bnNldCgnVXNlci1BZ2VudCcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkIGZpZWxkIG5hbWVcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpIHtcbiAgZGVsZXRlIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgZGVsZXRlIHRoaXMuaGVhZGVyW2ZpZWxkXTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0XG4gKiBmb3IgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoeyBmb286ICdiYXInLCBiYXo6ICdxdXgnIH0pXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBuYW1lIG5hbWUgb2YgZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfEJsb2J8RmlsZXxCdWZmZXJ8ZnMuUmVhZFN0cmVhbX0gdmFsIHZhbHVlIG9mIGZpZWxkXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuICAvLyBuYW1lIHNob3VsZCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LlxuICBpZiAobmFtZSA9PT0gbnVsbCB8fCB1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIG5hbWUgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIi5maWVsZCgpIGNhbid0IGJlIHVzZWQgaWYgLnNlbmQoKSBpcyB1c2VkLiBQbGVhc2UgdXNlIG9ubHkgLnNlbmQoKSBvciBvbmx5IC5maWVsZCgpICYgLmF0dGFjaCgpXCJcbiAgICApO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmFtZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuYW1lLCBrZXkpKVxuICAgICAgICB0aGlzLmZpZWxkKGtleSwgbmFtZVtrZXldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gdmFsKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgaSkpXG4gICAgICAgIHRoaXMuZmllbGQobmFtZSwgdmFsW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHZhbCBzaG91bGQgYmUgZGVmaW5lZCBub3dcbiAgaWYgKHZhbCA9PT0gbnVsbCB8fCB1bmRlZmluZWQgPT09IHZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLmZpZWxkKG5hbWUsIHZhbCkgdmFsIGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICB2YWwgPSBTdHJpbmcodmFsKTtcbiAgfVxuXG4gIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKG5hbWUsIHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBYm9ydCB0aGUgcmVxdWVzdCwgYW5kIGNsZWFyIHBvdGVudGlhbCB0aW1lb3V0LlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IHJlcXVlc3RcbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIGlmICh0aGlzLnhocikgdGhpcy54aHIuYWJvcnQoKTsgLy8gYnJvd3NlclxuICBpZiAodGhpcy5yZXEpIHRoaXMucmVxLmFib3J0KCk7IC8vIG5vZGVcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGJhc2U2NEVuY29kZXIpIHtcbiAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICBjYXNlICdiYXNpYyc6XG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCYXNpYyAke2Jhc2U2NEVuY29kZXIoYCR7dXNlcn06JHtwYXNzfWApfWApO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhdXRvJzpcbiAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VyO1xuICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3M7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlYXJlcic6IC8vIHVzYWdlIHdvdWxkIGJlIC5hdXRoKGFjY2Vzc1Rva2VuLCB7IHR5cGU6ICdiZWFyZXInIH0pXG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt1c2VyfWApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS53aXRoQ3JlZGVudGlhbHMgPSBmdW5jdGlvbihvbikge1xuICAvLyBUaGlzIGlzIGJyb3dzZXItb25seSBmdW5jdGlvbmFsaXR5LiBOb2RlIHNpZGUgaXMgbm8tb3AuXG4gIGlmIChvbiA9PT0gdW5kZWZpbmVkKSBvbiA9IHRydWU7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IG9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYXggcmVkaXJlY3RzIHRvIGBuYC4gRG9lcyBub3RoaW5nIGluIGJyb3dzZXIgWEhSIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJlZGlyZWN0cyA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5fbWF4UmVkaXJlY3RzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE1heGltdW0gc2l6ZSBvZiBidWZmZXJlZCByZXNwb25zZSBib2R5LCBpbiBieXRlcy4gQ291bnRzIHVuY29tcHJlc3NlZCBzaXplLlxuICogRGVmYXVsdCAyMDBNQi5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbiBudW1iZXIgb2YgYnl0ZXNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUubWF4UmVzcG9uc2VTaXplID0gZnVuY3Rpb24obikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgdGhpcy5fbWF4UmVzcG9uc2VTaXplID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdG8gYSBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdCAobm90IEpTT04gc3RyaW5nKSBvZiBzY2FsYXIgcHJvcGVydGllcy5cbiAqIE5vdGUgYXMgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcmV0dXJuIGEgdXNlZnVsIG5vbi10aGlzIHZhbHVlLFxuICogaXQgY2Fubm90IGJlIGNoYWluZWQuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBkZXNjcmliaW5nIG1ldGhvZCwgdXJsLCBhbmQgZGF0YSBvZiB0aGlzIHJlcXVlc3RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgdXJsOiB0aGlzLnVybCxcbiAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgIGhlYWRlcnM6IHRoaXMuX2hlYWRlclxuICB9O1xufTtcblxuLyoqXG4gKiBTZW5kIGBkYXRhYCBhcyB0aGUgcmVxdWVzdCBib2R5LCBkZWZhdWx0aW5nIHRoZSBgLnR5cGUoKWAgdG8gXCJqc29uXCIgd2hlblxuICogYW4gb2JqZWN0IGlzIGdpdmVuLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIG1hbnVhbCBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2pzb24nKVxuICogICAgICAgICAuc2VuZCgne1wibmFtZVwiOlwidGpcIn0nKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8ganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIG1hbnVhbCB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKCduYW1lPXRqJylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gZGVmYXVsdHMgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKCduYW1lPXRvYmknKVxuICogICAgICAgIC5zZW5kKCdzcGVjaWVzPWZlcnJldCcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihkYXRhKSB7XG4gIGNvbnN0IGlzT2JqID0gaXNPYmplY3QoZGF0YSk7XG4gIGxldCB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcblxuICBpZiAodGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIi5zZW5kKCkgY2FuJ3QgYmUgdXNlZCBpZiAuYXR0YWNoKCkgb3IgLmZpZWxkKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiXG4gICAgKTtcbiAgfVxuXG4gIGlmIChpc09iaiAmJiAhdGhpcy5fZGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEgJiYgdGhpcy5fZGF0YSAmJiB0aGlzLl9pc0hvc3QodGhpcy5fZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtZXJnZSB0aGVzZSBzZW5kIGNhbGxzXCIpO1xuICB9XG5cbiAgLy8gbWVyZ2VcbiAgaWYgKGlzT2JqICYmIGlzT2JqZWN0KHRoaXMuX2RhdGEpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKVxuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSBkYXRhW2tleV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIGRlZmF1bHQgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2Zvcm0nKTtcbiAgICB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgICBpZiAodHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhID8gYCR7dGhpcy5fZGF0YX0mJHtkYXRhfWAgOiBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gKHRoaXMuX2RhdGEgfHwgJycpICsgZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoIWlzT2JqIHx8IHRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZGVmYXVsdCB0byBqc29uXG4gIGlmICghdHlwZSkgdGhpcy50eXBlKCdqc29uJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTb3J0IGBxdWVyeXN0cmluZ2AgYnkgdGhlIHNvcnQgZnVuY3Rpb25cbiAqXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gZGVmYXVsdCBvcmRlclxuICogICAgICAgcmVxdWVzdC5nZXQoJy91c2VyJylcbiAqICAgICAgICAgLnF1ZXJ5KCduYW1lPU5pY2snKVxuICogICAgICAgICAucXVlcnkoJ3NlYXJjaD1NYW5ueScpXG4gKiAgICAgICAgIC5zb3J0UXVlcnkoKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGN1c3RvbWl6ZWQgc29ydCBmdW5jdGlvblxuICogICAgICAgcmVxdWVzdC5nZXQoJy91c2VyJylcbiAqICAgICAgICAgLnF1ZXJ5KCduYW1lPU5pY2snKVxuICogICAgICAgICAucXVlcnkoJ3NlYXJjaD1NYW5ueScpXG4gKiAgICAgICAgIC5zb3J0UXVlcnkoZnVuY3Rpb24oYSwgYil7XG4gKiAgICAgICAgICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gKiAgICAgICAgIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNvcnRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc29ydFF1ZXJ5ID0gZnVuY3Rpb24oc29ydCkge1xuICAvLyBfc29ydCBkZWZhdWx0IHRvIHRydWUgYnV0IG90aGVyd2lzZSBjYW4gYmUgYSBmdW5jdGlvbiBvciBib29sZWFuXG4gIHRoaXMuX3NvcnQgPSB0eXBlb2Ygc29ydCA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogc29ydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbXBvc2UgcXVlcnlzdHJpbmcgdG8gYXBwZW5kIHRvIHJlcS51cmxcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9maW5hbGl6ZVF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fcXVlcnkuam9pbignJicpO1xuICBpZiAocXVlcnkpIHtcbiAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JykgKyBxdWVyeTtcbiAgfVxuXG4gIHRoaXMuX3F1ZXJ5Lmxlbmd0aCA9IDA7IC8vIE1ha2VzIHRoZSBjYWxsIGlkZW1wb3RlbnRcblxuICBpZiAodGhpcy5fc29ydCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy51cmwuaW5kZXhPZignPycpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBxdWVyeUFyciA9IHRoaXMudXJsLnNsaWNlKGluZGV4ICsgMSkuc3BsaXQoJyYnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fc29ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBxdWVyeUFyci5zb3J0KHRoaXMuX3NvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlBcnIuc29ydCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnNsaWNlKDAsIGluZGV4KSArICc/JyArIHF1ZXJ5QXJyLmpvaW4oJyYnKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEZvciBiYWNrd2FyZHMgY29tcGF0IG9ubHlcblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXBwZW5kUXVlcnlTdHJpbmcgPSAoKSA9PiB7XG4gIGNvbnNvbGUud2FybignVW5zdXBwb3J0ZWQnKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3RpbWVvdXRFcnJvciA9IGZ1bmN0aW9uKHJlYXNvbiwgdGltZW91dCwgZXJybm8pIHtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYCR7cmVhc29uICsgdGltZW91dH1tcyBleGNlZWRlZGApO1xuICBlcnIudGltZW91dCA9IHRpbWVvdXQ7XG4gIGVyci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gIGVyci5lcnJubyA9IGVycm5vO1xuICB0aGlzLnRpbWVkb3V0ID0gdHJ1ZTtcbiAgdGhpcy50aW1lZG91dEVycm9yID0gZXJyO1xuICB0aGlzLmFib3J0KCk7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHMgPSBmdW5jdGlvbigpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZGVhZGxpbmVcbiAgaWYgKHRoaXMuX3RpbWVvdXQgJiYgIXRoaXMuX3RpbWVyKSB7XG4gICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcignVGltZW91dCBvZiAnLCBzZWxmLl90aW1lb3V0LCAnRVRJTUUnKTtcbiAgICB9LCB0aGlzLl90aW1lb3V0KTtcbiAgfVxuXG4gIC8vIHJlc3BvbnNlIHRpbWVvdXRcbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVGltZW91dCAmJiAhdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2VsZi5fdGltZW91dEVycm9yKFxuICAgICAgICAnUmVzcG9uc2UgdGltZW91dCBvZiAnLFxuICAgICAgICBzZWxmLl9yZXNwb25zZVRpbWVvdXQsXG4gICAgICAgICdFVElNRURPVVQnXG4gICAgICApO1xuICAgIH0sIHRoaXMuX3Jlc3BvbnNlVGltZW91dCk7XG4gIH1cbn07XG4iXX0=","\"use strict\";\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\nexports.type = function (str) {\n return str.split(/ *; */).shift();\n};\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\n\nexports.params = function (str) {\n return str.split(/ *; */).reduce(function (obj, str) {\n var parts = str.split(/ *= */);\n var key = parts.shift();\n var val = parts.shift();\n if (key && val) obj[key] = val;\n return obj;\n }, {});\n};\n/**\n * Parse Link header fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\n\nexports.parseLinks = function (str) {\n return str.split(/ *, */).reduce(function (obj, str) {\n var parts = str.split(/ *; */);\n var url = parts[0].slice(1, -1);\n var rel = parts[1].split(/ *= */)[1].slice(1, -1);\n obj[rel] = url;\n return obj;\n }, {});\n};\n/**\n * Strip content related fields from `header`.\n *\n * @param {Object} header\n * @return {Object} header\n * @api private\n */\n\n\nexports.cleanHeader = function (header, changesOrigin) {\n delete header['content-type'];\n delete header['content-length'];\n delete header['transfer-encoding'];\n delete header.host; // secuirty\n\n if (changesOrigin) {\n delete header.authorization;\n delete header.cookie;\n }\n\n return header;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJleHBvcnRzIiwidHlwZSIsInN0ciIsInNwbGl0Iiwic2hpZnQiLCJwYXJhbXMiLCJyZWR1Y2UiLCJvYmoiLCJwYXJ0cyIsImtleSIsInZhbCIsInBhcnNlTGlua3MiLCJ1cmwiLCJzbGljZSIsInJlbCIsImNsZWFuSGVhZGVyIiwiaGVhZGVyIiwiY2hhbmdlc09yaWdpbiIsImhvc3QiLCJhdXRob3JpemF0aW9uIiwiY29va2llIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7O0FBUUFBLE9BQU8sQ0FBQ0MsSUFBUixHQUFlLFVBQUFDLEdBQUc7QUFBQSxTQUFJQSxHQUFHLENBQUNDLEtBQUosQ0FBVSxPQUFWLEVBQW1CQyxLQUFuQixFQUFKO0FBQUEsQ0FBbEI7QUFFQTs7Ozs7Ozs7O0FBUUFKLE9BQU8sQ0FBQ0ssTUFBUixHQUFpQixVQUFBSCxHQUFHO0FBQUEsU0FDbEJBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLE9BQVYsRUFBbUJHLE1BQW5CLENBQTBCLFVBQUNDLEdBQUQsRUFBTUwsR0FBTixFQUFjO0FBQ3RDLFFBQU1NLEtBQUssR0FBR04sR0FBRyxDQUFDQyxLQUFKLENBQVUsT0FBVixDQUFkO0FBQ0EsUUFBTU0sR0FBRyxHQUFHRCxLQUFLLENBQUNKLEtBQU4sRUFBWjtBQUNBLFFBQU1NLEdBQUcsR0FBR0YsS0FBSyxDQUFDSixLQUFOLEVBQVo7QUFFQSxRQUFJSyxHQUFHLElBQUlDLEdBQVgsRUFBZ0JILEdBQUcsQ0FBQ0UsR0FBRCxDQUFILEdBQVdDLEdBQVg7QUFDaEIsV0FBT0gsR0FBUDtBQUNELEdBUEQsRUFPRyxFQVBILENBRGtCO0FBQUEsQ0FBcEI7QUFVQTs7Ozs7Ozs7O0FBUUFQLE9BQU8sQ0FBQ1csVUFBUixHQUFxQixVQUFBVCxHQUFHO0FBQUEsU0FDdEJBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLE9BQVYsRUFBbUJHLE1BQW5CLENBQTBCLFVBQUNDLEdBQUQsRUFBTUwsR0FBTixFQUFjO0FBQ3RDLFFBQU1NLEtBQUssR0FBR04sR0FBRyxDQUFDQyxLQUFKLENBQVUsT0FBVixDQUFkO0FBQ0EsUUFBTVMsR0FBRyxHQUFHSixLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVNLLEtBQVQsQ0FBZSxDQUFmLEVBQWtCLENBQUMsQ0FBbkIsQ0FBWjtBQUNBLFFBQU1DLEdBQUcsR0FBR04sS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTTCxLQUFULENBQWUsT0FBZixFQUF3QixDQUF4QixFQUEyQlUsS0FBM0IsQ0FBaUMsQ0FBakMsRUFBb0MsQ0FBQyxDQUFyQyxDQUFaO0FBQ0FOLElBQUFBLEdBQUcsQ0FBQ08sR0FBRCxDQUFILEdBQVdGLEdBQVg7QUFDQSxXQUFPTCxHQUFQO0FBQ0QsR0FORCxFQU1HLEVBTkgsQ0FEc0I7QUFBQSxDQUF4QjtBQVNBOzs7Ozs7Ozs7QUFRQVAsT0FBTyxDQUFDZSxXQUFSLEdBQXNCLFVBQUNDLE1BQUQsRUFBU0MsYUFBVCxFQUEyQjtBQUMvQyxTQUFPRCxNQUFNLENBQUMsY0FBRCxDQUFiO0FBQ0EsU0FBT0EsTUFBTSxDQUFDLGdCQUFELENBQWI7QUFDQSxTQUFPQSxNQUFNLENBQUMsbUJBQUQsQ0FBYjtBQUNBLFNBQU9BLE1BQU0sQ0FBQ0UsSUFBZCxDQUorQyxDQUsvQzs7QUFDQSxNQUFJRCxhQUFKLEVBQW1CO0FBQ2pCLFdBQU9ELE1BQU0sQ0FBQ0csYUFBZDtBQUNBLFdBQU9ILE1BQU0sQ0FBQ0ksTUFBZDtBQUNEOztBQUVELFNBQU9KLE1BQVA7QUFDRCxDQVpEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXR1cm4gdGhlIG1pbWUgdHlwZSBmb3IgdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMudHlwZSA9IHN0ciA9PiBzdHIuc3BsaXQoLyAqOyAqLykuc2hpZnQoKTtcblxuLyoqXG4gKiBSZXR1cm4gaGVhZGVyIGZpZWxkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5wYXJhbXMgPSBzdHIgPT5cbiAgc3RyLnNwbGl0KC8gKjsgKi8pLnJlZHVjZSgob2JqLCBzdHIpID0+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHN0ci5zcGxpdCgvICo9ICovKTtcbiAgICBjb25zdCBrZXkgPSBwYXJ0cy5zaGlmdCgpO1xuICAgIGNvbnN0IHZhbCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xuXG4vKipcbiAqIFBhcnNlIExpbmsgaGVhZGVyIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcnNlTGlua3MgPSBzdHIgPT5cbiAgc3RyLnNwbGl0KC8gKiwgKi8pLnJlZHVjZSgob2JqLCBzdHIpID0+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHN0ci5zcGxpdCgvICo7ICovKTtcbiAgICBjb25zdCB1cmwgPSBwYXJ0c1swXS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgcmVsID0gcGFydHNbMV0uc3BsaXQoLyAqPSAqLylbMV0uc2xpY2UoMSwgLTEpO1xuICAgIG9ialtyZWxdID0gdXJsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcblxuLyoqXG4gKiBTdHJpcCBjb250ZW50IHJlbGF0ZWQgZmllbGRzIGZyb20gYGhlYWRlcmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQHJldHVybiB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuY2xlYW5IZWFkZXIgPSAoaGVhZGVyLCBjaGFuZ2VzT3JpZ2luKSA9PiB7XG4gIGRlbGV0ZSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LWxlbmd0aCddO1xuICBkZWxldGUgaGVhZGVyWyd0cmFuc2Zlci1lbmNvZGluZyddO1xuICBkZWxldGUgaGVhZGVyLmhvc3Q7XG4gIC8vIHNlY3VpcnR5XG4gIGlmIChjaGFuZ2VzT3JpZ2luKSB7XG4gICAgZGVsZXRlIGhlYWRlci5hdXRob3JpemF0aW9uO1xuICAgIGRlbGV0ZSBoZWFkZXIuY29va2llO1xuICB9XG5cbiAgcmV0dXJuIGhlYWRlcjtcbn07XG4iXX0=","\"use strict\";\n\n/**\n * Module dependencies.\n */\nvar utils = require('./utils');\n/**\n * Expose `ResponseBase`.\n */\n\n\nmodule.exports = ResponseBase;\n/**\n * Initialize a new `ResponseBase`.\n *\n * @api public\n */\n\nfunction ResponseBase(obj) {\n if (obj) return mixin(obj);\n}\n/**\n * Mixin the prototype properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\n\nfunction mixin(obj) {\n for (var key in ResponseBase.prototype) {\n if (Object.prototype.hasOwnProperty.call(ResponseBase.prototype, key)) obj[key] = ResponseBase.prototype[key];\n }\n\n return obj;\n}\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\n\nResponseBase.prototype.get = function (field) {\n return this.header[field.toLowerCase()];\n};\n/**\n * Set header related properties:\n *\n * - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\n\nResponseBase.prototype._setHeaderProperties = function (header) {\n // TODO: moar!\n // TODO: make this a util\n // content-type\n var ct = header['content-type'] || '';\n this.type = utils.type(ct); // params\n\n var params = utils.params(ct);\n\n for (var key in params) {\n if (Object.prototype.hasOwnProperty.call(params, key)) this[key] = params[key];\n }\n\n this.links = {}; // links\n\n try {\n if (header.link) {\n this.links = utils.parseLinks(header.link);\n }\n } catch (_unused) {// ignore\n }\n};\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n * - .noContent\n * - .badRequest\n * - .unauthorized\n * - .notAcceptable\n * - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\n\nResponseBase.prototype._setStatusProperties = function (status) {\n var type = status / 100 | 0; // status / class\n\n this.statusCode = status;\n this.status = this.statusCode;\n this.statusType = type; // basics\n\n this.info = type === 1;\n this.ok = type === 2;\n this.redirect = type === 3;\n this.clientError = type === 4;\n this.serverError = type === 5;\n this.error = type === 4 || type === 5 ? this.toError() : false; // sugar\n\n this.created = status === 201;\n this.accepted = status === 202;\n this.noContent = status === 204;\n this.badRequest = status === 400;\n this.unauthorized = status === 401;\n this.notAcceptable = status === 406;\n this.forbidden = status === 403;\n this.notFound = status === 404;\n this.unprocessableEntity = status === 422;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXNwb25zZS1iYXNlLmpzIl0sIm5hbWVzIjpbInV0aWxzIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJSZXNwb25zZUJhc2UiLCJvYmoiLCJtaXhpbiIsImtleSIsInByb3RvdHlwZSIsIk9iamVjdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImdldCIsImZpZWxkIiwiaGVhZGVyIiwidG9Mb3dlckNhc2UiLCJfc2V0SGVhZGVyUHJvcGVydGllcyIsImN0IiwidHlwZSIsInBhcmFtcyIsImxpbmtzIiwibGluayIsInBhcnNlTGlua3MiLCJfc2V0U3RhdHVzUHJvcGVydGllcyIsInN0YXR1cyIsInN0YXR1c0NvZGUiLCJzdGF0dXNUeXBlIiwiaW5mbyIsIm9rIiwicmVkaXJlY3QiLCJjbGllbnRFcnJvciIsInNlcnZlckVycm9yIiwiZXJyb3IiLCJ0b0Vycm9yIiwiY3JlYXRlZCIsImFjY2VwdGVkIiwibm9Db250ZW50IiwiYmFkUmVxdWVzdCIsInVuYXV0aG9yaXplZCIsIm5vdEFjY2VwdGFibGUiLCJmb3JiaWRkZW4iLCJub3RGb3VuZCIsInVucHJvY2Vzc2FibGVFbnRpdHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7OztBQUlBLElBQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBckI7QUFFQTs7Ozs7QUFJQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCQyxZQUFqQjtBQUVBOzs7Ozs7QUFNQSxTQUFTQSxZQUFULENBQXNCQyxHQUF0QixFQUEyQjtBQUN6QixNQUFJQSxHQUFKLEVBQVMsT0FBT0MsS0FBSyxDQUFDRCxHQUFELENBQVo7QUFDVjtBQUVEOzs7Ozs7Ozs7QUFRQSxTQUFTQyxLQUFULENBQWVELEdBQWYsRUFBb0I7QUFDbEIsT0FBSyxJQUFNRSxHQUFYLElBQWtCSCxZQUFZLENBQUNJLFNBQS9CLEVBQTBDO0FBQ3hDLFFBQUlDLE1BQU0sQ0FBQ0QsU0FBUCxDQUFpQkUsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFD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LEdBQTJCbEIsTUFBTSxLQUFLLEdBQXRDO0FBQ0QsQ0ExQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZUJhc2VgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVzcG9uc2VCYXNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlc3BvbnNlQmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXNwb25zZUJhc2Uob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gUmVzcG9uc2VCYXNlLnByb3RvdHlwZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVzcG9uc2VCYXNlLnByb3RvdHlwZSwga2V5KSlcbiAgICAgIG9ialtrZXldID0gUmVzcG9uc2VCYXNlLnByb3RvdHlwZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gIHJldHVybiB0aGlzLmhlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciByZWxhdGVkIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGAudHlwZWAgdGhlIGNvbnRlbnQgdHlwZSB3aXRob3V0IHBhcmFtc1xuICpcbiAqIEEgcmVzcG9uc2Ugb2YgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiBcInRleHQvcGxhaW5cIi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKSB7XG4gIC8vIFRPRE86IG1vYXIhXG4gIC8vIFRPRE86IG1ha2UgdGhpcyBhIHV0aWxcblxuICAvLyBjb250ZW50LXR5cGVcbiAgY29uc3QgY3QgPSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddIHx8ICcnO1xuICB0aGlzLnR5cGUgPSB1dGlscy50eXBlKGN0KTtcblxuICAvLyBwYXJhbXNcbiAgY29uc3QgcGFyYW1zID0gdXRpbHMucGFyYW1zKGN0KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJhbXMsIGtleSkpXG4gICAgICB0aGlzW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgfVxuXG4gIHRoaXMubGlua3MgPSB7fTtcblxuICAvLyBsaW5rc1xuICB0cnkge1xuICAgIGlmIChoZWFkZXIubGluaykge1xuICAgICAgdGhpcy5saW5rcyA9IHV0aWxzLnBhcnNlTGlua3MoaGVhZGVyLmxpbmspO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fXG4gKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlXG4gKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmVcbiAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjVcbiAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLlxuICpcbiAqIFwic3VnYXJcIiBwcm9wZXJ0aWVzIGFyZSBhbHNvIGRlZmluZWQgZm9yIGNvbW1vbiBjYXNlcy4gQ3VycmVudGx5IHByb3ZpZGluZzpcbiAqXG4gKiAgIC0gLm5vQ29udGVudFxuICogICAtIC5iYWRSZXF1ZXN0XG4gKiAgIC0gLnVuYXV0aG9yaXplZFxuICogICAtIC5ub3RBY2NlcHRhYmxlXG4gKiAgIC0gLm5vdEZvdW5kXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0U3RhdHVzUHJvcGVydGllcyA9IGZ1bmN0aW9uKHN0YXR1cykge1xuICBjb25zdCB0eXBlID0gKHN0YXR1cyAvIDEwMCkgfCAwO1xuXG4gIC8vIHN0YXR1cyAvIGNsYXNzXG4gIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1cztcbiAgdGhpcy5zdGF0dXMgPSB0aGlzLnN0YXR1c0NvZGU7XG4gIHRoaXMuc3RhdHVzVHlwZSA9IHR5cGU7XG5cbiAgLy8gYmFzaWNzXG4gIHRoaXMuaW5mbyA9IHR5cGUgPT09IDE7XG4gIHRoaXMub2sgPSB0eXBlID09PSAyO1xuICB0aGlzLnJlZGlyZWN0ID0gdHlwZSA9PT0gMztcbiAgdGhpcy5jbGllbnRFcnJvciA9IHR5cGUgPT09IDQ7XG4gIHRoaXMuc2VydmVyRXJyb3IgPSB0eXBlID09PSA1O1xuICB0aGlzLmVycm9yID0gdHlwZSA9PT0gNCB8fCB0eXBlID09PSA1ID8gdGhpcy50b0Vycm9yKCkgOiBmYWxzZTtcblxuICAvLyBzdWdhclxuICB0aGlzLmNyZWF0ZWQgPSBzdGF0dXMgPT09IDIwMTtcbiAgdGhpcy5hY2NlcHRlZCA9IHN0YXR1cyA9PT0gMjAyO1xuICB0aGlzLm5vQ29udGVudCA9IHN0YXR1cyA9PT0gMjA0O1xuICB0aGlzLmJhZFJlcXVlc3QgPSBzdGF0dXMgPT09IDQwMDtcbiAgdGhpcy51bmF1dGhvcml6ZWQgPSBzdGF0dXMgPT09IDQwMTtcbiAgdGhpcy5ub3RBY2NlcHRhYmxlID0gc3RhdHVzID09PSA0MDY7XG4gIHRoaXMuZm9yYmlkZGVuID0gc3RhdHVzID09PSA0MDM7XG4gIHRoaXMubm90Rm91bmQgPSBzdGF0dXMgPT09IDQwNDtcbiAgdGhpcy51bnByb2Nlc3NhYmxlRW50aXR5ID0gc3RhdHVzID09PSA0MjI7XG59O1xuIl19","\"use strict\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction Agent() {\n this._defaults = [];\n}\n\n['use', 'on', 'once', 'set', 'query', 'type', 'accept', 'auth', 'withCredentials', 'sortQuery', 'retry', 'ok', 'redirects', 'timeout', 'buffer', 'serialize', 'parse', 'ca', 'key', 'pfx', 'cert', 'disableTLSCerts'].forEach(function (fn) {\n // Default setting for all requests from this agent\n Agent.prototype[fn] = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n this._defaults.push({\n fn: fn,\n args: args\n });\n\n return this;\n };\n});\n\nAgent.prototype._setDefaults = function (req) {\n this._defaults.forEach(function (def) {\n req[def.fn].apply(req, _toConsumableArray(def.args));\n });\n};\n\nmodule.exports = Agent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZ2VudC1iYXNlLmpzIl0sIm5hbWVzIjpbIkFnZW50IiwiX2RlZmF1bHRzIiwiZm9yRWFjaCIsImZuIiwicHJvdG90eXBlIiwiYXJncyIsInB1c2giLCJfc2V0RGVmYXVsdHMiLCJyZXEiLCJkZWYiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsU0FBU0EsS0FBVCxHQUFpQjtBQUNmLE9BQUtDLFNBQUwsR0FBaUIsRUFBakI7QUFDRDs7QUFFRCxDQUNFLEtBREYsRUFFRSxJQUZGLEVBR0UsTUFIRixFQUlFLEtBSkYsRUFLRSxPQUxGLEVBTUUsTUFORixFQU9FLFFBUEYsRUFRRSxNQVJGLEVBU0UsaUJBVEYsRUFVRSxXQVZGLEVBV0UsT0FYRixFQVlFLElBWkYsRUFhRSxXQWJGLEVBY0UsU0FkRixFQWVFLFFBZkYsRUFnQkUsV0FoQkYsRUFpQkUsT0FqQkYsRUFrQkUsSUFsQkYsRUFtQkUsS0FuQkYsRUFvQkUsS0FwQkYsRUFxQkUsTUFyQkYsRUFzQkUsaUJBdEJGLEVBdUJFQyxPQXZCRixDQXVCVSxVQUFBQyxFQUFFLEVBQUk7QUFDZDtBQUNBSCxFQUFBQSxLQUFLLENBQUNJLFNBQU4sQ0FBZ0JELEVBQWhCLElBQXNCLFlBQWtCO0FBQUEsc0NBQU5FLElBQU07QUFBTkEsTUFBQUEsSUFBTTtBQUFBOztBQUN0QyxTQUFLSixTQUFMLENBQWVLLElBQWYsQ0FBb0I7QUFBRUgsTUFBQUEsRUFBRSxFQUFGQSxFQUFGO0FBQU1FLE1BQUFBLElBQUksRUFBSkE7QUFBTixLQUFwQjs7QUFDQSxXQUFPLElBQVA7QUFDRCxHQUhEO0FBSUQsQ0E3QkQ7O0FBK0JBTCxLQUFLLENBQUNJLFNBQU4sQ0FBZ0JHLFlBQWhCLEdBQStCLFVBQVNDLEdBQVQsRUFBYztBQUMzQyxPQUFLUCxTQUFMLENBQWVDLE9BQWYsQ0FBdUIsVUFBQU8sR0FBRyxFQUFJO0FBQzVCRCxJQUFBQSxHQUFHLENBQUNDLEdBQUcsQ0FBQ04sRUFBTCxDQUFILE9BQUFLLEdBQUcscUJBQVlDLEdBQUcsQ0FBQ0osSUFBaEIsRUFBSDtBQUNELEdBRkQ7QUFHRCxDQUpEOztBQU1BSyxNQUFNLENBQUNDLE9BQVAsR0FBaUJYLEtBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gQWdlbnQoKSB7XG4gIHRoaXMuX2RlZmF1bHRzID0gW107XG59XG5cbltcbiAgJ3VzZScsXG4gICdvbicsXG4gICdvbmNlJyxcbiAgJ3NldCcsXG4gICdxdWVyeScsXG4gICd0eXBlJyxcbiAgJ2FjY2VwdCcsXG4gICdhdXRoJyxcbiAgJ3dpdGhDcmVkZW50aWFscycsXG4gICdzb3J0UXVlcnknLFxuICAncmV0cnknLFxuICAnb2snLFxuICAncmVkaXJlY3RzJyxcbiAgJ3RpbWVvdXQnLFxuICAnYnVmZmVyJyxcbiAgJ3NlcmlhbGl6ZScsXG4gICdwYXJzZScsXG4gICdjYScsXG4gICdrZXknLFxuICAncGZ4JyxcbiAgJ2NlcnQnLFxuICAnZGlzYWJsZVRMU0NlcnRzJ1xuXS5mb3JFYWNoKGZuID0+IHtcbiAgLy8gRGVmYXVsdCBzZXR0aW5nIGZvciBhbGwgcmVxdWVzdHMgZnJvbSB0aGlzIGFnZW50XG4gIEFnZW50LnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMucHVzaCh7IGZuLCBhcmdzIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSk7XG5cbkFnZW50LnByb3RvdHlwZS5fc2V0RGVmYXVsdHMgPSBmdW5jdGlvbihyZXEpIHtcbiAgdGhpcy5fZGVmYXVsdHMuZm9yRWFjaChkZWYgPT4ge1xuICAgIHJlcVtkZWYuZm5dKC4uLmRlZi5hcmdzKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZW50O1xuIl19","\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * Root reference for iframes.\n */\nvar root;\n\nif (typeof window !== 'undefined') {\n // Browser window\n root = window;\n} else if (typeof self === 'undefined') {\n // Other environments\n console.warn('Using browser-only version of superagent in non-browser environment');\n root = void 0;\n} else {\n // Web Worker\n root = self;\n}\n\nvar Emitter = require('component-emitter');\n\nvar safeStringify = require('fast-safe-stringify');\n\nvar RequestBase = require('./request-base');\n\nvar isObject = require('./is-object');\n\nvar ResponseBase = require('./response-base');\n\nvar Agent = require('./agent-base');\n/**\n * Noop.\n */\n\n\nfunction noop() {}\n/**\n * Expose `request`.\n */\n\n\nmodule.exports = function (method, url) {\n // callback\n if (typeof url === 'function') {\n return new exports.Request('GET', method).end(url);\n } // url first\n\n\n if (arguments.length === 1) {\n return new exports.Request('GET', method);\n }\n\n return new exports.Request(method, url);\n};\n\nexports = module.exports;\nvar request = exports;\nexports.Request = Request;\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n if (root.XMLHttpRequest && (!root.location || root.location.protocol !== 'file:' || !root.ActiveXObject)) {\n return new XMLHttpRequest();\n }\n\n try {\n return new ActiveXObject('Microsoft.XMLHTTP');\n } catch (_unused) {}\n\n try {\n return new ActiveXObject('Msxml2.XMLHTTP.6.0');\n } catch (_unused2) {}\n\n try {\n return new ActiveXObject('Msxml2.XMLHTTP.3.0');\n } catch (_unused3) {}\n\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (_unused4) {}\n\n throw new Error('Browser-only version of superagent could not find XHR');\n};\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\n\nvar trim = ''.trim ? function (s) {\n return s.trim();\n} : function (s) {\n return s.replace(/(^\\s*|\\s*$)/g, '');\n};\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n if (!isObject(obj)) return obj;\n var pairs = [];\n\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) pushEncodedKeyValuePair(pairs, key, obj[key]);\n }\n\n return pairs.join('&');\n}\n/**\n * Helps 'serialize' with serializing arrays.\n * Mutates the pairs array.\n *\n * @param {Array} pairs\n * @param {String} key\n * @param {Mixed} val\n */\n\n\nfunction pushEncodedKeyValuePair(pairs, key, val) {\n if (val === undefined) return;\n\n if (val === null) {\n pairs.push(encodeURI(key));\n return;\n }\n\n if (Array.isArray(val)) {\n val.forEach(function (v) {\n pushEncodedKeyValuePair(pairs, key, v);\n });\n } else if (isObject(val)) {\n for (var subkey in val) {\n if (Object.prototype.hasOwnProperty.call(val, subkey)) pushEncodedKeyValuePair(pairs, \"\".concat(key, \"[\").concat(subkey, \"]\"), val[subkey]);\n }\n } else {\n pairs.push(encodeURI(key) + '=' + encodeURIComponent(val));\n }\n}\n/**\n * Expose serialization method.\n */\n\n\nrequest.serializeObject = serialize;\n/**\n * Parse the given x-www-form-urlencoded `str`.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseString(str) {\n var obj = {};\n var pairs = str.split('&');\n var pair;\n var pos;\n\n for (var i = 0, len = pairs.length; i < len; ++i) {\n pair = pairs[i];\n pos = pair.indexOf('=');\n\n if (pos === -1) {\n obj[decodeURIComponent(pair)] = '';\n } else {\n obj[decodeURIComponent(pair.slice(0, pos))] = decodeURIComponent(pair.slice(pos + 1));\n }\n }\n\n return obj;\n}\n/**\n * Expose parser.\n */\n\n\nrequest.parseString = parseString;\n/**\n * Default MIME type map.\n *\n * superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n html: 'text/html',\n json: 'application/json',\n xml: 'text/xml',\n urlencoded: 'application/x-www-form-urlencoded',\n form: 'application/x-www-form-urlencoded',\n 'form-data': 'application/x-www-form-urlencoded'\n};\n/**\n * Default serialization map.\n *\n * superagent.serialize['application/xml'] = function(obj){\n * return 'generated xml here';\n * };\n *\n */\n\nrequest.serialize = {\n 'application/x-www-form-urlencoded': serialize,\n 'application/json': safeStringify\n};\n/**\n * Default parsers.\n *\n * superagent.parse['application/xml'] = function(str){\n * return { object parsed from str };\n * };\n *\n */\n\nrequest.parse = {\n 'application/x-www-form-urlencoded': parseString,\n 'application/json': JSON.parse\n};\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n var lines = str.split(/\\r?\\n/);\n var fields = {};\n var index;\n var line;\n var field;\n var val;\n\n for (var i = 0, len = lines.length; i < len; ++i) {\n line = lines[i];\n index = line.indexOf(':');\n\n if (index === -1) {\n // could be empty line, just skip it\n continue;\n }\n\n field = line.slice(0, index).toLowerCase();\n val = trim(line.slice(index + 1));\n fields[field] = val;\n }\n\n return fields;\n}\n/**\n * Check if `mime` is json or has +json structured syntax suffix.\n *\n * @param {String} mime\n * @return {Boolean}\n * @api private\n */\n\n\nfunction isJSON(mime) {\n // should match /json or +json\n // but not /json-seq\n return /[/+]json($|[^-\\w])/.test(mime);\n}\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n * - set flags (.ok, .error, etc)\n * - parse header\n *\n * Examples:\n *\n * Aliasing `superagent` as `request` is nice:\n *\n * request = superagent;\n *\n * We can use the promise-like API, or pass callbacks:\n *\n * request.get('/').end(function(res){});\n * request.get('/', function(res){});\n *\n * Sending data can be chained:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' })\n * .end(function(res){});\n *\n * Or passed to `.send()`:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' }, function(res){});\n *\n * Or passed to `.post()`:\n *\n * request\n * .post('/user', { name: 'tj' })\n * .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n * request\n * .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\n\nfunction Response(req) {\n this.req = req;\n this.xhr = this.req.xhr; // responseText is accessible only if responseType is '' or 'text' and on older browsers\n\n this.text = this.req.method !== 'HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text') || typeof this.xhr.responseType === 'undefined' ? this.xhr.responseText : null;\n this.statusText = this.req.xhr.statusText;\n var status = this.xhr.status; // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n\n if (status === 1223) {\n status = 204;\n }\n\n this._setStatusProperties(status);\n\n this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n this.header = this.headers; // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n // getResponseHeader still works. so we get content-type even if getting\n // other headers fails.\n\n this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n\n this._setHeaderProperties(this.header);\n\n if (this.text === null && req._responseType) {\n this.body = this.xhr.response;\n } else {\n this.body = this.req.method === 'HEAD' ? null : this._parseBody(this.text ? this.text : this.xhr.response);\n }\n} // eslint-disable-next-line new-cap\n\n\nResponseBase(Response.prototype);\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype._parseBody = function (str) {\n var parse = request.parse[this.type];\n\n if (this.req._parser) {\n return this.req._parser(this, str);\n }\n\n if (!parse && isJSON(this.type)) {\n parse = request.parse['application/json'];\n }\n\n return parse && str && (str.length > 0 || str instanceof Object) ? parse(str) : null;\n};\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\n\nResponse.prototype.toError = function () {\n var req = this.req;\n var method = req.method;\n var url = req.url;\n var msg = \"cannot \".concat(method, \" \").concat(url, \" (\").concat(this.status, \")\");\n var err = new Error(msg);\n err.status = this.status;\n err.method = method;\n err.url = url;\n return err;\n};\n/**\n * Expose `Response`.\n */\n\n\nrequest.Response = Response;\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n var self = this;\n this._query = this._query || [];\n this.method = method;\n this.url = url;\n this.header = {}; // preserves header name case\n\n this._header = {}; // coerces header names to lowercase\n\n this.on('end', function () {\n var err = null;\n var res = null;\n\n try {\n res = new Response(self);\n } catch (err_) {\n err = new Error('Parser is unable to parse the response');\n err.parse = true;\n err.original = err_; // issue #675: return the raw response if the response parsing fails\n\n if (self.xhr) {\n // ie9 doesn't have 'response' property\n err.rawResponse = typeof self.xhr.responseType === 'undefined' ? self.xhr.responseText : self.xhr.response; // issue #876: return the http status code if the response parsing fails\n\n err.status = self.xhr.status ? self.xhr.status : null;\n err.statusCode = err.status; // backwards-compat only\n } else {\n err.rawResponse = null;\n err.status = null;\n }\n\n return self.callback(err);\n }\n\n self.emit('response', res);\n var new_err;\n\n try {\n if (!self._isResponseOK(res)) {\n new_err = new Error(res.statusText || res.text || 'Unsuccessful HTTP response');\n }\n } catch (err_) {\n new_err = err_; // ok() callback can throw\n } // #1000 don't catch errors from the callback to avoid double calling it\n\n\n if (new_err) {\n new_err.original = err;\n new_err.response = res;\n new_err.status = res.status;\n self.callback(new_err, res);\n } else {\n self.callback(null, res);\n }\n });\n}\n/**\n * Mixin `Emitter` and `RequestBase`.\n */\n// eslint-disable-next-line new-cap\n\n\nEmitter(Request.prototype); // eslint-disable-next-line new-cap\n\nRequestBase(Request.prototype);\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.xml = 'application/xml';\n *\n * request.post('/')\n * .type('xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * request.post('/')\n * .type('application/xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function (type) {\n this.set('Content-Type', request.types[type] || type);\n return this;\n};\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.json = 'application/json';\n *\n * request.get('/agent')\n * .accept('json')\n * .end(callback);\n *\n * request.get('/agent')\n * .accept('application/json')\n * .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequest.prototype.accept = function (type) {\n this.set('Accept', request.types[type] || type);\n return this;\n};\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} [pass] optional in case of using 'bearer' as type\n * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequest.prototype.auth = function (user, pass, options) {\n if (arguments.length === 1) pass = '';\n\n if (_typeof(pass) === 'object' && pass !== null) {\n // pass is optional and can be replaced with options\n options = pass;\n pass = '';\n }\n\n if (!options) {\n options = {\n type: typeof btoa === 'function' ? 'basic' : 'auto'\n };\n }\n\n var encoder = function encoder(string) {\n if (typeof btoa === 'function') {\n return btoa(string);\n }\n\n throw new Error('Cannot use basic auth, btoa is not a function');\n };\n\n return this._auth(user, pass, options, encoder);\n};\n/**\n * Add query-string `val`.\n *\n * Examples:\n *\n * request.get('/shoes')\n * .query('size=10')\n * .query({ color: 'blue' })\n *\n * @param {Object|String} val\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequest.prototype.query = function (val) {\n if (typeof val !== 'string') val = serialize(val);\n if (val) this._query.push(val);\n return this;\n};\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `options` (or filename).\n *\n * ``` js\n * request.post('/upload')\n * .attach('content', new Blob(['hey!'], { type: \"text/html\"}))\n * .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String|Object} options\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequest.prototype.attach = function (field, file, options) {\n if (file) {\n if (this._data) {\n throw new Error(\"superagent can't mix .send() and .attach()\");\n }\n\n this._getFormData().append(field, file, options || file.name);\n }\n\n return this;\n};\n\nRequest.prototype._getFormData = function () {\n if (!this._formData) {\n this._formData = new root.FormData();\n }\n\n return this._formData;\n};\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\n\nRequest.prototype.callback = function (err, res) {\n if (this._shouldRetry(err, res)) {\n return this._retry();\n }\n\n var fn = this._callback;\n this.clearTimeout();\n\n if (err) {\n if (this._maxRetries) err.retries = this._retries - 1;\n this.emit('error', err);\n }\n\n fn(err, res);\n};\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\n\nRequest.prototype.crossDomainError = function () {\n var err = new Error('Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');\n err.crossDomain = true;\n err.status = this.status;\n err.method = this.method;\n err.url = this.url;\n this.callback(err);\n}; // This only warns, because the request is still likely to work\n\n\nRequest.prototype.agent = function () {\n console.warn('This is not supported in browser version of superagent');\n return this;\n};\n\nRequest.prototype.ca = Request.prototype.agent;\nRequest.prototype.buffer = Request.prototype.ca; // This throws, because it can't send/receive data as expected\n\nRequest.prototype.write = function () {\n throw new Error('Streaming is not supported in browser version of superagent');\n};\n\nRequest.prototype.pipe = Request.prototype.write;\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * @param {Object} obj host object\n * @return {Boolean} is a host object\n * @api private\n */\n\nRequest.prototype._isHost = function (obj) {\n // Native objects stringify to [object File], [object Blob], [object FormData], etc.\n return obj && _typeof(obj) === 'object' && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';\n};\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\n\nRequest.prototype.end = function (fn) {\n if (this._endCalled) {\n console.warn('Warning: .end() was called twice. This is not supported in superagent');\n }\n\n this._endCalled = true; // store callback\n\n this._callback = fn || noop; // querystring\n\n this._finalizeQueryString();\n\n this._end();\n};\n\nRequest.prototype._setUploadTimeout = function () {\n var self = this; // upload timeout it's wokrs only if deadline timeout is off\n\n if (this._uploadTimeout && !this._uploadTimeoutTimer) {\n this._uploadTimeoutTimer = setTimeout(function () {\n self._timeoutError('Upload timeout of ', self._uploadTimeout, 'ETIMEDOUT');\n }, this._uploadTimeout);\n }\n}; // eslint-disable-next-line complexity\n\n\nRequest.prototype._end = function () {\n if (this._aborted) return this.callback(new Error('The request has been aborted even before .end() was called'));\n var self = this;\n this.xhr = request.getXHR();\n var xhr = this.xhr;\n var data = this._formData || this._data;\n\n this._setTimeouts(); // state change\n\n\n xhr.onreadystatechange = function () {\n var readyState = xhr.readyState;\n\n if (readyState >= 2 && self._responseTimeoutTimer) {\n clearTimeout(self._responseTimeoutTimer);\n }\n\n if (readyState !== 4) {\n return;\n } // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n // result in the error \"Could not complete the operation due to error c00c023f\"\n\n\n var status;\n\n try {\n status = xhr.status;\n } catch (_unused5) {\n status = 0;\n }\n\n if (!status) {\n if (self.timedout || self._aborted) return;\n return self.crossDomainError();\n }\n\n self.emit('end');\n }; // progress\n\n\n var handleProgress = function handleProgress(direction, e) {\n if (e.total > 0) {\n e.percent = e.loaded / e.total * 100;\n\n if (e.percent === 100) {\n clearTimeout(self._uploadTimeoutTimer);\n }\n }\n\n e.direction = direction;\n self.emit('progress', e);\n };\n\n if (this.hasListeners('progress')) {\n try {\n xhr.addEventListener('progress', handleProgress.bind(null, 'download'));\n\n if (xhr.upload) {\n xhr.upload.addEventListener('progress', handleProgress.bind(null, 'upload'));\n }\n } catch (_unused6) {// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n // Reported here:\n // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n }\n }\n\n if (xhr.upload) {\n this._setUploadTimeout();\n } // initiate request\n\n\n try {\n if (this.username && this.password) {\n xhr.open(this.method, this.url, true, this.username, this.password);\n } else {\n xhr.open(this.method, this.url, true);\n }\n } catch (err) {\n // see #1149\n return this.callback(err);\n } // CORS\n\n\n if (this._withCredentials) xhr.withCredentials = true; // body\n\n if (!this._formData && this.method !== 'GET' && this.method !== 'HEAD' && typeof data !== 'string' && !this._isHost(data)) {\n // serialize stuff\n var contentType = this._header['content-type'];\n\n var _serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];\n\n if (!_serialize && isJSON(contentType)) {\n _serialize = request.serialize['application/json'];\n }\n\n if (_serialize) data = _serialize(data);\n } // set header fields\n\n\n for (var field in this.header) {\n if (this.header[field] === null) continue;\n if (Object.prototype.hasOwnProperty.call(this.header, field)) xhr.setRequestHeader(field, this.header[field]);\n }\n\n if (this._responseType) {\n xhr.responseType = this._responseType;\n } // send stuff\n\n\n this.emit('request', this); // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)\n // We need null here if data is undefined\n\n xhr.send(typeof data === 'undefined' ? null : data);\n};\n\nrequest.agent = function () {\n return new Agent();\n};\n\n['GET', 'POST', 'OPTIONS', 'PATCH', 'PUT', 'DELETE'].forEach(function (method) {\n Agent.prototype[method.toLowerCase()] = function (url, fn) {\n var req = new request.Request(method, url);\n\n this._setDefaults(req);\n\n if (fn) {\n req.end(fn);\n }\n\n return req;\n };\n});\nAgent.prototype.del = Agent.prototype.delete;\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.get = function (url, data, fn) {\n var req = request('GET', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\n\nrequest.head = function (url, data, fn) {\n var req = request('HEAD', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n/**\n * OPTIONS query to `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\n\nrequest.options = function (url, data, fn) {\n var req = request('OPTIONS', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n/**\n * DELETE `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\n\nfunction del(url, data, fn) {\n var req = request('DELETE', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n}\n\nrequest.del = del;\nrequest.delete = del;\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function (url, data, fn) {\n var req = request('PATCH', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\n\nrequest.post = function (url, data, fn) {\n var req = request('POST', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\n\nrequest.put = function (url, data, fn) {\n var req = request('PUT', url);\n\n if (typeof data === 'function') {\n fn = data;\n data = null;\n }\n\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQuanMiXSwibmFtZXMiOlsicm9vdCIsIndpbmRvdyIsInNlbGYiLCJjb25zb2xlIiwid2FybiIsIkVtaXR0ZXIiLCJyZXF1aXJlIiwic2FmZVN0cmluZ2lmeSIsIlJlcXVlc3RCYXNlIiwiaXNPYmplY3QiLCJSZXNwb25zZUJhc2UiLCJBZ2VudCIsIm5vb3AiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0aG9kIiwidXJsIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInJlcXVlc3QiLCJnZXRYSFIiLCJYTUxIdHRwUmVxdWVzdCIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJBY3RpdmVYT2JqZWN0IiwiRXJyb3IiLCJ0cmltIiwicyIsInJlcGxhY2UiLCJzZXJpYWxpemUiLCJvYmoiLCJwYWlycyIsImtleSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyIiwiam9pbiIsInZhbCIsInVuZGVmaW5lZCIsInB1c2giLCJlbmNvZGVVUkkiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwidiIsInN1YmtleSIsImVuY29kZVVSSUNvbXBvbmVudCIsInNlcmlhbGl6ZU9iamVjdCIsInBhcnNlU3RyaW5nIiwic3RyIiwic3BsaXQiLCJwYWlyIiwicG9zIiwiaSIsImxlbiIsImluZGV4T2YiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzbGljZSIsInR5cGVzIiwiaHRtbCIsImpzb24iLCJ4bWwiLCJ1cmxlbmNvZGVkIiwiZm9ybSIsInBhcnNlIiwiSlNPTiIsInBhcnNlSGVhZGVyIiwibGluZXMiLCJmaWVsZHMiLCJpbmRleCIsImxpbmUiLCJmaWVsZCIsInRvTG93ZXJDYXNlIiwiaXNKU09OIiwibWltZSIsInRlc3QiLCJSZXNwb25zZSIsInJlcSIsInhociIsInRleHQiLCJyZXNwb25zZVR5cGUiLCJyZXNwb25zZVRleHQiLCJzdGF0dXNUZXh0Iiwic3RhdHVzIiwiX3NldFN0YXR1c1Byb3BlcnRpZXMiLCJoZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwiaGVhZGVyIiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJfc2V0SGVhZGVyUHJvcGVydGllcyIsIl9yZXNwb25zZVR5cGUiLCJib2R5IiwicmVzcG9uc2UiLCJfcGFyc2VCb2R5IiwidHlwZSIsIl9wYXJzZXIiLCJ0b0Vycm9yIiwibXNnIiwiZXJyIiwiX3F1ZXJ5IiwiX2hlYWRlciIsIm9uIiwicmVzIiwiZXJyXyIsIm9yaWdpbmFsIiwicmF3UmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiY2FsbGJhY2siLCJlbWl0IiwibmV3X2VyciIsIl9pc1Jlc3BvbnNlT0siLCJzZXQiLCJhY2NlcHQiLCJhdXRoIiwidXNlciIsInBhc3MiLCJvcHRpb25zIiwiYnRvYSIsImVuY29kZXIiLCJzdHJpbmciLCJfYXV0aCIsInF1ZXJ5IiwiYXR0YWNoIiwiZmlsZSIsIl9kYXRhIiwiX2dldEZvcm1EYXRhIiwiYXBwZW5kIiwibmFtZSIsIl9mb3JtRGF0YSIsIkZvcm1EYXRhIiwiX3Nob3VsZFJldHJ5IiwiX3JldHJ5IiwiZm4iLCJfY2FsbGJhY2siLCJjbGVhclRpbWVvdXQiLCJfbWF4UmV0cmllcyIsInJldHJpZXMiLCJfcmV0cmllcyIsImNyb3NzRG9tYWluRXJyb3IiLCJjcm9zc0RvbWFpbiIsImFnZW50IiwiY2EiLCJidWZmZXIiLCJ3cml0ZSIsInBpcGUiLCJfaXNIb3N0IiwidG9TdHJpbmciLCJfZW5kQ2FsbGVkIiwiX2ZpbmFsaXplUXVlcnlTdHJpbmciLCJfZW5kIiwiX3NldFVwbG9hZFRpbWVvdXQiLCJfdXBsb2FkVGltZW91dCIsIl91cGxvYWRUaW1lb3V0VGltZXIiLCJzZXRUaW1lb3V0IiwiX3RpbWVvdXRFcnJvciIsIl9hYm9ydGVkIiwiZGF0YSIsIl9zZXRUaW1lb3V0cyIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJ0aW1lZG91dCIsImhhbmRsZVByb2dyZXNzIiwiZGlyZWN0aW9uIiwiZSIsInRvdGFsIiwicGVyY2VudCIsImxvYWRlZCIsImhhc0xpc3RlbmVycyIsImFkZEV2ZW50TGlzdGVuZXIiLCJiaW5kIiwidXBsb2FkIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsIm9wZW4iLCJfd2l0aENyZWRlbnRpYWxzIiwid2l0aENyZWRlbnRpYWxzIiwiY29udGVudFR5cGUiLCJfc2VyaWFsaXplciIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwiX3NldERlZmF1bHRzIiwiZGVsIiwiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBhdGNoIiwicG9zdCIsInB1dCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7QUFJQSxJQUFJQSxJQUFKOztBQUNBLElBQUksT0FBT0MsTUFBUCxLQUFrQixXQUF0QixFQUFtQztBQUNqQztBQUNBRCxFQUFBQSxJQUFJLEdBQUdDLE1BQVA7QUFDRCxDQUhELE1BR08sSUFBSSxPQUFPQyxJQUFQLEtBQWdCLFdBQXBCLEVBQWlDO0FBQ3RDO0FBQ0FDLEVBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUNFLHFFQURGO0FBR0FKLEVBQUFBLElBQUksU0FBSjtBQUNELENBTk0sTUFNQTtBQUNMO0FBQ0FBLEVBQUFBLElBQUksR0FBR0UsSUFBUDtBQUNEOztBQUVELElBQU1HLE9BQU8sR0FBR0MsT0FBTyxDQUFDLG1CQUFELENBQXZCOztBQUNBLElBQU1DLGFBQWEsR0FBR0QsT0FBTyxDQUFDLHFCQUFELENBQTdCOztBQUNBLElBQU1FLFdBQVcsR0FBR0YsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQU1HLFFBQVEsR0FBR0gsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBTUksWUFBWSxHQUFHSixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBTUssS0FBSyxHQUFHTCxPQUFPLENBQUMsY0FBRCxDQUFyQjtBQUVBOzs7OztBQUlBLFNBQVNNLElBQVQsR0FBZ0IsQ0FBRTtBQUVsQjs7Ozs7QUFJ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cmVuY2UgZm9yIGlmcmFtZXMuXG4gKi9cblxubGV0IHJvb3Q7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gQnJvd3NlciB3aW5kb3dcbiAgcm9vdCA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIE90aGVyIGVudmlyb25tZW50c1xuICBjb25zb2xlLndhcm4oXG4gICAgJ1VzaW5nIGJyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQnXG4gICk7XG4gIHJvb3QgPSB0aGlzO1xufSBlbHNlIHtcbiAgLy8gV2ViIFdvcmtlclxuICByb290ID0gc2VsZjtcbn1cblxuY29uc3QgRW1pdHRlciA9IHJlcXVpcmUoJ2NvbXBvbmVudC1lbWl0dGVyJyk7XG5jb25zdCBzYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1zYWZlLXN0cmluZ2lmeScpO1xuY29uc3QgUmVxdWVzdEJhc2UgPSByZXF1aXJlKCcuL3JlcXVlc3QtYmFzZScpO1xuY29uc3QgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xuY29uc3QgUmVzcG9uc2VCYXNlID0gcmVxdWlyZSgnLi9yZXNwb25zZS1iYXNlJyk7XG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vYWdlbnQtYmFzZScpO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8qKlxuICogRXhwb3NlIGByZXF1ZXN0YC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1ldGhvZCwgdXJsKSB7XG4gIC8vIGNhbGxiYWNrXG4gIGlmICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbn07XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcblxuY29uc3QgcmVxdWVzdCA9IGV4cG9ydHM7XG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRGV0ZXJtaW5lIFhIUi5cbiAqL1xuXG5yZXF1ZXN0LmdldFhIUiA9ICgpID0+IHtcbiAgaWYgKFxuICAgIHJvb3QuWE1MSHR0cFJlcXVlc3QgJiZcbiAgICAoIXJvb3QubG9jYXRpb24gfHxcbiAgICAgIHJvb3QubG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgfHxcbiAgICAgICFyb290LkFjdGl2ZVhPYmplY3QpXG4gICkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuICB9IGNhdGNoIHt9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjYuMCcpO1xuICB9IGNhdGNoIHt9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpO1xuICB9IGNhdGNoIHt9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7XG4gIH0gY2F0Y2gge31cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgY291bGQgbm90IGZpbmQgWEhSJyk7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuY29uc3QgdHJpbSA9ICcnLnRyaW0gPyBzID0+IHMudHJpbSgpIDogcyA9PiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpO1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIGNvbnN0IHBhaXJzID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKVxuICAgICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgb2JqW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBIZWxwcyAnc2VyaWFsaXplJyB3aXRoIHNlcmlhbGl6aW5nIGFycmF5cy5cbiAqIE11dGF0ZXMgdGhlIHBhaXJzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqL1xuXG5mdW5jdGlvbiBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICBwYWlycy5wdXNoKGVuY29kZVVSSShrZXkpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgdmFsLmZvckVhY2godiA9PiB7XG4gICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2KTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgZm9yIChjb25zdCBzdWJrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgc3Via2V5KSlcbiAgICAgICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGAke2tleX1bJHtzdWJrZXl9XWAsIHZhbFtzdWJrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUkkoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9zZSBzZXJpYWxpemF0aW9uIG1ldGhvZC5cbiAqL1xuXG5yZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdCA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4geC13d3ctZm9ybS11cmxlbmNvZGVkIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHN0cikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3QgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTtcbiAgbGV0IHBhaXI7XG4gIGxldCBwb3M7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhaXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIpXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UoMCwgcG9zKSldID0gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICBwYWlyLnNsaWNlKHBvcyArIDEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRXhwb3NlIHBhcnNlci5cbiAqL1xuXG5yZXF1ZXN0LnBhcnNlU3RyaW5nID0gcGFyc2VTdHJpbmc7XG5cbi8qKlxuICogRGVmYXVsdCBNSU1FIHR5cGUgbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnR5cGVzLnhtbCA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICpcbiAqL1xuXG5yZXF1ZXN0LnR5cGVzID0ge1xuICBodG1sOiAndGV4dC9odG1sJyxcbiAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB4bWw6ICd0ZXh0L3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICBmb3JtOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgJ2Zvcm0tZGF0YSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7XG4gKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBzZXJpYWxpemUsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogc2FmZVN0cmluZ2lmeVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IHBhcnNlcnMuXG4gKlxuICogICAgIHN1cGVyYWdlbnQucGFyc2VbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24oc3RyKXtcbiAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAqICAgICB9O1xuICpcbiAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBmaWVsZHMgPSB7fTtcbiAgbGV0IGluZGV4O1xuICBsZXQgbGluZTtcbiAgbGV0IGZpZWxkO1xuICBsZXQgdmFsO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxpbmUgPSBsaW5lc1tpXTtcbiAgICBpbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIGNvdWxkIGJlIGVtcHR5IGxpbmUsIGp1c3Qgc2tpcCBpdFxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmllbGQgPSBsaW5lLnNsaWNlKDAsIGluZGV4KS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHRyaW0obGluZS5zbGljZShpbmRleCArIDEpKTtcbiAgICBmaWVsZHNbZmllbGRdID0gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMganNvbiBvciBoYXMgK2pzb24gc3RydWN0dXJlZCBzeW50YXggc3VmZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNKU09OKG1pbWUpIHtcbiAgLy8gc2hvdWxkIG1hdGNoIC9qc29uIG9yICtqc29uXG4gIC8vIGJ1dCBub3QgL2pzb24tc2VxXG4gIHJldHVybiAvWy8rXWpzb24oJHxbXi1cXHddKS8udGVzdChtaW1lKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZWAgd2l0aCB0aGUgZ2l2ZW4gYHhocmAuXG4gKlxuICogIC0gc2V0IGZsYWdzICgub2ssIC5lcnJvciwgZXRjKVxuICogIC0gcGFyc2UgaGVhZGVyXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIEFsaWFzaW5nIGBzdXBlcmFnZW50YCBhcyBgcmVxdWVzdGAgaXMgbmljZTpcbiAqXG4gKiAgICAgIHJlcXVlc3QgPSBzdXBlcmFnZW50O1xuICpcbiAqICBXZSBjYW4gdXNlIHRoZSBwcm9taXNlLWxpa2UgQVBJLCBvciBwYXNzIGNhbGxiYWNrczpcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJykuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJywgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgU2VuZGluZyBkYXRhIGNhbiBiZSBjaGFpbmVkOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5zZW5kKClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIE9yIHBhc3NlZCB0byBgLnBvc3QoKWA6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIE9yIGZ1cnRoZXIgcmVkdWNlZCB0byBhIHNpbmdsZSBjYWxsIGZvciBzaW1wbGUgY2FzZXM6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogQHBhcmFtIHtYTUxIVFRQUmVxdWVzdH0geGhyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2UocmVxKSB7XG4gIHRoaXMucmVxID0gcmVxO1xuICB0aGlzLnhociA9IHRoaXMucmVxLnhocjtcbiAgLy8gcmVzcG9uc2VUZXh0IGlzIGFjY2Vzc2libGUgb25seSBpZiByZXNwb25zZVR5cGUgaXMgJycgb3IgJ3RleHQnIGFuZCBvbiBvbGRlciBicm93c2Vyc1xuICB0aGlzLnRleHQgPVxuICAgICh0aGlzLnJlcS5tZXRob2QgIT09ICdIRUFEJyAmJlxuICAgICAgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fFxuICAgIHR5cGVvZiB0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICd1bmRlZmluZWQnXG4gICAgICA/IHRoaXMueGhyLnJlc3BvbnNlVGV4dFxuICAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgbGV0IHsgc3RhdHVzIH0gPSB0aGlzLnhocjtcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG5cbiAgdGhpcy5fc2V0U3RhdHVzUHJvcGVydGllcyhzdGF0dXMpO1xuICB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIHRoaXMuaGVhZGVyID0gdGhpcy5oZWFkZXJzO1xuICAvLyBnZXRBbGxSZXNwb25zZUhlYWRlcnMgc29tZXRpbWVzIGZhbHNlbHkgcmV0dXJucyBcIlwiIGZvciBDT1JTIHJlcXVlc3RzLCBidXRcbiAgLy8gZ2V0UmVzcG9uc2VIZWFkZXIgc3RpbGwgd29ya3MuIHNvIHdlIGdldCBjb250ZW50LXR5cGUgZXZlbiBpZiBnZXR0aW5nXG4gIC8vIG90aGVyIGhlYWRlcnMgZmFpbHMuXG4gIHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSA9IHRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKTtcbiAgdGhpcy5fc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7XG5cbiAgaWYgKHRoaXMudGV4dCA9PT0gbnVsbCAmJiByZXEuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHRoaXMuYm9keSA9IHRoaXMueGhyLnJlc3BvbnNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYm9keSA9XG4gICAgICB0aGlzLnJlcS5tZXRob2QgPT09ICdIRUFEJ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLl9wYXJzZUJvZHkodGhpcy50ZXh0ID8gdGhpcy50ZXh0IDogdGhpcy54aHIucmVzcG9uc2UpO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG5SZXNwb25zZUJhc2UoUmVzcG9uc2UucHJvdG90eXBlKTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYm9keSBgc3RyYC5cbiAqXG4gKiBVc2VkIGZvciBhdXRvLXBhcnNpbmcgb2YgYm9kaWVzLiBQYXJzZXJzXG4gKiBhcmUgZGVmaW5lZCBvbiB0aGUgYHN1cGVyYWdlbnQucGFyc2VgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5fcGFyc2VCb2R5ID0gZnVuY3Rpb24oc3RyKSB7XG4gIGxldCBwYXJzZSA9IHJlcXVlc3QucGFyc2VbdGhpcy50eXBlXTtcbiAgaWYgKHRoaXMucmVxLl9wYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuX3BhcnNlcih0aGlzLCBzdHIpO1xuICB9XG5cbiAgaWYgKCFwYXJzZSAmJiBpc0pTT04odGhpcy50eXBlKSkge1xuICAgIHBhcnNlID0gcmVxdWVzdC5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlICYmIHN0ciAmJiAoc3RyLmxlbmd0aCA+IDAgfHwgc3RyIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgID8gcGFyc2Uoc3RyKVxuICAgIDogbnVsbDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIGBFcnJvcmAgcmVwcmVzZW50YXRpdmUgb2YgdGhpcyByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLnRvRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgeyByZXEgfSA9IHRoaXM7XG4gIGNvbnN0IHsgbWV0aG9kIH0gPSByZXE7XG4gIGNvbnN0IHsgdXJsIH0gPSByZXE7XG5cbiAgY29uc3QgbXNnID0gYGNhbm5vdCAke21ldGhvZH0gJHt1cmx9ICgke3RoaXMuc3RhdHVzfSlgO1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gbWV0aG9kO1xuICBlcnIudXJsID0gdXJsO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VgLlxuICovXG5cbnJlcXVlc3QuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG1ldGhvZCwgdXJsKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICB0aGlzLl9xdWVyeSA9IHRoaXMuX3F1ZXJ5IHx8IFtdO1xuICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMuaGVhZGVyID0ge307IC8vIHByZXNlcnZlcyBoZWFkZXIgbmFtZSBjYXNlXG4gIHRoaXMuX2hlYWRlciA9IHt9OyAvLyBjb2VyY2VzIGhlYWRlciBuYW1lcyB0byBsb3dlcmNhc2VcbiAgdGhpcy5vbignZW5kJywgKCkgPT4ge1xuICAgIGxldCBlcnIgPSBudWxsO1xuICAgIGxldCByZXMgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IG5ldyBSZXNwb25zZShzZWxmKTtcbiAgICB9IGNhdGNoIChlcnJfKSB7XG4gICAgICBlcnIgPSBuZXcgRXJyb3IoJ1BhcnNlciBpcyB1bmFibGUgdG8gcGFyc2UgdGhlIHJlc3BvbnNlJyk7XG4gICAgICBlcnIucGFyc2UgPSB0cnVlO1xuICAgICAgZXJyLm9yaWdpbmFsID0gZXJyXztcbiAgICAgIC8vIGlzc3VlICM2NzU6IHJldHVybiB0aGUgcmF3IHJlc3BvbnNlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICBpZiAoc2VsZi54aHIpIHtcbiAgICAgICAgLy8gaWU5IGRvZXNuJ3QgaGF2ZSAncmVzcG9uc2UnIHByb3BlcnR5XG4gICAgICAgIGVyci5yYXdSZXNwb25zZSA9XG4gICAgICAgICAgdHlwZW9mIHNlbGYueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gc2VsZi54aHIucmVzcG9uc2VUZXh0XG4gICAgICAgICAgICA6IHNlbGYueGhyLnJlc3BvbnNlO1xuICAgICAgICAvLyBpc3N1ZSAjODc2OiByZXR1cm4gdGhlIGh0dHAgc3RhdHVzIGNvZGUgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZXJyLnN0YXR1cyA9IHNlbGYueGhyLnN0YXR1cyA/IHNlbGYueGhyLnN0YXR1cyA6IG51bGw7XG4gICAgICAgIGVyci5zdGF0dXNDb2RlID0gZXJyLnN0YXR1czsgLy8gYmFja3dhcmRzLWNvbXBhdCBvbmx5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnIucmF3UmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnIuc3RhdHVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBzZWxmLmVtaXQoJ3Jlc3BvbnNlJywgcmVzKTtcblxuICAgIGxldCBuZXdfZXJyO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXNlbGYuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIG5ld19lcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgcmVzLnN0YXR1c1RleHQgfHwgcmVzLnRleHQgfHwgJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycl8pIHtcbiAgICAgIG5ld19lcnIgPSBlcnJfOyAvLyBvaygpIGNhbGxiYWNrIGNhbiB0aHJvd1xuICAgIH1cblxuICAgIC8vICMxMDAwIGRvbid0IGNhdGNoIGVycm9ycyBmcm9tIHRoZSBjYWxsYmFjayB0byBhdm9pZCBkb3VibGUgY2FsbGluZyBpdFxuICAgIGlmIChuZXdfZXJyKSB7XG4gICAgICBuZXdfZXJyLm9yaWdpbmFsID0gZXJyO1xuICAgICAgbmV3X2Vyci5yZXNwb25zZSA9IHJlcztcbiAgICAgIG5ld19lcnIuc3RhdHVzID0gcmVzLnN0YXR1cztcbiAgICAgIHNlbGYuY2FsbGJhY2sobmV3X2VyciwgcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5jYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWl4aW4gYEVtaXR0ZXJgIGFuZCBgUmVxdWVzdEJhc2VgLlxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG5FbWl0dGVyKFJlcXVlc3QucHJvdG90eXBlKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG5SZXF1ZXN0QmFzZShSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogU2V0IENvbnRlbnQtVHlwZSB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy54bWwgPSAnYXBwbGljYXRpb24veG1sJztcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24veG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24odHlwZSkge1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdGhpcy5zZXQoJ0FjY2VwdCcsIHJlcXVlc3QudHlwZXNbdHlwZV0gfHwgdHlwZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgQXV0aG9yaXphdGlvbiBmaWVsZCB2YWx1ZSB3aXRoIGB1c2VyYCBhbmQgYHBhc3NgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdIG9wdGlvbmFsIGluIGNhc2Ugb2YgdXNpbmcgJ2JlYXJlcicgYXMgdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgd2l0aCAndHlwZScgcHJvcGVydHkgJ2F1dG8nLCAnYmFzaWMnIG9yICdiZWFyZXInIChkZWZhdWx0ICdiYXNpYycpXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MsIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHBhc3MgPSAnJztcbiAgaWYgKHR5cGVvZiBwYXNzID09PSAnb2JqZWN0JyAmJiBwYXNzICE9PSBudWxsKSB7XG4gICAgLy8gcGFzcyBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlcGxhY2VkIHdpdGggb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBwYXNzO1xuICAgIHBhc3MgPSAnJztcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJyA/ICdiYXNpYycgOiAnYXV0bydcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZW5jb2RlciA9IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYnRvYShzdHJpbmcpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBiYXNpYyBhdXRoLCBidG9hIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH07XG5cbiAgcmV0dXJuIHRoaXMuX2F1dGgodXNlciwgcGFzcywgb3B0aW9ucywgZW5jb2Rlcik7XG59O1xuXG4vKipcbiAqIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiAqICAgICAucXVlcnkoJ3NpemU9MTAnKVxuICogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24odmFsKSB7XG4gIGlmICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJykgdmFsID0gc2VyaWFsaXplKHZhbCk7XG4gIGlmICh2YWwpIHRoaXMuX3F1ZXJ5LnB1c2godmFsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFF1ZXVlIHRoZSBnaXZlbiBgZmlsZWAgYXMgYW4gYXR0YWNobWVudCB0byB0aGUgc3BlY2lmaWVkIGBmaWVsZGAsXG4gKiB3aXRoIG9wdGlvbmFsIGBvcHRpb25zYCAob3IgZmlsZW5hbWUpLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnY29udGVudCcsIG5ldyBCbG9iKFsnPGEgaWQ9XCJhXCI+PGIgaWQ9XCJiXCI+aGV5ITwvYj48L2E+J10sIHsgdHlwZTogXCJ0ZXh0L2h0bWxcIn0pKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtCbG9ifEZpbGV9IGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uKGZpZWxkLCBmaWxlLCBvcHRpb25zKSB7XG4gIGlmIChmaWxlKSB7XG4gICAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgb3B0aW9ucyB8fCBmaWxlLm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcbn07XG5cbi8qKlxuICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYFxuICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbihlcnIsIHJlcykge1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICBjb25zdCBmbiA9IHRoaXMuX2NhbGxiYWNrO1xuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIGlmIChlcnIpIHtcbiAgICBpZiAodGhpcy5fbWF4UmV0cmllcykgZXJyLnJldHJpZXMgPSB0aGlzLl9yZXRyaWVzIC0gMTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZuKGVyciwgcmVzKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggeC1kb21haW4gZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY3Jvc3NEb21haW5FcnJvciA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgJ1JlcXVlc3QgaGFzIGJlZW4gdGVybWluYXRlZFxcblBvc3NpYmxlIGNhdXNlczogdGhlIG5ldHdvcmsgaXMgb2ZmbGluZSwgT3JpZ2luIGlzIG5vdCBhbGxvd2VkIGJ5IEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiwgdGhlIHBhZ2UgaXMgYmVpbmcgdW5sb2FkZWQsIGV0Yy4nXG4gICk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG5cbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIGVyci51cmwgPSB0aGlzLnVybDtcblxuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vLyBUaGlzIG9ubHkgd2FybnMsIGJlY2F1c2UgdGhlIHJlcXVlc3QgaXMgc3RpbGwgbGlrZWx5IHRvIHdvcmtcblJlcXVlc3QucHJvdG90eXBlLmFnZW50ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUud2FybignVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgdmVyc2lvbiBvZiBzdXBlcmFnZW50Jyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuY2EgPSBSZXF1ZXN0LnByb3RvdHlwZS5hZ2VudDtcblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IFJlcXVlc3QucHJvdG90eXBlLmNhO1xuXG4vLyBUaGlzIHRocm93cywgYmVjYXVzZSBpdCBjYW4ndCBzZW5kL3JlY2VpdmUgZGF0YSBhcyBleHBlY3RlZFxuUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQnXG4gICk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlID0gUmVxdWVzdC5wcm90b3R5cGUud3JpdGU7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBob3N0IG9iamVjdFxuICogQHJldHVybiB7Qm9vbGVhbn0gaXMgYSBob3N0IG9iamVjdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9pc0hvc3QgPSBmdW5jdGlvbihvYmopIHtcbiAgLy8gTmF0aXZlIG9iamVjdHMgc3RyaW5naWZ5IHRvIFtvYmplY3QgRmlsZV0sIFtvYmplY3QgQmxvYl0sIFtvYmplY3QgRm9ybURhdGFdLCBldGMuXG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShvYmopICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nXG4gICk7XG59O1xuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbikge1xuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dhcm5pbmc6IC5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudCdcbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuXG4gIHRoaXMuX2VuZCgpO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX3NldFVwbG9hZFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gdXBsb2FkIHRpbWVvdXQgaXQncyB3b2tycyBvbmx5IGlmIGRlYWRsaW5lIHRpbWVvdXQgaXMgb2ZmXG4gIGlmICh0aGlzLl91cGxvYWRUaW1lb3V0ICYmICF0aGlzLl91cGxvYWRUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl91cGxvYWRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcihcbiAgICAgICAgJ1VwbG9hZCB0aW1lb3V0IG9mICcsXG4gICAgICAgIHNlbGYuX3VwbG9hZFRpbWVvdXQsXG4gICAgICAgICdFVElNRURPVVQnXG4gICAgICApO1xuICAgIH0sIHRoaXMuX3VwbG9hZFRpbWVvdXQpO1xuICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuUmVxdWVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZClcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhcbiAgICAgIG5ldyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBldmVuIGJlZm9yZSAuZW5kKCkgd2FzIGNhbGxlZCcpXG4gICAgKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgdGhpcy54aHIgPSByZXF1ZXN0LmdldFhIUigpO1xuICBjb25zdCB7IHhociB9ID0gdGhpcztcbiAgbGV0IGRhdGEgPSB0aGlzLl9mb3JtRGF0YSB8fCB0aGlzLl9kYXRhO1xuXG4gIHRoaXMuX3NldFRpbWVvdXRzKCk7XG5cbiAgLy8gc3RhdGUgY2hhbmdlXG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgY29uc3QgeyByZWFkeVN0YXRlIH0gPSB4aHI7XG4gICAgaWYgKHJlYWR5U3RhdGUgPj0gMiAmJiBzZWxmLl9yZXNwb25zZVRpbWVvdXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgICB9XG5cbiAgICBpZiAocmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIElFOSwgcmVhZHMgdG8gYW55IHByb3BlcnR5IChlLmcuIHN0YXR1cykgb2ZmIG9mIGFuIGFib3J0ZWQgWEhSIHdpbGxcbiAgICAvLyByZXN1bHQgaW4gdGhlIGVycm9yIFwiQ291bGQgbm90IGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gZHVlIHRvIGVycm9yIGMwMGMwMjNmXCJcbiAgICBsZXQgc3RhdHVzO1xuICAgIHRyeSB7XG4gICAgICBzdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc3RhdHVzID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgaWYgKHNlbGYudGltZWRvdXQgfHwgc2VsZi5fYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgcmV0dXJuIHNlbGYuY3Jvc3NEb21haW5FcnJvcigpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgnZW5kJyk7XG4gIH07XG5cbiAgLy8gcHJvZ3Jlc3NcbiAgY29uc3QgaGFuZGxlUHJvZ3Jlc3MgPSAoZGlyZWN0aW9uLCBlKSA9PiB7XG4gICAgaWYgKGUudG90YWwgPiAwKSB7XG4gICAgICBlLnBlcmNlbnQgPSAoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMDtcblxuICAgICAgaWYgKGUucGVyY2VudCA9PT0gMTAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl91cGxvYWRUaW1lb3V0VGltZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBlKTtcbiAgfTtcblxuICBpZiAodGhpcy5oYXNMaXN0ZW5lcnMoJ3Byb2dyZXNzJykpIHtcbiAgICB0cnkge1xuICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgaGFuZGxlUHJvZ3Jlc3MuYmluZChudWxsLCAnZG93bmxvYWQnKSk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ3Byb2dyZXNzJyxcbiAgICAgICAgICBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICd1cGxvYWQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjZXNzaW5nIHhoci51cGxvYWQgZmFpbHMgaW4gSUUgZnJvbSBhIHdlYiB3b3JrZXIsIHNvIGp1c3QgcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgLy8gUmVwb3J0ZWQgaGVyZTpcbiAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvODM3MjQ1L3htbGh0dHByZXF1ZXN0LXVwbG9hZC10aHJvd3MtaW52YWxpZC1hcmd1bWVudC13aGVuLXVzZWQtZnJvbS13ZWItd29ya2VyLWNvbnRleHRcbiAgICB9XG4gIH1cblxuICBpZiAoeGhyLnVwbG9hZCkge1xuICAgIHRoaXMuX3NldFVwbG9hZFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgdHJ5IHtcbiAgICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUsIHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gc2VlICMxMTQ5XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIENPUlNcbiAgaWYgKHRoaXMuX3dpdGhDcmVkZW50aWFscykgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgLy8gYm9keVxuICBpZiAoXG4gICAgIXRoaXMuX2Zvcm1EYXRhICYmXG4gICAgdGhpcy5tZXRob2QgIT09ICdHRVQnICYmXG4gICAgdGhpcy5tZXRob2QgIT09ICdIRUFEJyAmJlxuICAgIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyAmJlxuICAgICF0aGlzLl9pc0hvc3QoZGF0YSlcbiAgKSB7XG4gICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIGxldCBzZXJpYWxpemUgPVxuICAgICAgdGhpcy5fc2VyaWFsaXplciB8fFxuICAgICAgcmVxdWVzdC5zZXJpYWxpemVbY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdIDogJyddO1xuICAgIGlmICghc2VyaWFsaXplICYmIGlzSlNPTihjb250ZW50VHlwZSkpIHtcbiAgICAgIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgfVxuXG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAoY29uc3QgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAodGhpcy5oZWFkZXJbZmllbGRdID09PSBudWxsKSBjb250aW51ZTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5oZWFkZXIsIGZpZWxkKSlcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBkYXRhKTtcbn07XG5cbnJlcXVlc3QuYWdlbnQgPSAoKSA9PiBuZXcgQWdlbnQoKTtcblxuWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJywgJ1BBVENIJywgJ1BVVCcsICdERUxFVEUnXS5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gIEFnZW50LnByb3RvdHlwZVttZXRob2QudG9Mb3dlckNhc2UoKV0gPSBmdW5jdGlvbih1cmwsIGZuKSB7XG4gICAgY29uc3QgcmVxID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdHMocmVxKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcS5lbmQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiByZXE7XG4gIH07XG59KTtcblxuQWdlbnQucHJvdG90eXBlLmRlbCA9IEFnZW50LnByb3RvdHlwZS5kZWxldGU7XG5cbi8qKlxuICogR0VUIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5nZXQgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXEgPSByZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IGRhdGE7XG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5oZWFkID0gKHVybCwgZGF0YSwgZm4pID0+IHtcbiAgY29uc3QgcmVxID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gZGF0YTtcbiAgICBkYXRhID0gbnVsbDtcbiAgfVxuXG4gIGlmIChkYXRhKSByZXEucXVlcnkoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIE9QVElPTlMgcXVlcnkgdG8gYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0Lm9wdGlvbnMgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXEgPSByZXF1ZXN0KCdPUFRJT05TJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBERUxFVEUgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlbCh1cmwsIGRhdGEsIGZuKSB7XG4gIGNvbnN0IHJlcSA9IHJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gZGF0YTtcbiAgICBkYXRhID0gbnVsbDtcbiAgfVxuXG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn1cblxucmVxdWVzdC5kZWwgPSBkZWw7XG5yZXF1ZXN0LmRlbGV0ZSA9IGRlbDtcblxuLyoqXG4gKiBQQVRDSCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkYXRhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wYXRjaCA9ICh1cmwsIGRhdGEsIGZuKSA9PiB7XG4gIGNvbnN0IHJlcSA9IHJlcXVlc3QoJ1BBVENIJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQT1NUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQVVQgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucHV0ID0gKHVybCwgZGF0YSwgZm4pID0+IHtcbiAgY29uc3QgcmVxID0gcmVxdWVzdCgnUFVUJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcbiJdfQ==","export default class UserUtil {\n constructor (user) {\n this.user = user\n }\n\n isDealCustomer() {\n return this.user.account_type === 'deal'\n }\n\n isCustomer() {\n return this.user.account_type === 'pro'\n }\n\n isAdmin() {\n return this.user.role === 'admin' || process.env.NODE_ENV === 'development'\n }\n\n isAdminOrOwner() {\n return this.user.role === 'admin' || this.user.role === 'owner'\n }\n\n hasAiTokens() {\n // TODO: implement!\n\n // console.log('TODO: set isCustomer and hasAiTokens variables correctly')\n let isCustomer = true\n let hasAiTokens = true\n\n return true\n }\n}","import http from 'superagent'\n\nexport default class RestService {\n constructor(modelPath) {\n this.modelPath = modelPath\n this.authToken = webase.model.auth_token\n this.http = http\n this.baseUrl = webase.utils.app.getBaseUrl()\n }\n\n list() {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '.json?t=' + Date.now()\n return this.executeGet(url)\n }\n\n\n get(id) {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '/' + id + '.json?t=' + Date.now()\n return this.executeGet(url)\n }\n\n executeGet(url) {\n return new Promise((resolve, reject) => {\n http.get(url)\n .set('x-api-token', this.authToken)\n .end((error, response) => {\n\n if (response.status === 200 || response.status === 201) {\n const data = JSON.parse(response.text)\n resolve(data)\n } else {\n reject(JSON.parse(response.text))\n }\n })\n });\n }\n\n create(model) {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '.json?t=' + Date.now()\n return this.executePost(url, model)\n }\n\n update(id, model) {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '/' + id + '.json?t=' + Date.now()\n return this.executePut(url, model)\n }\n\n executePut(url, model) {\n return new Promise((resolve, reject) => {\n http.put(url)\n .send(model)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200) {\n resolve(JSON.parse(response.text))\n } else {\n reject(JSON.parse(response.text))\n }\n })\n })\n }\n\n executePost(url, model) {\n return new Promise((resolve, reject) => {\n http.post(url)\n .send(model)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(JSON.parse(response.text))\n }\n })\n })\n }\n\n remove(id) {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '/' + id + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n http.delete(url)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end(function (error, response) {\n if (response.status === 200 || response.status === 204) {\n response.status === 204 ? resolve() : resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n convertToMultpart(data) {\n let formData = new FormData()\n let modelName = Object.keys(data)[0]\n let fieldNames = Object.keys(data[modelName])\n\n for (let i = 0; i < fieldNames.length; i++) {\n let fieldName = fieldNames[i]\n\n if (data[modelName][fieldName]) {\n formData.append(`${modelName}[${fieldName}]`, data[modelName][fieldName])\n }\n }\n\n return formData\n }\n\n}\n","import http from 'superagent'\nimport UserUtil from \"../utils/UserUtil\";\nimport RestService from \"./RestService\";\n\nexport default class UserService extends RestService {\n\n constructor() {\n super('users')\n }\n\n signUp(user, site) {\n\n let model = {\n user: {\n email: user.email,\n password: user.password,\n password_confirmation: user.password_confirmation,\n name: user.name,\n site: site\n }\n }\n\n if(user.invite_uuid) {\n model.user['invite_uuid'] = user.invite_uuid\n }\n\n if(user.app_id) {\n model.user['app_id'] = user.app_id\n }\n\n return new Promise((resolve, reject) => {\n http.post(this.baseUrl + '/api/v1/sign-up')\n .send(model)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n const user = JSON.parse(response.text);\n resolve(user)\n }\n else {\n reject(JSON.parse(response.text))\n }\n\n })\n })\n }\n\n login(email, password, site) {\n const model = {\n user: {\n email: email,\n password: password,\n site: site\n }\n };\n\n return new Promise((resolve, reject) => {\n http.post(this.baseUrl + '/api/v1/login')\n .send(model)\n .set('Accept', 'application/json')\n .end((error, response) => {\n\n if (response.status === 200 || response.status === 201) {\n const user = JSON.parse(response.text);\n resolve(user)\n }\n else {\n reject(JSON.parse(response.text))\n }\n\n })\n })\n }\n\n logout() {\n let authToken = webase.model.auth_token\n\n return new Promise((resolve, reject) => {\n http.get(this.baseUrl + '/api/v1/logout')\n .set('x-api-token', authToken)\n .end(function (error, response) {\n if (response.status === 204) {\n resolve()\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n permissions( appId ) {\n let authToken = webase.model.auth_token\n let url = this.baseUrl + '/api/v1/permissions.json'\n\n if(appId) {\n url = url + '?app_id=' + appId\n }\n\n return new Promise((resolve, reject) => {\n http.get(url)\n .set('x-api-token', authToken)\n .end(function (error, response) {\n\n if (error) {\n console.log('error')\n console.log(error)\n reject(error)\n return\n }\n\n if (response.status === 200) {\n const permissions = JSON.parse(response.text)\n webase.model.permissions = permissions\n resolve(permissions)\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n referrals() {\n let service = new RestService('users')\n let url = this.baseUrl + '/api/v1/users/referrals.json'\n return service.executeGet(url)\n }\n\n current() {\n let authToken = webase.model.auth_token\n\n return new Promise((resolve, reject) => {\n http.get(this.baseUrl + '/api/v1/users/current.json')\n .set('x-api-token', authToken)\n .end( (error, response) => {\n\n if (error) {\n console.log('error')\n console.log(error)\n reject(error)\n return\n }\n\n if (response.status === 200) {\n const user = JSON.parse(response.text)\n webase.model.user_id = user.id\n webase.model.currentUser = user\n webase.utils.user = new UserUtil(user)\n resolve(user)\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n}","export default class ArrayUtil {\n\n get(list, objectId, idProperty) {\n for (let i = 0; i < list.length; i++) {\n\n // id can be stored in index to slightly obfuscate\n if (list[i].id === objectId || list[i].index === objectId) {\n return list[i]\n }\n\n if(idProperty && list[i][idProperty] === objectId) {\n return list[i]\n }\n }\n }\n\n update(list, object) {\n for (let i = 0; i < list.length; i++) {\n\n if (list[i].id === object.id) {\n list[i] = object\n break\n }\n }\n }\n\n remove(list, id) {\n for (let i = 0; i < list.length; i++) {\n\n if (list[i].id === id || list[i] === id) {\n list.splice(i, 1)\n break\n }\n }\n }\n\n getItemIndex(list, item) {\n for (let i = 0; i < list.length; i++) {\n\n if (list[i] === item) {\n return i\n }\n }\n\n return -1\n }\n\n swapElements (list, index1, index2) {\n const temp = list[index1]\n list[index1] = list[index2]\n list[index2] = temp\n };\n\n filter(list, stringFragment) {\n return list.filter((listItem) => {\n return listItem.indexOf(stringFragment) < 0\n })\n }\n\n filterAll(list, list2) {\n return list.filter((listItem) => {\n\n for (let i = 0; i < list2.length; i++) {\n if(listItem.indexOf(list2[i]) === 0) {\n return false\n }\n }\n\n return true\n })\n }\n\n random(list) {\n return list[Math.floor(Math.random()*list.length)]\n }\n\n listToGrid(list, itemCountInRow) {\n let gridData = []\n let currentRow = []\n\n for (let i = 0; i < list.length; i++) {\n if (i % itemCountInRow === 0) {\n currentRow = []\n gridData.push(currentRow)\n }\n\n currentRow.push(list[i])\n }\n\n return gridData\n }\n}","export default class FieldUtil {\n\n constructor(field) {\n this.field = field\n }\n\n isCollaborator() {\n return this.field.field_type === 'Collaborator'\n }\n\n isCurrentUser() {\n return this.isCollaborator() && this.field.metadata && this.field.metadata.currentUser\n }\n\n editable() {\n return this.field.field_type !== 'Link to Object' && this.field.field_type !== 'Dynamic' &&\n !this.isFixedCollaborator()\n }\n\n isFixedCollaborator() {\n return this.field.field_type === 'Collaborator' && this.isUserFixed()\n }\n\n isUserFixed() {\n return this.field.metadata && this.field.metadata['currentUser']\n }\n\n isNumeric() {\n return this.field.field_type === 'Dynamic' || this.field.field_type === 'Number'\n }\n\n}","import DateUtil from \"./DateUtil\";\nimport FieldUtil from \"./FieldUtil\";\n\nexport default class TableUtil {\n createRecord(table) {\n let document = {}\n let fields = table.fields\n\n // NOTE: the field \"index\" is actually its ID\n for (let i = 0; i < fields.length; i++) {\n let field = fields[i]\n\n if (new FieldUtil(field).isFixedCollaborator()) {\n document[field.index] = webase.managers.app.currentCollaborator()\n } else {\n document[field.index] = this.initField(field)\n }\n }\n\n return document\n }\n\n initField(field) {\n if (field.field_type === 'Date') {\n return new Date()\n } else if (field.field_type === 'Boolean') {\n return false\n } else if (field.field_type === 'Link to Object') {\n return {} // this is stored as an internal Hash\n } else if (field.field_type === 'Attachment') {\n return []\n } else {\n return ''\n }\n }\n\n\n supportsPdf(table) {\n let textField = this.getTextField(table)\n\n if(textField && textField.metadata && textField.metadata.pdfExport) {\n return true\n }\n\n let attachmentField = this.getAttachmentField(table)\n\n if(attachmentField) {\n return true\n }\n\n return false\n }\n\n pdfLink(table, document) {\n let linkedObjectField = webase.utils.table.getLinkedObjectField(table)\n let relatedTable = webase.managers.app.getTable(linkedObjectField.related_model_id)\n\n let relatedObject = document[linkedObjectField.index]\n\n if (linkedObjectField.field_type === 'Collaborator') {\n relatedObject = document[linkedObjectField.index].name\n }\n\n let documentIds = Object.keys(relatedObject)\n let relatedDocumentId = documentIds.length > 0 ? documentIds[0] : null\n\n if (linkedObjectField && relatedTable&& relatedObject && relatedDocumentId) {\n return `/pdf/${relatedTable.id}/${relatedDocumentId}/${table.id}/${document['id']}`\n }\n\n return '#'\n }\n\n hasFixedCollaborator(table) {\n return this.getFixedCollaborator(table) !== null\n }\n\n getFixedCollaborator(table) {\n let collaboratorField = this.getCollaboratorField(table)\n\n if (collaboratorField) {\n let fieldUtil = new FieldUtil(collaboratorField)\n\n if (fieldUtil.isUserFixed()) {\n return collaboratorField\n }\n }\n\n return null\n }\n\n getCollaboratorField(table) {\n return this.getFieldByType(table, 'Collaborator')\n }\n\n getLinkedObjectField(table) {\n return this.getFieldByType(table, 'Link to Object')\n }\n\n hasSelectField(table) {\n return this.getSelectField(table) !== null\n }\n\n getSelectField(table) {\n return this.getFieldByType(table, 'Single Select')\n }\n\n hasImageField(table) {\n return this.getImageField(table) !== null\n }\n\n getImageField(table) {\n return this.getFieldByType(table, 'Image')\n }\n\n getDateField(table) {\n return this.getFieldByType(table, 'Date')\n }\n\n hasTextField(table) {\n return this.getTextField(table) !== null\n }\n\n getTextField(table) {\n return this.getFieldByType(table, 'Text')\n }\n\n getAttachmentField(table) {\n return this.getFieldByType(table, 'Attachment')\n }\n\n getChildTable(table) {\n let field = this.getLinkedObjectField(table)\n\n if (field['child_model_id']) {\n return webase.utils.array.get(webase.model.app.tables, field['child_model_id'])\n }\n\n return null\n }\n\n getGroupField(view, table) {\n let groupFields = table.fields.filter(field => (field.index === view.group_field_id))\n\n if (groupFields) {\n return groupFields[0]\n }\n\n return this.getSelectField(table)\n }\n\n getAvailableOperands(table) {\n let numericFields = this.getNumbericFields(table)\n\n if (table.parent) {\n let parentTable = webase.utils.array.get(webase.model.app.tables, table.parent)\n let parentNumericFields = this.getNumbericFields(parentTable)\n return numericFields.concat(parentNumericFields)\n }\n\n let childTable = this.getChildTable(table)\n\n if (childTable) {\n let childNumericFields = this.getNumbericFields(childTable)\n return numericFields.concat(childNumericFields)\n }\n\n return numericFields\n }\n\n getNumbericFields(table) {\n return table.fields.filter(field => (field.field_type === 'Number' || field.field_type === 'Dynamic'))\n }\n\n getListFields(table) {\n return table.fields.filter(field => (field.field_type !== 'Link to Object' && field.field_type !== 'Text'))\n }\n\n getFieldByType(table, fieldType) {\n if (table && table.fields.length > 0) {\n let fields = table.fields\n\n for (let i = 0; i < fields.length; i++) {\n let field = fields[i]\n\n if (field.field_type === fieldType) {\n return field\n }\n }\n }\n\n return null\n }\n\n getFieldByName(table, fieldName) {\n return table.fields.filter(field => (field.name === fieldName))[0]\n }\n\n getPrimaryField(table) {\n if (table === null || table.fields.length === 0) {\n return {id: '', name: 'Name'}\n }\n\n return table.fields[0]\n }\n\n getRelatedField(table, relatedModelId) {\n return table.fields.filter(field => (field.related_model_id === relatedModelId))[0]\n }\n\n isLinkedObject(field) {\n return field.field_type === 'Link to Object'\n }\n\n isCollaborator(field) {\n return field.field_type === 'Collaborator'\n }\n\n isVisibleOnList(field) {\n return field.field_type !== 'Link to Object' && field.field_type !== 'Text'\n }\n\n getFieldColor(field, value) {\n let fieldOptions = field.metadata\n\n if (fieldOptions) {\n for (let i = 0; i < fieldOptions.length; i++) {\n\n let fieldOption = fieldOptions[i]\n\n if (fieldOption.value === value) {\n return fieldOption.color\n }\n }\n }\n\n return '#6c757d'\n }\n\n hasFormView(table) {\n return this.hasView(table, 'form')\n }\n\n getFormView(table) {\n let formViews = table.views.filter(view => (view.view_type === 'form'))\n return formViews[0]\n }\n\n hasDetailsView(table) {\n return this.hasView(table, 'details')\n }\n\n getDetailsView(table) {\n let formViews = table.views.filter(view => (view.view_type === 'details'))\n return formViews[0]\n }\n\n hasView(table, viewType) {\n return table.views.filter(view => (view.view_type === viewType)).length > 0\n }\n\n isImage(attachment) {\n return attachment.file_type === 'image/jpeg' || attachment.file_type === 'image/jpg' ||\n attachment.file_type === 'image/png'\n }\n}","export default class UIUtil {\n\n constructor() {\n this.injectedFonts = {}\n this.previewedFonts = {}\n }\n\n usedFonts() {\n return Object.keys(this.injectedFonts)\n }\n\n injectCss(theme_path) {\n this.removeThemeLink(\"webase-theme\")\n let url = `/api/v1/${theme_path}.css?t=${Date.now()}`\n let link = document.createElement(\"link\");\n link.id = 'webase-theme'\n link.href = url;\n link.rel = \"stylesheet\";\n let newElement = document.getElementsByTagName(\"head\")[0].appendChild(link);\n console.log(newElement)\n }\n\n getTailwindCss() {\n let styleElements = document.getElementsByTagName(\"style\");\n\n for(let i = 0; i < styleElements.length; i++) {\n let styleElement = styleElements[i]\n if(styleElement.textContent.indexOf('tailwindcss') > 0) {\n return styleElement.textContent\n }\n }\n\n return ''\n }\n\n injectTempCss(theme_path) {\n this.removeThemeLink(\"webase-temp-theme\")\n let url = `/api/v1/${theme_path}.css?temp=1&t=${Date.now()}`\n let link = document.createElement(\"link\");\n link.id = 'webase-temp-theme'\n link.href = url;\n link.rel = \"stylesheet\";\n let newElement = document.getElementsByTagName(\"head\")[0].appendChild(link);\n console.log(newElement)\n }\n\n removeThemeLink(themeId) {\n const element = document.getElementById(themeId);\n\n if (element) {\n element.remove();\n }\n }\n\n availableWeights(fontList, fontFamily) {\n for (let i = 0; i < fontList.length; i++) {\n let font = fontList[i]\n\n if (font.family === fontFamily) {\n return font.variants.filter(variant => variant.indexOf('italic') < 0)\n }\n }\n\n return []\n }\n\n injectFont(fontFamily, weights) {\n\n if (!weights) {\n weights = ':wght@400'\n }\n\n if (!this.injectedFonts[fontFamily]) {\n this.injectedFonts[fontFamily] = true\n let url = 'https://fonts.googleapis.com/css2?family=' + fontFamily + weights\n let link = document.createElement(\"link\");\n link.href = url;\n link.rel = \"stylesheet\";\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n }\n }\n\n injectFontPreview(fontFamily, weights) {\n\n if (!weights) {\n weights = ':wght@400'\n }\n\n if (!this.previewedFonts[fontFamily]) {\n this.previewedFonts[fontFamily] = true\n let url = 'https://fonts.googleapis.com/css2?family=' + fontFamily + weights\n let link = document.createElement(\"link\");\n link.href = url;\n link.rel = \"stylesheet\";\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n }\n }\n\n injectFontAndWeights(font) {\n // font is already loaded!\n if(this.injectedFonts[font.family]) {\n return\n }\n\n let weights = this.availableWeights(webase.model.fonts, font.family).join(';')\n weights = weights.replace('regular', '400')\n this.injectFont(font.family, ':wght@' + weights)\n }\n\n getClass(field) {\n if (field.field_type === 'Number') {\n return 'fa-hashtag'\n }\n\n if (field.field_type === 'Text') {\n return 'fa-file-alt'\n }\n\n if (field.field_type === 'Attachment') {\n return 'fa-paperclip'\n }\n\n if (field.field_type === 'URL') {\n return 'fa-link'\n }\n\n if (field.field_type === 'Single Select') {\n return 'fa-list'\n }\n\n if (field.field_type === 'Link to Object') {\n return 'fa-network-wired'\n }\n\n if (field.field_type === 'Date') {\n return 'fa-calendar'\n }\n\n if (field.field_type === 'Boolean') {\n return 'fa-toggle-on'\n }\n\n if (field.field_type === 'Collaborator') {\n return 'fa-user'\n }\n\n if (field.field_type === 'Image') {\n return 'fa-image'\n }\n\n // '', 'String', 'Text', 'Number', 'Boolean', 'Date', 'Single Select', 'Link to Object', 'Collaborator',\n // 'URL', 'Attachment', 'Dynamic'\n\n return 'fa-font'\n }\n\n getComponentClass(componentType) {\n if (componentType === 'Header') {\n return 'fal fa-heading'\n } else if (componentType === 'Icon') {\n return 'fad fa-icons'\n } else if (componentType === 'Link') {\n return 'fad fa-link'\n } else if (componentType === 'Button') {\n return 'fad fa-rectangle-landscape'\n } else if (componentType === 'Image') {\n return 'fad fa-image'\n } else if (componentType.indexOf('Container') > -1) {\n return 'fad fa-square'\n }\n\n return 'fa fa-font'\n }\n\n getJustifyClassRow(justifyValue) {\n if (justifyValue === 'left') {\n return 'justify-content-start'\n } else if (justifyValue === 'center') {\n return 'justify-content-center'\n } else if (justifyValue === 'right') {\n return 'justify-content-end'\n } else {\n return 'justify-content-between'\n }\n }\n\n getAlignClassRow(alignValue) {\n if (alignValue === 'top') {\n return 'align-items-start'\n } else if (alignValue === 'middle') {\n return 'align-items-center'\n } else {\n return 'align-items-end'\n }\n }\n\n getJustifyClassColumn(justifyValue) {\n if (justifyValue === 'left') {\n return this.getAlignClassRow('top')\n } else if (justifyValue === 'center') {\n return this.getAlignClassRow('middle')\n } else if (justifyValue === 'right') {\n return this.getAlignClassRow('bottom')\n } else {\n return ''\n }\n }\n\n getAlignClassColumn(alignValue) {\n if (alignValue === 'top') {\n return this.getJustifyClassRow('left')\n } else if (alignValue === 'middle') {\n return this.getJustifyClassRow('center')\n } else {\n return this.getJustifyClassRow('right')\n }\n }\n\n getIconTypeClass(iconType) {\n if (iconType === 'regular') {\n return 'far'\n } else if (iconType === 'brands') {\n return 'fab'\n } else {\n return 'fas'\n }\n }\n\n getMarginClass(margin) {\n if (margin.side === 'none') {\n return ''\n }\n\n return this.getSpacingPrefix(margin, 'm') + '-' + margin.value\n }\n\n getPaddingClass(padding) {\n if (padding.side === 'none') {\n return ''\n }\n\n return this.getSpacingPrefix(padding, 'p') + '-' + padding.value\n }\n\n getSpacingPrefix(margin, prefix) {\n if (margin.side === 'all') {\n return prefix\n } else if (margin.side === 'top/bottom') {\n return prefix + 'y'\n } else if (margin.side === 'left/right') {\n return prefix + 'x'\n } else if (margin.side === 'top') {\n return prefix + 't'\n } else if (margin.side === 'left') {\n return prefix + 's'\n } else if (margin.side === 'bottom') {\n return prefix + 'b'\n } else if (margin.side === 'right') {\n return prefix + 'e'\n } else {\n return ''\n }\n }\n\n isCustomColor(component) {\n return component.style && component.style.color && component.style.color.indexOf('#') === 0\n }\n\n isCustomBackgroundColor(component) {\n return component.style && component.style.backgroundColor && component.style.backgroundColor.indexOf('#') === 0\n }\n\n getOppositeColor(color) {\n return this.isLightOrDark(color) === 'light' ? 'dark' : 'light'\n }\n\n isLightOrDark(color) {\n // Variables for red, green, blue values\n var r, g, b, hsp;\n\n // Check the format of the color, HEX or RGB?\n if (color.match(/^rgb/)) {\n\n // If HEX --> store the red, green, blue values in separate variables\n color = color.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/);\n\n r = color[1];\n g = color[2];\n b = color[3];\n } else {\n\n // If RGB --> Convert it to HEX: http://gist.github.com/983661\n color = +(\"0x\" + color.slice(1).replace(\n color.length < 5 && /./g, '$&$&'));\n\n r = color >> 16;\n g = color >> 8 & 255;\n b = color & 255;\n }\n\n // HSP (Highly Sensitive Poo) equation from http://alienryderflex.com/hsp.html\n hsp = Math.sqrt(\n 0.299 * (r * r) +\n 0.587 * (g * g) +\n 0.114 * (b * b)\n );\n\n return hsp > 127.5 ? 'light' : 'dark'\n }\n\n copyKeysPressed(event) {\n return this.checkKeyPress(event, 'KeyC', 'c', 67)\n }\n\n pasteKeysPressed(event) {\n return this.checkKeyPress(event, 'KeyV', 'v', 86)\n }\n\n checkKeyPress(event, code, key, keyCode) {\n if (event.code !== undefined && event.code === code && (event.metaKey || event.ctrlKey)) {\n return true\n } else if (event.key !== undefined && event.key === key && (event.metaKey || event.ctrlKey)) {\n return true\n } else if (event.keyCode !== undefined && event.keyCode === keyCode && (event.metaKey || event.ctrlKey)) {\n return true\n }\n\n return false\n }\n}","import RestService from './RestService'\nimport http from \"superagent\";\n\nexport default class AppService extends RestService {\n constructor() {\n super('apps')\n }\n\n listWebsites() {\n let url = this.baseUrl + '/api/v1/sites.json?t=' + Date.now()\n return this.executeGet(url)\n }\n\n addBlog(appId) {\n let url = this.baseUrl + `/api/v1/add-blog/${appId}.json?t=${Date.now()}`\n return this.executeGet(url)\n }\n\n addEmailList(appId) {\n let url = this.baseUrl + `/api/v1/email-list/${appId}.json?t=${Date.now()}`\n return this.executeGet(url)\n }\n\n // GET 'apps/:id/copy-template/:template_id'\n copyModels(appId, appTemplateId) {\n let url = this.baseUrl + '/api/v1/apps/' + appId + '/copy-template/' + appTemplateId + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n this.http.get(url)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n initApp(appId) {\n console.log('***** calling init app ***** ... app id: ' + appId)\n let url = this.baseUrl + '/api/v1/apps/' + appId + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n http.get(url)\n .set('x-api-token', this.authToken)\n .end((error, response) => {\n\n if (response.status === 200) {\n const app = JSON.parse(response.text)\n webase.utils.app.initAppProperties(app)\n resolve(app)\n } else {\n console.log('Get Error')\n console.log(error)\n reject(response.statusText)\n }\n })\n });\n }\n\n inviteUserToCollaborate(email, appId, site) {\n let url = this.baseUrl + '/api/v1/' + this.modelPath + '/' + appId + '/create-invite'\n return new Promise((resolve, reject) => {\n let data = {invite: {email: email, app_id: appId, site: site}}\n this.http.post(url)\n .send(data)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n}","import ArrayUtil from \"../utils/ArrayUtil\";\nimport TableUtil from \"../utils/TableUtil\";\n\n\nexport default class AppManager {\n constructor(app) {\n this.app = app\n this.arrayUtil = new ArrayUtil()\n }\n\n getTable(tableId) {\n return this.arrayUtil.get(this.app.tables, tableId)\n }\n\n getNameOrTitleField(tableId) {\n let table = this.getTable(tableId)\n\n if(table) {\n for( let j = 0; j < table.fields.length; j++ ) {\n let field = table.fields[j]\n\n if(field.name.toLowerCase().indexOf('name') > -1 || field.name.toLowerCase().indexOf('title') > -1) {\n return field\n }\n }\n }\n\n return null\n }\n\n getFieldByType(tableId, fieldType) {\n let table = this.getTable(tableId)\n\n if(table) {\n for( let j = 0; j < table.fields.length; j++ ) {\n let field = table.fields[j]\n\n if(field.field_type === fieldType) {\n return field\n }\n }\n }\n\n return null\n }\n\n getField(fieldId) {\n\n for( let i = 0; i < this.app.tables.length; i++ ) {\n let table = this.app.tables[i]\n\n for( let j = 0; j < table.fields.length; j++ ) {\n let field = table.fields[j]\n\n if(field.index === fieldId) {\n return field\n }\n }\n }\n\n return null\n }\n\n getIntegrationOptions() {\n let options = []\n\n for( let i = 0; i < this.app.integrations.length; i++ ) {\n let integration = this.app.integrations[i]\n\n if( integration.name === 'Slack' ) {\n\n let slackOption = {\n name: integration.name,\n notifiable_id: integration.id,\n notifiable_type: 'Integration'\n }\n\n options.push(slackOption)\n }\n }\n\n return options\n }\n\n getView(viewId) {\n\n for( let i = 0; i < this.app.tables.length; i++ ) {\n let table = this.app.tables[i]\n\n for( let j = 0; j < table.views.length; j++ ) {\n let view = table.views[j]\n\n if(view.id === viewId) {\n return view\n }\n }\n }\n\n return null\n }\n\n getViewByName(viewName) {\n for( let i = 0; i < this.app.tables.length; i++ ) {\n let table = this.app.tables[i]\n\n for( let j = 0; j < table.views.length; j++ ) {\n let view = table.views[j]\n\n if(view.name === viewName) {\n return view\n }\n }\n }\n\n return null\n }\n\n getCollaboratorField() {\n let tableUtil = new TableUtil()\n\n for( let i = 0; i < this.app.tables.length; i++ ) {\n let table = this.app.tables[i]\n let collaboratorField = tableUtil.getCollaboratorField(table)\n\n if(collaboratorField) {\n return collaboratorField\n }\n }\n\n return null\n }\n\n getViews() {\n let views = []\n\n for( let i = 0; i < this.app.tables.length; i++ ) {\n views = views.concat( this.app.tables[i].views );\n }\n\n return views\n }\n\n hasCustomView() {\n let views = this.getViews()\n let customViews = views.filter(view => (view.view_type === 'custom'))\n return customViews.length > 0\n }\n\n hasIntegration(name) {\n if(this.app.integrations && this.app.integrations.length > 0) {\n return this.app.integrations.filter(integration => (integration.name === name)).length > 0\n }\n\n return false\n }\n\n getIntegration(name) {\n let integrations = this.app.integrations.filter(integration => (integration.name === name))\n return integrations[0]\n }\n\n currentCollaborator() {\n return webase.utils.array.get(webase.model.app.collaborators, webase.model.currentUser.id, 'user_id')\n }\n}","export default class PermissionManager {\n constructor(app) {\n this.app = app\n this.collaborator = this.currentCollaborator()\n }\n\n fullAccess() {\n return this.isAuthorizedToEditAllData()\n }\n\n isAuthorized(table, document, parentTable, parentDocument) {\n if(this.authorized(table, document)) {\n return true\n }\n\n if(parentTable && parentDocument && this.authorized(parentTable, parentDocument)) {\n return true\n }\n\n return false\n }\n\n authorized(table, document) {\n if(this.fullAccess()) {\n return true\n }\n\n let userField = webase.utils.table.getCollaboratorField(table)\n\n if(userField) {\n let userValue = document[userField.index]\n\n if(userValue) {\n return userValue.user_id === webase.model.currentUser.id\n }\n }\n\n if(document['created_by']) {\n let createdBy = document['created_by']\n\n if(createdBy) {\n return createdBy.id === webase.model.currentUser.id\n }\n }\n\n return false\n }\n\n isAuthorizedToEditApp() {\n return this.collaborator.app_permission_id === null || this.collaborator.app_permission_id === 1\n }\n\n isAuthorizedToEditAllData() {\n return this.collaborator.data_permission_id === 3\n }\n\n isReadOnly() {\n return this.collaborator.data_permission_id === 5\n }\n\n appPermission() {\n return this.collaborator.app_permission_id\n }\n\n dataPermission() {\n return this.collaborator.data_permission_id\n }\n\n appPermissions() {\n return webase.model.permissions.filter(permission => permission.resource === 'app')\n }\n\n dataPermissions() {\n return webase.model.permissions.filter(permission => permission.resource === 'data')\n }\n\n currentCollaborator() {\n for (let i = 0; i < this.app.collaborators.length; i++) {\n let collaborator = this.app.collaborators[i]\n\n if (collaborator.user_id === webase.model.currentUser.id) {\n return collaborator\n }\n }\n\n return null\n }\n\n currentUserRole() {\n let collaborator = this.currentCollaborator()\n return collaborator !== null ? collaborator.role : null\n }\n\n isOwnerOrAdmin() {\n let collaboratorRole = this.currentUserRole()\n return collaboratorRole === 'owner' || collaboratorRole === 'admin'\n }\n}","import RestService from './RestService'\n\nexport default class SiteService extends RestService {\n constructor() {\n super('websites')\n }\n\n checkDns(websiteId) {\n let url = this.baseUrl + '/api/v1/check-dns/' + websiteId + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n this.http.get(url)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n // GET /api/v1/websites/:id/copy-template-pages/:template_id\n copyPages(websiteId, websiteTemplateId) {\n let url = this.baseUrl + '/api/v1/websites/' + websiteId + '/copy-template-pages/' + websiteTemplateId + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n this.http.get(url)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n\n deploySite(websiteId) {\n let url = this.baseUrl + '/api/v1/deploy-site/' + websiteId + '.json?t=' + Date.now()\n return new Promise((resolve, reject) => {\n this.http.get(url)\n .set('x-api-token', this.authToken)\n .set('Accept', 'application/json')\n .end((error, response) => {\n if (response.status === 200 || response.status === 201) {\n resolve(JSON.parse(response.text))\n } else {\n reject(response.statusText)\n }\n })\n })\n }\n}","import AppService from \"../services/AppService\";\nimport AppManager from \"../managers/AppManager\";\nimport PermissionManager from \"../managers/PermissionManager\";\nimport SiteService from \"../services/SiteService\";\nimport UserService from \"../services/UserService\";\n\nexport default class AppUtil {\n\n initViewLayout(view) {\n if(view.layout === undefined) {\n view.layout = {}\n }\n\n if(view.layout.description === undefined) {\n view.layout.description = ''\n }\n\n if (view.view_type === 'gallery' && !view.layout.gallery) {\n view.layout.gallery = {\n mobile: {\n columnCount: 2\n },\n desktop: {\n columnCount: 3\n }\n }\n }\n }\n\n loadApp(appId) {\n let service = new AppService()\n\n service.initApp(appId).then((app) => {\n // this.initAppProperties(response)\n // let temp = new PermissionManager(app)\n // app.user_app_uuid = temp.appPermission()\n // app.user_data_uuid = temp.dataPermission()\n // webase.model.currentCollaboratorId = temp.currentCollaborator().id\n // webase.model.app = app\n // webase.managers.app = new AppManager(webase.model.app)\n // webase.managers.permission = new PermissionManager(webase.model.app)\n\n // console.log('***** app loaded *****')\n\n }).catch((message) => {\n console.log('error loading app')\n console.log(message)\n })\n }\n\n initAppProperties(app) {\n console.log('***** app loaded, initializing properties *****')\n let temp = new PermissionManager(app)\n app.user_app_uuid = temp.appPermission()\n app.user_data_uuid = temp.dataPermission()\n webase.model.currentCollaboratorId = temp.currentCollaborator().id\n webase.model.app = app\n webase.managers.app = new AppManager(webase.model.app)\n webase.managers.permission = new PermissionManager(webase.model.app)\n console.log(webase.model.currentCollaboratorId)\n console.log(webase.model.app.id)\n\n if(app.website_id) {\n let siteService = new SiteService()\n\n siteService.get(app.website_id).then((website) => {\n webase.model.website = website\n })\n }\n\n if (webase.managers.permission.isOwnerOrAdmin()) {\n let service = new UserService()\n service.permissions(app.id)\n }\n }\n\n getBasePageUrl() {\n if (process.env.NODE_ENV === 'development' || window.location.href.indexOf('localhost') > -1) {\n return 'http://localhost:3000/'\n }\n\n if (window.location.hostname.indexOf('webase.com') > -1) {\n return 'https://www.webase.com/' // make URLs relative\n }\n\n // if on a custom domain it can load from root\n return '/'\n }\n\n getBaseUrl() {\n if (process.env.NODE_ENV === 'development' || window.location.href.indexOf('localhost') > -1) {\n return 'http://localhost:3000'\n }\n\n if (window.location.hostname.indexOf('webase.com') > -1) {\n return '' // make URLs relative\n }\n\n return 'https://api.webase.com'\n }\n\n getHostUrl() {\n if (process.env.NODE_ENV === 'development' || window.location.href.indexOf('localhost') > -1) {\n return 'http://localhost:3000'\n }\n\n if (window.location.hostname.indexOf('webase.com') > -1) {\n return 'https://www.webase.com'\n }\n\n return 'https://api.webase.com'\n }\n\n getStripeKey() {\n if (process.env.NODE_ENV === \"development\") {\n return \"pk_test_10MeTwHoWAYNa4KLJgrnK5cV00lSQrRJWz\";\n }\n\n return \"pk_live_ktkM6jzzhuJSsUvxxR5gyX1T00HAq7YJwu\";\n }\n\n waitUntil(checkFn, checkDelay, timeout) {\n const startTime = Date.now()\n\n function check(resolve, reject) {\n if (checkFn()) {\n resolve()\n } else if (Date.now() - startTime > timeout) {\n reject()\n } else {\n setTimeout(() => check(resolve, reject), checkDelay)\n }\n }\n\n return new Promise((resolve, reject) => {\n check(resolve, reject)\n })\n }\n\n}"],"names":["module","Emitter","obj","mixin","key","event","fn","on","callbacks","cb","i","args","len","fastSafeStringify","stringify","deterministicStringify","arr","replacerStack","replacer","spacer","decirc","res","replaceGetterValues","part","val","k","stack","parent","propertyDescriptor","keys","compareFunction","a","b","tmp","deterministicDecirc","v","_typeof","isObject","isObject_1","require$$0","requestBase","RequestBase","options","option","count","ERROR_CODES","err","override","err_","resolve","reject","_this","self","field","name","user","pass","base64Encoder","n","data","isObj","type","sort","query","index","queryArr","reason","timeout","errno","utils","str","parts","url","rel","header","changesOrigin","responseBase","ResponseBase","ct","params","status","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","iter","arr2","Agent","_len","_key","req","def","agentBase","root","safeStringify","require$$1","require$$2","require$$3","require$$4","require$$5","noop","method","exports","request","Request","trim","s","serialize","pairs","pushEncodedKeyValuePair","subkey","parseString","pair","pos","parseHeader","lines","fields","line","isJSON","mime","Response","parse","msg","new_err","encoder","string","file","xhr","readyState","handleProgress","direction","e","contentType","_serialize","del","UserUtil","RestService","modelPath","http","id","error","response","model","formData","modelName","fieldNames","fieldName","UserService","site","email","password","authToken","appId","permissions","service","ArrayUtil","list","objectId","idProperty","object","item","index1","index2","temp","stringFragment","listItem","list2","itemCountInRow","gridData","currentRow","FieldUtil","TableUtil","table","document","textField","linkedObjectField","relatedTable","relatedObject","documentIds","relatedDocumentId","collaboratorField","view","groupFields","numericFields","parentTable","parentNumericFields","childTable","childNumericFields","fieldType","relatedModelId","value","fieldOptions","fieldOption","viewType","attachment","UIUtil","theme_path","link","newElement","styleElements","styleElement","themeId","element","fontList","fontFamily","font","variant","weights","componentType","justifyValue","alignValue","iconType","margin","padding","prefix","component","color","r","g","hsp","code","keyCode","AppService","appTemplateId","app","AppManager","tableId","j","fieldId","integration","slackOption","viewId","viewName","tableUtil","views","PermissionManager","parentDocument","userField","userValue","createdBy","permission","collaborator","collaboratorRole","SiteService","websiteId","websiteTemplateId","AppUtil","message","website","checkFn","checkDelay","startTime","check"],"mappings":"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"}