superagent
Version:
elegant & feature rich browser / node HTTP with a fluent API
1,020 lines (833 loc) • 84.6 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; 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); }
/**
* Root reference for iframes.
*/
var root;
if (typeof window !== 'undefined') {
// Browser window
root = window;
} else if (typeof self === 'undefined') {
// Other environments
console.warn('Using browser-only version of superagent in non-browser environment');
root = void 0;
} else {
// Web Worker
root = self;
}
var Emitter = require('component-emitter');
var safeStringify = require('fast-safe-stringify');
var RequestBase = require('./request-base');
var isObject = require('./is-object');
var ResponseBase = require('./response-base');
var Agent = require('./agent-base');
/**
* Noop.
*/
function noop() {}
/**
* Expose `request`.
*/
module.exports = function (method, url) {
// callback
if (typeof url === 'function') {
return new exports.Request('GET', method).end(url);
} // url first
if (arguments.length === 1) {
return new exports.Request('GET', method);
}
return new exports.Request(method, url);
};
exports = module.exports;
var request = exports;
exports.Request = Request;
/**
* Determine XHR.
*/
request.getXHR = function () {
if (root.XMLHttpRequest && (!root.location || root.location.protocol !== 'file:' || !root.ActiveXObject)) {
return new XMLHttpRequest();
}
try {
return new ActiveXObject('Microsoft.XMLHTTP');
} catch (_unused) {}
try {
return new ActiveXObject('Msxml2.XMLHTTP.6.0');
} catch (_unused2) {}
try {
return new ActiveXObject('Msxml2.XMLHTTP.3.0');
} catch (_unused3) {}
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (_unused4) {}
throw new Error('Browser-only version of superagent could not find XHR');
};
/**
* Removes leading and trailing whitespace, added to support IE.
*
* @param {String} s
* @return {String}
* @api private
*/
var trim = ''.trim ? function (s) {
return s.trim();
} : function (s) {
return s.replace(/(^\s*|\s*$)/g, '');
};
/**
* Serialize the given `obj`.
*
* @param {Object} obj
* @return {String}
* @api private
*/
function serialize(obj) {
if (!isObject(obj)) return obj;
var pairs = [];
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) pushEncodedKeyValuePair(pairs, key, obj[key]);
}
return pairs.join('&');
}
/**
* Helps 'serialize' with serializing arrays.
* Mutates the pairs array.
*
* @param {Array} pairs
* @param {String} key
* @param {Mixed} val
*/
function pushEncodedKeyValuePair(pairs, key, val) {
if (val === undefined) return;
if (val === null) {
pairs.push(encodeURI(key));
return;
}
if (Array.isArray(val)) {
val.forEach(function (v) {
pushEncodedKeyValuePair(pairs, key, v);
});
} else if (isObject(val)) {
for (var subkey in val) {
if (Object.prototype.hasOwnProperty.call(val, subkey)) pushEncodedKeyValuePair(pairs, "".concat(key, "[").concat(subkey, "]"), val[subkey]);
}
} else {
pairs.push(encodeURI(key) + '=' + encodeURIComponent(val));
}
}
/**
* Expose serialization method.
*/
request.serializeObject = serialize;
/**
* Parse the given x-www-form-urlencoded `str`.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseString(str) {
var obj = {};
var pairs = str.split('&');
var pair;
var pos;
for (var i = 0, len = pairs.length; i < len; ++i) {
pair = pairs[i];
pos = pair.indexOf('=');
if (pos === -1) {
obj[decodeURIComponent(pair)] = '';
} else {
obj[decodeURIComponent(pair.slice(0, pos))] = decodeURIComponent(pair.slice(pos + 1));
}
}
return obj;
}
/**
* Expose parser.
*/
request.parseString = parseString;
/**
* Default MIME type map.
*
* superagent.types.xml = 'application/xml';
*
*/
request.types = {
html: 'text/html',
json: 'application/json',
xml: 'text/xml',
urlencoded: 'application/x-www-form-urlencoded',
form: 'application/x-www-form-urlencoded',
'form-data': 'application/x-www-form-urlencoded'
};
/**
* Default serialization map.
*
* superagent.serialize['application/xml'] = function(obj){
* return 'generated xml here';
* };
*
*/
request.serialize = {
'application/x-www-form-urlencoded': serialize,
'application/json': safeStringify
};
/**
* Default parsers.
*
* superagent.parse['application/xml'] = function(str){
* return { object parsed from str };
* };
*
*/
request.parse = {
'application/x-www-form-urlencoded': parseString,
'application/json': JSON.parse
};
/**
* Parse the given header `str` into
* an object containing the mapped fields.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseHeader(str) {
var lines = str.split(/\r?\n/);
var fields = {};
var index;
var line;
var field;
var val;
for (var i = 0, len = lines.length; i < len; ++i) {
line = lines[i];
index = line.indexOf(':');
if (index === -1) {
// could be empty line, just skip it
continue;
}
field = line.slice(0, index).toLowerCase();
val = trim(line.slice(index + 1));
fields[field] = val;
}
return fields;
}
/**
* Check if `mime` is json or has +json structured syntax suffix.
*
* @param {String} mime
* @return {Boolean}
* @api private
*/
function isJSON(mime) {
// should match /json or +json
// but not /json-seq
return /[/+]json($|[^-\w])/i.test(mime);
}
/**
* Initialize a new `Response` with the given `xhr`.
*
* - set flags (.ok, .error, etc)
* - parse header
*
* Examples:
*
* Aliasing `superagent` as `request` is nice:
*
* request = superagent;
*
* We can use the promise-like API, or pass callbacks:
*
* request.get('/').end(function(res){});
* request.get('/', function(res){});
*
* Sending data can be chained:
*
* request
* .post('/user')
* .send({ name: 'tj' })
* .end(function(res){});
*
* Or passed to `.send()`:
*
* request
* .post('/user')
* .send({ name: 'tj' }, function(res){});
*
* Or passed to `.post()`:
*
* request
* .post('/user', { name: 'tj' })
* .end(function(res){});
*
* Or further reduced to a single call for simple cases:
*
* request
* .post('/user', { name: 'tj' }, function(res){});
*
* @param {XMLHTTPRequest} xhr
* @param {Object} options
* @api private
*/
function Response(req) {
this.req = req;
this.xhr = this.req.xhr; // responseText is accessible only if responseType is '' or 'text' and on older browsers
this.text = this.req.method !== 'HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text') || typeof this.xhr.responseType === 'undefined' ? this.xhr.responseText : null;
this.statusText = this.req.xhr.statusText;
var status = this.xhr.status; // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
if (status === 1223) {
status = 204;
}
this._setStatusProperties(status);
this.headers = parseHeader(this.xhr.getAllResponseHeaders());
this.header = this.headers; // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
// getResponseHeader still works. so we get content-type even if getting
// other headers fails.
this.header['content-type'] = this.xhr.getResponseHeader('content-type');
this._setHeaderProperties(this.header);
if (this.text === null && req._responseType) {
this.body = this.xhr.response;
} else {
this.body = this.req.method === 'HEAD' ? null : this._parseBody(this.text ? this.text : this.xhr.response);
}
} // eslint-disable-next-line new-cap
ResponseBase(Response.prototype);
/**
* Parse the given body `str`.
*
* Used for auto-parsing of bodies. Parsers
* are defined on the `superagent.parse` object.
*
* @param {String} str
* @return {Mixed}
* @api private
*/
Response.prototype._parseBody = function (str) {
var parse = request.parse[this.type];
if (this.req._parser) {
return this.req._parser(this, str);
}
if (!parse && isJSON(this.type)) {
parse = request.parse['application/json'];
}
return parse && str && (str.length > 0 || str instanceof Object) ? parse(str) : null;
};
/**
* Return an `Error` representative of this response.
*
* @return {Error}
* @api public
*/
Response.prototype.toError = function () {
var req = this.req;
var method = req.method;
var url = req.url;
var msg = "cannot ".concat(method, " ").concat(url, " (").concat(this.status, ")");
var err = new Error(msg);
err.status = this.status;
err.method = method;
err.url = url;
return err;
};
/**
* Expose `Response`.
*/
request.Response = Response;
/**
* Initialize a new `Request` with the given `method` and `url`.
*
* @param {String} method
* @param {String} url
* @api public
*/
function Request(method, url) {
var self = this;
this._query = this._query || [];
this.method = method;
this.url = url;
this.header = {}; // preserves header name case
this._header = {}; // coerces header names to lowercase
this.on('end', function () {
var err = null;
var res = null;
try {
res = new Response(self);
} catch (err_) {
err = new Error('Parser is unable to parse the response');
err.parse = true;
err.original = err_; // issue #675: return the raw response if the response parsing fails
if (self.xhr) {
// ie9 doesn't have 'response' property
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
err.status = self.xhr.status ? self.xhr.status : null;
err.statusCode = err.status; // backwards-compat only
} else {
err.rawResponse = null;
err.status = null;
}
return self.callback(err);
}
self.emit('response', res);
var new_err;
try {
if (!self._isResponseOK(res)) {
new_err = new Error(res.statusText || res.text || 'Unsuccessful HTTP response');
}
} catch (err_) {
new_err = err_; // ok() callback can throw
} // #1000 don't catch errors from the callback to avoid double calling it
if (new_err) {
new_err.original = err;
new_err.response = res;
new_err.status = res.status;
self.callback(new_err, res);
} else {
self.callback(null, res);
}
});
}
/**
* Mixin `Emitter` and `RequestBase`.
*/
// eslint-disable-next-line new-cap
Emitter(Request.prototype); // eslint-disable-next-line new-cap
RequestBase(Request.prototype);
/**
* Set Content-Type to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.xml = 'application/xml';
*
* request.post('/')
* .type('xml')
* .send(xmlstring)
* .end(callback);
*
* request.post('/')
* .type('application/xml')
* .send(xmlstring)
* .end(callback);
*
* @param {String} type
* @return {Request} for chaining
* @api public
*/
Request.prototype.type = function (type) {
this.set('Content-Type', request.types[type] || type);
return this;
};
/**
* Set Accept to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.json = 'application/json';
*
* request.get('/agent')
* .accept('json')
* .end(callback);
*
* request.get('/agent')
* .accept('application/json')
* .end(callback);
*
* @param {String} accept
* @return {Request} for chaining
* @api public
*/
Request.prototype.accept = function (type) {
this.set('Accept', request.types[type] || type);
return this;
};
/**
* Set Authorization field value with `user` and `pass`.
*
* @param {String} user
* @param {String} [pass] optional in case of using 'bearer' as type
* @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')
* @return {Request} for chaining
* @api public
*/
Request.prototype.auth = function (user, pass, options) {
if (arguments.length === 1) pass = '';
if (_typeof(pass) === 'object' && pass !== null) {
// pass is optional and can be replaced with options
options = pass;
pass = '';
}
if (!options) {
options = {
type: typeof btoa === 'function' ? 'basic' : 'auto'
};
}
var encoder = function encoder(string) {
if (typeof btoa === 'function') {
return btoa(string);
}
throw new Error('Cannot use basic auth, btoa is not a function');
};
return this._auth(user, pass, options, encoder);
};
/**
* Add query-string `val`.
*
* Examples:
*
* request.get('/shoes')
* .query('size=10')
* .query({ color: 'blue' })
*
* @param {Object|String} val
* @return {Request} for chaining
* @api public
*/
Request.prototype.query = function (val) {
if (typeof val !== 'string') val = serialize(val);
if (val) this._query.push(val);
return this;
};
/**
* Queue the given `file` as an attachment to the specified `field`,
* with optional `options` (or filename).
*
* ``` js
* request.post('/upload')
* .attach('content', new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"}))
* .end(callback);
* ```
*
* @param {String} field
* @param {Blob|File} file
* @param {String|Object} options
* @return {Request} for chaining
* @api public
*/
Request.prototype.attach = function (field, file, options) {
if (file) {
if (this._data) {
throw new Error("superagent can't mix .send() and .attach()");
}
this._getFormData().append(field, file, options || file.name);
}
return this;
};
Request.prototype._getFormData = function () {
if (!this._formData) {
this._formData = new root.FormData();
}
return this._formData;
};
/**
* Invoke the callback with `err` and `res`
* and handle arity check.
*
* @param {Error} err
* @param {Response} res
* @api private
*/
Request.prototype.callback = function (err, res) {
if (this._shouldRetry(err, res)) {
return this._retry();
}
var fn = this._callback;
this.clearTimeout();
if (err) {
if (this._maxRetries) err.retries = this._retries - 1;
this.emit('error', err);
}
fn(err, res);
};
/**
* Invoke callback with x-domain error.
*
* @api private
*/
Request.prototype.crossDomainError = function () {
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.');
err.crossDomain = true;
err.status = this.status;
err.method = this.method;
err.url = this.url;
this.callback(err);
}; // This only warns, because the request is still likely to work
Request.prototype.agent = function () {
console.warn('This is not supported in browser version of superagent');
return this;
};
Request.prototype.ca = Request.prototype.agent;
Request.prototype.buffer = Request.prototype.ca; // This throws, because it can't send/receive data as expected
Request.prototype.write = function () {
throw new Error('Streaming is not supported in browser version of superagent');
};
Request.prototype.pipe = Request.prototype.write;
/**
* Check if `obj` is a host object,
* we don't want to serialize these :)
*
* @param {Object} obj host object
* @return {Boolean} is a host object
* @api private
*/
Request.prototype._isHost = function (obj) {
// Native objects stringify to [object File], [object Blob], [object FormData], etc.
return obj && _typeof(obj) === 'object' && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';
};
/**
* Initiate request, invoking callback `fn(res)`
* with an instanceof `Response`.
*
* @param {Function} fn
* @return {Request} for chaining
* @api public
*/
Request.prototype.end = function (fn) {
if (this._endCalled) {
console.warn('Warning: .end() was called twice. This is not supported in superagent');
}
this._endCalled = true; // store callback
this._callback = fn || noop; // querystring
this._finalizeQueryString();
this._end();
};
Request.prototype._setUploadTimeout = function () {
var self = this; // upload timeout it's wokrs only if deadline timeout is off
if (this._uploadTimeout && !this._uploadTimeoutTimer) {
this._uploadTimeoutTimer = setTimeout(function () {
self._timeoutError('Upload timeout of ', self._uploadTimeout, 'ETIMEDOUT');
}, this._uploadTimeout);
}
}; // eslint-disable-next-line complexity
Request.prototype._end = function () {
if (this._aborted) return this.callback(new Error('The request has been aborted even before .end() was called'));
var self = this;
this.xhr = request.getXHR();
var xhr = this.xhr;
var data = this._formData || this._data;
this._setTimeouts(); // state change
xhr.onreadystatechange = function () {
var readyState = xhr.readyState;
if (readyState >= 2 && self._responseTimeoutTimer) {
clearTimeout(self._responseTimeoutTimer);
}
if (readyState !== 4) {
return;
} // In IE9, reads to any property (e.g. status) off of an aborted XHR will
// result in the error "Could not complete the operation due to error c00c023f"
var status;
try {
status = xhr.status;
} catch (_unused5) {
status = 0;
}
if (!status) {
if (self.timedout || self._aborted) return;
return self.crossDomainError();
}
self.emit('end');
}; // progress
var handleProgress = function handleProgress(direction, e) {
if (e.total > 0) {
e.percent = e.loaded / e.total * 100;
if (e.percent === 100) {
clearTimeout(self._uploadTimeoutTimer);
}
}
e.direction = direction;
self.emit('progress', e);
};
if (this.hasListeners('progress')) {
try {
xhr.addEventListener('progress', handleProgress.bind(null, 'download'));
if (xhr.upload) {
xhr.upload.addEventListener('progress', handleProgress.bind(null, 'upload'));
}
} catch (_unused6) {// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
// Reported here:
// https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
}
}
if (xhr.upload) {
this._setUploadTimeout();
} // initiate request
try {
if (this.username && this.password) {
xhr.open(this.method, this.url, true, this.username, this.password);
} else {
xhr.open(this.method, this.url, true);
}
} catch (err) {
// see #1149
return this.callback(err);
} // CORS
if (this._withCredentials) xhr.withCredentials = true; // body
if (!this._formData && this.method !== 'GET' && this.method !== 'HEAD' && typeof data !== 'string' && !this._isHost(data)) {
// serialize stuff
var contentType = this._header['content-type'];
var _serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];
if (!_serialize && isJSON(contentType)) {
_serialize = request.serialize['application/json'];
}
if (_serialize) data = _serialize(data);
} // set header fields
for (var field in this.header) {
if (this.header[field] === null) continue;
if (Object.prototype.hasOwnProperty.call(this.header, field)) xhr.setRequestHeader(field, this.header[field]);
}
if (this._responseType) {
xhr.responseType = this._responseType;
} // send stuff
this.emit('request', this); // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
// We need null here if data is undefined
xhr.send(typeof data === 'undefined' ? null : data);
};
request.agent = function () {
return new Agent();
};
['GET', 'POST', 'OPTIONS', 'PATCH', 'PUT', 'DELETE'].forEach(function (method) {
Agent.prototype[method.toLowerCase()] = function (url, fn) {
var req = new request.Request(method, url);
this._setDefaults(req);
if (fn) {
req.end(fn);
}
return req;
};
});
Agent.prototype.del = Agent.prototype.delete;
/**
* GET `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.get = function (url, data, fn) {
var req = request('GET', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.query(data);
if (fn) req.end(fn);
return req;
};
/**
* HEAD `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.head = function (url, data, fn) {
var req = request('HEAD', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.query(data);
if (fn) req.end(fn);
return req;
};
/**
* OPTIONS query to `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.options = function (url, data, fn) {
var req = request('OPTIONS', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* DELETE `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
function del(url, data, fn) {
var req = request('DELETE', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.send(data);
if (fn) req.end(fn);
return req;
}
request.del = del;
request.delete = del;
/**
* PATCH `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.patch = function (url, data, fn) {
var req = request('PATCH', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* POST `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} [data]
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.post = function (url, data, fn) {
var req = request('POST', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* PUT `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} [data] or fn
* @param {Function} [fn]
* @return {Request}
* @api public
*/
request.put = function (url, data, fn) {
var req = request('PUT', url);
if (typeof data === 'function') {
fn = data;
data = null;
}
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQuanMiXSwibmFtZXMiOlsicm9vdCIsIndpbmRvdyIsInNlbGYiLCJjb25zb2xlIiwid2FybiIsIkVtaXR0ZXIiLCJyZXF1aXJlIiwic2FmZVN0cmluZ2lmeSIsIlJlcXVlc3RCYXNlIiwiaXNPYmplY3QiLCJSZXNwb25zZUJhc2UiLCJBZ2VudCIsIm5vb3AiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0aG9kIiwidXJsIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInJlcXVlc3QiLCJnZXRYSFIiLCJYTUxIdHRwUmVxdWVzdCIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJBY3RpdmVYT2JqZWN0IiwiRXJyb3IiLCJ0cmltIiwicyIsInJlcGxhY2UiLCJzZXJpYWxpemUiLCJvYmoiLCJwYWlycyIsImtleSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyIiwiam9pbiIsInZhbCIsInVuZGVmaW5lZCIsInB1c2giLCJlbmNvZGVVUkkiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwidiIsInN1YmtleSIsImVuY29kZVVSSUNvbXBvbmVudCIsInNlcmlhbGl6ZU9iamVjdCIsInBhcnNlU3RyaW5nIiwic3RyIiwic3BsaXQiLCJwYWlyIiwicG9zIiwiaSIsImxlbiIsImluZGV4T2YiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzbGljZSIsInR5cGVzIiwiaHRtbCIsImpzb24iLCJ4bWwiLCJ1cmxlbmNvZGVkIiwiZm9ybSIsInBhcnNlIiwiSlNPTiIsInBhcnNlSGVhZGVyIiwibGluZXMiLCJmaWVsZHMiLCJpbmRleCIsImxpbmUiLCJmaWVsZCIsInRvTG93ZXJDYXNlIiwiaXNKU09OIiwibWltZSIsInRlc3QiLCJSZXNwb25zZSIsInJlcSIsInhociIsInRleHQiLCJyZXNwb25zZVR5cGUiLCJyZXNwb25zZVRleHQiLCJzdGF0dXNUZXh0Iiwic3RhdHVzIiwiX3NldFN0YXR1c1Byb3BlcnRpZXMiLCJoZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwiaGVhZGVyIiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJfc2V0SGVhZGVyUHJvcGVydGllcyIsIl9yZXNwb25zZVR5cGUiLCJib2R5IiwicmVzcG9uc2UiLCJfcGFyc2VCb2R5IiwidHlwZSIsIl9wYXJzZXIiLCJ0b0Vycm9yIiwibXNnIiwiZXJyIiwiX3F1ZXJ5IiwiX2hlYWRlciIsIm9uIiwicmVzIiwiZXJyXyIsIm9yaWdpbmFsIiwicmF3UmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiY2FsbGJhY2siLCJlbWl0IiwibmV3X2VyciIsIl9pc1Jlc3BvbnNlT0siLCJzZXQiLCJhY2NlcHQiLCJhdXRoIiwidXNlciIsInBhc3MiLCJvcHRpb25zIiwiYnRvYSIsImVuY29kZXIiLCJzdHJpbmciLCJfYXV0aCIsInF1ZXJ5IiwiYXR0YWNoIiwiZmlsZSIsIl9kYXRhIiwiX2dldEZvcm1EYXRhIiwiYXBwZW5kIiwibmFtZSIsIl9mb3JtRGF0YSIsIkZvcm1EYXRhIiwiX3Nob3VsZFJldHJ5IiwiX3JldHJ5IiwiZm4iLCJfY2FsbGJhY2siLCJjbGVhclRpbWVvdXQiLCJfbWF4UmV0cmllcyIsInJldHJpZXMiLCJfcmV0cmllcyIsImNyb3NzRG9tYWluRXJyb3IiLCJjcm9zc0RvbWFpbiIsImFnZW50IiwiY2EiLCJidWZmZXIiLCJ3cml0ZSIsInBpcGUiLCJfaXNIb3N0IiwidG9TdHJpbmciLCJfZW5kQ2FsbGVkIiwiX2ZpbmFsaXplUXVlcnlTdHJpbmciLCJfZW5kIiwiX3NldFVwbG9hZFRpbWVvdXQiLCJfdXBsb2FkVGltZW91dCIsIl91cGxvYWRUaW1lb3V0VGltZXIiLCJzZXRUaW1lb3V0IiwiX3RpbWVvdXRFcnJvciIsIl9hYm9ydGVkIiwiZGF0YSIsIl9zZXRUaW1lb3V0cyIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJ0aW1lZG91dCIsImhhbmRsZVByb2dyZXNzIiwiZGlyZWN0aW9uIiwiZSIsInRvdGFsIiwicGVyY2VudCIsImxvYWRlZCIsImhhc0xpc3RlbmVycyIsImFkZEV2ZW50TGlzdGVuZXIiLCJiaW5kIiwidXBsb2FkIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsIm9wZW4iLCJfd2l0aENyZWRlbnRpYWxzIiwid2l0aENyZWRlbnRpYWxzIiwiY29udGVudFR5cGUiLCJfc2VyaWFsaXplciIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwiX3NldERlZmF1bHRzIiwiZGVsIiwiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBhdGNoIiwicG9zdCIsInB1dCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7QUFJQSxJQUFJQSxJQUFKOztBQUNBLElBQUksT0FBT0MsTUFBUCxLQUFrQixXQUF0QixFQUFtQztBQUNqQztBQUNBRCxFQUFBQSxJQUFJLEdBQUdDLE1BQVA7QUFDRCxDQUhELE1BR08sSUFBSSxPQUFPQyxJQUFQLEtBQWdCLFdBQXBCLEVBQWlDO0FBQ3RDO0FBQ0FDLEVBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUNFLHFFQURGO0FBR0FKLEVBQUFBLElBQUksU0FBSjtBQUNELENBTk0sTUFNQTtBQUNMO0FBQ0FBLEVBQUFBLElBQUksR0FBR0UsSUFBUDtBQUNEOztBQUVELElBQU1HLE9BQU8sR0FBR0MsT0FBTyxDQUFDLG1CQUFELENBQXZCOztBQUNBLElBQU1DLGFBQWEsR0FBR0QsT0FBTyxDQUFDLHFCQUFELENBQTdCOztBQUNBLElBQU1FLFdBQVcsR0FBR0YsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQU1HLFFBQVEsR0FBR0gsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBTUksWUFBWSxHQUFHSixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBTUssS0FBSyxHQUFHTCxPQUFPLENBQUMsY0FBRCxDQUFyQjtBQUVBOzs7OztBQUlBLFNBQVNNLElBQVQsR0FBZ0IsQ0FBRTtBQUVsQjs7Ozs7QUFJ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