PDF_Generation_and_Automation/node_modules/jsforce/browser/request.js
2025-08-24 12:01:08 +05:30

292 lines
39 KiB
JavaScript

import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.to-string.js";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
var _excluded = ["url", "body"];
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { var _context8; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context8 = {}.toString.call(r)).call(_context8, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout";
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
import _keysInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/keys";
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
import { Readable } from 'stream';
import fetch, { Response } from 'node-fetch';
import createHttpsProxyAgent from 'https-proxy-agent';
import { createHttpRequestHandlerStreams, executeWithTimeout, isRedirect, performRedirectRequest } from './request-helper';
import { getLogger } from './util/logger';
import is from '@sindresorhus/is';
/**
*
*/
var defaults = {};
/**
*
*/
export function setDefaults(defaults_) {
defaults = defaults_;
}
/**
*
*/
function startFetchRequest(_x, _x2, _x3, _x4, _x5) {
return _startFetchRequest.apply(this, arguments);
}
/**
*
*/
function _startFetchRequest() {
_startFetchRequest = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(request, options, input, output, emitter) {
var _options$retry$status, _options$retry, _options$retry$maxRet, _options$retry2, _options$retry$minTim, _options$retry3, _options$retry$timeou, _options$retry4, _options$retry$errorC, _options$retry5, _options$retry$method, _options$retry6, _options$timeout, _context4;
var counter,
logger,
httpProxy,
followRedirect,
agent,
url,
body,
rrequest,
controller,
retryCount,
retryOpts,
shouldRetryRequest,
_fetchWithRetries,
res,
fetchTimeout,
headers,
_iterator,
_step,
headerName,
response,
_args2 = arguments;
return _regeneratorRuntime.wrap(function _callee2$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
counter = _args2.length > 5 && _args2[5] !== undefined ? _args2[5] : 0;
logger = getLogger('fetch');
httpProxy = options.httpProxy, followRedirect = options.followRedirect;
agent = httpProxy ? createHttpsProxyAgent(httpProxy) : undefined;
url = request.url, body = request.body, rrequest = _objectWithoutProperties(request, _excluded);
controller = new AbortController();
retryCount = 0;
retryOpts = {
statusCodes: (_options$retry$status = (_options$retry = options.retry) === null || _options$retry === void 0 ? void 0 : _options$retry.statusCodes) !== null && _options$retry$status !== void 0 ? _options$retry$status : [420, 429, 500, 502, 503, 504],
maxRetries: (_options$retry$maxRet = (_options$retry2 = options.retry) === null || _options$retry2 === void 0 ? void 0 : _options$retry2.maxRetries) !== null && _options$retry$maxRet !== void 0 ? _options$retry$maxRet : 5,
minTimeout: (_options$retry$minTim = (_options$retry3 = options.retry) === null || _options$retry3 === void 0 ? void 0 : _options$retry3.minTimeout) !== null && _options$retry$minTim !== void 0 ? _options$retry$minTim : 500,
timeoutFactor: (_options$retry$timeou = (_options$retry4 = options.retry) === null || _options$retry4 === void 0 ? void 0 : _options$retry4.timeoutFactor) !== null && _options$retry$timeou !== void 0 ? _options$retry$timeou : 2,
errorCodes: (_options$retry$errorC = (_options$retry5 = options.retry) === null || _options$retry5 === void 0 ? void 0 : _options$retry5.errorCodes) !== null && _options$retry$errorC !== void 0 ? _options$retry$errorC : ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN', 'ENETUNREACH', 'EHOSTDOWN', 'UND_ERR_SOCKET', 'ETIMEDOUT', 'EPIPE'],
methods: (_options$retry$method = (_options$retry6 = options.retry) === null || _options$retry6 === void 0 ? void 0 : _options$retry6.methods) !== null && _options$retry$method !== void 0 ? _options$retry$method : ['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE']
};
shouldRetryRequest = function shouldRetryRequest(maxRetry, resOrErr) {
var _context;
if (!_includesInstanceProperty(_context = retryOpts.methods).call(_context, request.method)) return false;
if (resOrErr instanceof Response) {
var _context2;
if (_includesInstanceProperty(_context2 = retryOpts.statusCodes).call(_context2, resOrErr.status)) {
if (maxRetry === retryCount) {
return false;
} else {
return true;
}
}
return false;
} else {
var _retryOpts$errorCodes;
if (maxRetry === retryCount) return false;
// only retry on operational errors
// https://github.com/node-fetch/node-fetch/blob/2.x/ERROR-HANDLING.md#error-handling-with-node-fetch
if (resOrErr.name != 'FetchError') return false;
if (is.nodeStream(body) && Readable.isDisturbed(body)) {
logger.debug('Body of type stream was read, unable to retry request.');
return false;
}
if ('code' in resOrErr && resOrErr.code && retryOpts !== null && retryOpts !== void 0 && (_retryOpts$errorCodes = retryOpts.errorCodes) !== null && _retryOpts$errorCodes !== void 0 && _includesInstanceProperty(_retryOpts$errorCodes).call(_retryOpts$errorCodes, resOrErr.code)) return true;
return false;
}
};
_fetchWithRetries = /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var maxRetry,
fetchOpts,
_res,
error,
_args = arguments;
return _regeneratorRuntime.wrap(function _callee$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
maxRetry = _args.length > 0 && _args[0] !== undefined ? _args[0] : retryOpts === null || retryOpts === void 0 ? void 0 : retryOpts.maxRetries;
fetchOpts = _objectSpread(_objectSpread(_objectSpread({}, rrequest), input && /^(post|put|patch)$/i.test(request.method) ? {
body: input
} : {}), {}, {
redirect: 'manual',
signal: controller.signal,
agent: agent
});
_context3.prev = 2;
_context3.next = 5;
return fetch(url, fetchOpts);
case 5:
_res = _context3.sent;
if (!shouldRetryRequest(retryOpts.maxRetries, _res)) {
_context3.next = 16;
break;
}
logger.debug("retrying for the ".concat(retryCount + 1, " time"));
logger.debug('reason: statusCode match');
_context3.next = 11;
return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount));
case 11:
// NOTE: this event is only used by tests and will be removed at any time.
// jsforce may switch to node's fetch which doesn't emit this event on retries.
emitter.emit('retry', retryCount);
retryCount++;
_context3.next = 15;
return _fetchWithRetries(maxRetry);
case 15:
return _context3.abrupt("return", _context3.sent);
case 16:
return _context3.abrupt("return", _res);
case 19:
_context3.prev = 19;
_context3.t0 = _context3["catch"](2);
logger.debug('Request failed');
error = _context3.t0; // request was canceled by consumer (AbortController), skip retry and rethrow.
if (!(error.name === 'AbortError')) {
_context3.next = 25;
break;
}
throw error;
case 25:
if (!shouldRetryRequest(retryOpts.maxRetries, error)) {
_context3.next = 33;
break;
}
logger.debug("retrying for the ".concat(retryCount + 1, " time"));
logger.debug("Error: ".concat(_context3.t0.message));
_context3.next = 30;
return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount));
case 30:
// NOTE: this event is only used by tests and will be removed at any time.
// jsforce may switch to node's fetch which doesn't emit this event on retries.
emitter.emit('retry', retryCount);
retryCount++;
return _context3.abrupt("return", _fetchWithRetries(maxRetry));
case 33:
logger.debug('Skipping retry...');
if (!(maxRetry === retryCount)) {
_context3.next = 38;
break;
}
throw _context3.t0;
case 38:
throw _context3.t0;
case 39:
case "end":
return _context3.stop();
}
}, _callee, null, [[2, 19]]);
}));
return function fetchWithRetries() {
return _ref.apply(this, arguments);
};
}();
// Timeout after 5 minutes without a response
//
// node-fetch's default timeout is 0 and jsforce consumers can't set this when calling `Connection` methods so we set a long default at the fetch wrapper level.
fetchTimeout = (_options$timeout = options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : 300000;
_context5.prev = 11;
_context5.next = 14;
return executeWithTimeout(_fetchWithRetries, fetchTimeout, function () {
return controller.abort();
});
case 14:
res = _context5.sent;
_context5.next = 21;
break;
case 17:
_context5.prev = 17;
_context5.t0 = _context5["catch"](11);
emitter.emit('error', _context5.t0);
return _context5.abrupt("return");
case 21:
headers = {};
_iterator = _createForOfIteratorHelper(_keysInstanceProperty(_context4 = res.headers).call(_context4));
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
headerName = _step.value;
headers[headerName.toLowerCase()] = res.headers.get(headerName);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
response = {
statusCode: res.status,
headers: headers
};
if (!(followRedirect && isRedirect(response.statusCode))) {
_context5.next = 28;
break;
}
try {
performRedirectRequest(request, response, followRedirect, counter, function (req) {
return startFetchRequest(req, options, undefined, output, emitter, counter + 1);
});
} catch (err) {
emitter.emit('error', err);
}
return _context5.abrupt("return");
case 28:
emitter.emit('response', response);
res.body.pipe(output);
case 30:
case "end":
return _context5.stop();
}
}, _callee2, null, [[11, 17]]);
}));
return _startFetchRequest.apply(this, arguments);
}
export default function request(req) {
var options_ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var options = _objectSpread(_objectSpread({}, defaults), options_);
var _createHttpRequestHan = createHttpRequestHandlerStreams(req, options),
input = _createHttpRequestHan.input,
output = _createHttpRequestHan.output,
stream = _createHttpRequestHan.stream;
startFetchRequest(req, options, input, output, stream);
return stream;
}
var sleep = function sleep(ms) {
return new _Promise(function (r) {
return _setTimeout(r, ms);
});
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkYWJsZSIsImZldGNoIiwiUmVzcG9uc2UiLCJjcmVhdGVIdHRwc1Byb3h5QWdlbnQiLCJjcmVhdGVIdHRwUmVxdWVzdEhhbmRsZXJTdHJlYW1zIiwiZXhlY3V0ZVdpdGhUaW1lb3V0IiwiaXNSZWRpcmVjdCIsInBlcmZvcm1SZWRpcmVjdFJlcXVlc3QiLCJnZXRMb2dnZXIiLCJpcyIsImRlZmF1bHRzIiwic2V0RGVmYXVsdHMiLCJkZWZhdWx0c18iLCJzdGFydEZldGNoUmVxdWVzdCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3N0YXJ0RmV0Y2hSZXF1ZXN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsImlucHV0Iiwib3V0cHV0IiwiZW1pdHRlciIsIl9vcHRpb25zJHJldHJ5JHN0YXR1cyIsIl9vcHRpb25zJHJldHJ5IiwiX29wdGlvbnMkcmV0cnkkbWF4UmV0IiwiX29wdGlvbnMkcmV0cnkyIiwiX29wdGlvbnMkcmV0cnkkbWluVGltIiwiX29wdGlvbnMkcmV0cnkzIiwiX29wdGlvbnMkcmV0cnkkdGltZW91IiwiX29wdGlvbnMkcmV0cnk0IiwiX29wdGlvbnMkcmV0cnkkZXJyb3JDIiwiX29wdGlvbnMkcmV0cnk1IiwiX29wdGlvbnMkcmV0cnkkbWV0aG9kIiwiX29wdGlvbnMkcmV0cnk2IiwiX29wdGlvbnMkdGltZW91dCIsIl9jb250ZXh0NCIsImNvdW50ZXIiLCJsb2dnZXIiLCJodHRwUHJveHkiLCJmb2xsb3dSZWRpcmVjdCIsImFnZW50IiwidXJsIiwiYm9keSIsInJyZXF1ZXN0IiwiY29udHJvbGxlciIsInJldHJ5Q291bnQiLCJyZXRyeU9wdHMiLCJzaG91bGRSZXRyeVJlcXVlc3QiLCJfZmV0Y2hXaXRoUmV0cmllcyIsInJlcyIsImZldGNoVGltZW91dCIsImhlYWRlcnMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImhlYWRlck5hbWUiLCJyZXNwb25zZSIsIl9hcmdzMiIsIndyYXAiLCJfY2FsbGVlMiQiLCJfY29udGV4dDUiLCJwcmV2IiwibmV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIkFib3J0Q29udHJvbGxlciIsInN0YXR1c0NvZGVzIiwicmV0cnkiLCJtYXhSZXRyaWVzIiwibWluVGltZW91dCIsInRpbWVvdXRGYWN0b3IiLCJlcnJvckNvZGVzIiwibWV0aG9kcyIsIm1heFJldHJ5IiwicmVzT3JFcnIiLCJfY29udGV4dCIsIl9pbmNsdWRlc0luc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwibWV0aG9kIiwiX2NvbnRleHQyIiwic3RhdHVzIiwiX3JldHJ5T3B0cyRlcnJvckNvZGVzIiwibmFtZSIsIm5vZGVTdHJlYW0iLCJpc0Rpc3R1cmJlZCIsImRlYnVnIiwiY29kZSIsImZldGNoV2l0aFJldHJpZXMiLCJfcmVmIiwiX2NhbGxlZSIsImZldGNoT3B0cyIsIl9yZXMiLCJlcnJvciIsIl9hcmdzIiwiX2NhbGxlZSQiLCJfY29udGV4dDMiLCJfb2JqZWN0U3ByZWFkIiwidGVzdCIsInJlZGlyZWN0Iiwic2lnbmFsIiwic2VudCIsImNvbmNhdCIsInNsZWVwIiwiTWF0aCIsInBvdyIsImVtaXQiLCJhYnJ1cHQiLCJ0MCIsIm1lc3NhZ2UiLCJzdG9wIiwidGltZW91dCIsImFib3J0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfa2V5c0luc3RhbmNlUHJvcGVydHkiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsInRvTG93ZXJDYXNlIiwiZ2V0IiwiZXJyIiwiZSIsImYiLCJzdGF0dXNDb2RlIiwicmVxIiwicGlwZSIsIm9wdGlvbnNfIiwiX2NyZWF0ZUh0dHBSZXF1ZXN0SGFuIiwic3RyZWFtIiwibXMiLCJfUHJvbWlzZSIsInIiLCJfc2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBEdXBsZXgsIFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgZmV0Y2gsIHsgUmVzcG9uc2UsIFJlcXVlc3RJbml0LCBGZXRjaEVycm9yIH0gZnJvbSAnbm9kZS1mZXRjaCc7XG5pbXBvcnQgY3JlYXRlSHR0cHNQcm94eUFnZW50IGZyb20gJ2h0dHBzLXByb3h5LWFnZW50JztcbmltcG9ydCB7XG4gIGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMsXG4gIGV4ZWN1dGVXaXRoVGltZW91dCxcbiAgaXNSZWRpcmVjdCxcbiAgcGVyZm9ybVJlZGlyZWN0UmVxdWVzdCxcbn0gZnJvbSAnLi9yZXF1ZXN0LWhlbHBlcic7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL3V0aWwvbG9nZ2VyJztcbmltcG9ydCBpcyBmcm9tICdAc2luZHJlc29yaHVzL2lzJztcblxuLyoqXG4gKlxuICovXG5sZXQgZGVmYXVsdHM6IEh0dHBSZXF1ZXN0T3B0aW9ucyA9IHt9O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0cyhkZWZhdWx0c186IEh0dHBSZXF1ZXN0T3B0aW9ucykge1xuICBkZWZhdWx0cyA9IGRlZmF1bHRzXztcbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZldGNoUmVxdWVzdChcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3QsXG4gIG9wdGlvbnM6IEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgaW5wdXQ6IFJlYWRhYmxlIHwgdW5kZWZpbmVkLFxuICBvdXRwdXQ6IFdyaXRhYmxlLFxuICBlbWl0dGVyOiBFdmVudEVtaXR0ZXIsXG4gIGNvdW50ZXI6IG51bWJlciA9IDAsXG4pIHtcbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKCdmZXRjaCcpO1xuICBjb25zdCB7IGh0dHBQcm94eSwgZm9sbG93UmVkaXJlY3QgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFnZW50ID0gaHR0cFByb3h5ID8gY3JlYXRlSHR0cHNQcm94eUFnZW50KGh0dHBQcm94eSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgdXJsLCBib2R5LCAuLi5ycmVxdWVzdCB9ID0gcmVxdWVzdDtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgY29uc3QgcmV0cnlPcHRzOiBSZXF1aXJlZDxIdHRwUmVxdWVzdE9wdGlvbnNbJ3JldHJ5J10+ID0ge1xuICAgIHN0YXR1c0NvZGVzOiBvcHRpb25zLnJldHJ5Py5zdGF0dXNDb2RlcyA/PyBbNDIwLCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sXG4gICAgbWF4UmV0cmllczogb3B0aW9ucy5yZXRyeT8ubWF4UmV0cmllcyA/PyA1LFxuICAgIG1pblRpbWVvdXQ6IG9wdGlvbnMucmV0cnk/Lm1pblRpbWVvdXQgPz8gNTAwLFxuICAgIHRpbWVvdXRGYWN0b3I6IG9wdGlvbnMucmV0cnk/LnRpbWVvdXRGYWN0b3IgPz8gMixcbiAgICBlcnJvckNvZGVzOiBvcHRpb25zLnJldHJ5Py5lcnJvckNvZGVzID8/IFtcbiAgICAgICdFQ09OTlJFU0VUJyxcbiAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgJ0VOT1RGT1VORCcsXG4gICAgICAnRU5FVERPV04nLFxuICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICdFSE9TVERPV04nLFxuICAgICAgJ1VORF9FUlJfU09DS0VUJyxcbiAgICAgICdFVElNRURPVVQnLFxuICAgICAgJ0VQSVBFJyxcbiAgICBdLFxuICAgIG1ldGhvZHM6IG9wdGlvbnMucmV0cnk/Lm1ldGhvZHMgPz8gW1xuICAgICAgJ0dFVCcsXG4gICAgICAnUFVUJyxcbiAgICAgICdIRUFEJyxcbiAgICAgICdPUFRJT05TJyxcbiAgICAgICdERUxFVEUnLFxuICAgIF0sXG4gIH07XG5cbiAgY29uc3Qgc2hvdWxkUmV0cnlSZXF1ZXN0ID0gKFxuICAgIG1heFJldHJ5OiBudW1iZXIsXG4gICAgcmVzT3JFcnI6IFJlc3BvbnNlIHwgRXJyb3IgfCBGZXRjaEVycm9yLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXJldHJ5T3B0cy5tZXRob2RzLmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJlc09yRXJyIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXRyeU9wdHMuc3RhdHVzQ29kZXMuaW5jbHVkZXMocmVzT3JFcnIuc3RhdHVzKSkge1xuICAgICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gb25seSByZXRyeSBvbiBvcGVyYXRpb25hbCBlcnJvcnNcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvYmxvYi8yLngvRVJST1ItSEFORExJTkcubWQjZXJyb3ItaGFuZGxpbmctd2l0aC1ub2RlLWZldGNoXG4gICAgICBpZiAocmVzT3JFcnIubmFtZSAhPSAnRmV0Y2hFcnJvcicpIHJldHVybiBmYWxzZTtcblxuICAgICAgaWYgKGlzLm5vZGVTdHJlYW0oYm9keSkgJiYgUmVhZGFibGUuaXNEaXN0dXJiZWQoYm9keSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdCb2R5IG9mIHR5cGUgc3RyZWFtIHdhcyByZWFkLCB1bmFibGUgdG8gcmV0cnkgcmVxdWVzdC4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICdjb2RlJyBpbiByZXNPckVyciAmJlxuICAgICAgICByZXNPckVyci5jb2RlICYmXG4gICAgICAgIHJldHJ5T3B0cz8uZXJyb3JDb2Rlcz8uaW5jbHVkZXMocmVzT3JFcnIuY29kZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZmV0Y2hXaXRoUmV0cmllcyA9IGFzeW5jIChcbiAgICBtYXhSZXRyeSA9IHJldHJ5T3B0cz8ubWF4UmV0cmllcyxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGNvbnN0IGZldGNoT3B0czogUmVxdWVzdEluaXQgPSB7XG4gICAgICAuLi5ycmVxdWVzdCxcbiAgICAgIC4uLihpbnB1dCAmJiAvXihwb3N0fHB1dHxwYXRjaCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZClcbiAgICAgICAgPyB7IGJvZHk6IGlucHV0IH1cbiAgICAgICAgOiB7fSksXG4gICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgYWdlbnQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0cyk7XG4gICAgICBpZiAoc2hvdWxkUmV0cnlSZXF1ZXN0KHJldHJ5T3B0cy5tYXhSZXRyaWVzLCByZXMpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmV0cnlpbmcgZm9yIHRoZSAke3JldHJ5Q291bnQgKyAxfSB0aW1lYCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygncmVhc29uOiBzdGF0dXNDb2RlIG1hdGNoJyk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG4gICAgICAvLyBzaG91bGQgd2UgdGhyb3cgaGVyZSBpZiB0aGUgbWF4UmV0cnkgYWxyZWFkeSBoYXBwZW5lZCBhbmQgc3RpbGwgZ290IHRoZSBzYW1lIHN0YXR1c0NvZGU/XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGZhaWxlZCcpO1xuICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgRXJyb3IgfCBGZXRjaEVycm9yO1xuXG4gICAgICAvLyByZXF1ZXN0IHdhcyBjYW5jZWxlZCBieSBjb25zdW1lciAoQWJvcnRDb250cm9sbGVyKSwgc2tpcCByZXRyeSBhbmQgcmV0aHJvdy5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZXRyeVJlcXVlc3QocmV0cnlPcHRzLm1heFJldHJpZXMsIGVycm9yKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHJldHJ5aW5nIGZvciB0aGUgJHtyZXRyeUNvdW50ICsgMX0gdGltZWApO1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgcmV0cnkuLi4nKTtcblxuICAgICAgaWYgKG1heFJldHJ5ID09PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbGV0IHJlczogUmVzcG9uc2U7XG5cbiAgLy8gVGltZW91dCBhZnRlciA1IG1pbnV0ZXMgd2l0aG91dCBhIHJlc3BvbnNlXG4gIC8vXG4gIC8vIG5vZGUtZmV0Y2gncyBkZWZhdWx0IHRpbWVvdXQgaXMgMCBhbmQganNmb3JjZSBjb25zdW1lcnMgY2FuJ3Qgc2V0IHRoaXMgd2hlbiBjYWxsaW5nIGBDb25uZWN0aW9uYCBtZXRob2RzIHNvIHdlIHNldCBhIGxvbmcgZGVmYXVsdCBhdCB0aGUgZmV0Y2ggd3JhcHBlciBsZXZlbC5cbiAgY29uc3QgZmV0Y2hUaW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IDMwMF8wMDBcblxuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGV4ZWN1dGVXaXRoVGltZW91dChmZXRjaFdpdGhSZXRyaWVzLCBmZXRjaFRpbWVvdXQsICgpID0+XG4gICAgICBjb250cm9sbGVyLmFib3J0KCksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcy5oZWFkZXJzLmtleXMoKSkge1xuICAgIGhlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXSA9IHJlcy5oZWFkZXJzLmdldChoZWFkZXJOYW1lKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IHtcbiAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzLFxuICAgIGhlYWRlcnMsXG4gIH07XG4gIGlmIChmb2xsb3dSZWRpcmVjdCAmJiBpc1JlZGlyZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBlcmZvcm1SZWRpcmVjdFJlcXVlc3QoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICBmb2xsb3dSZWRpcmVjdCxcbiAgICAgICAgY291bnRlcixcbiAgICAgICAgKHJlcSkgPT5cbiAgICAgICAgICBzdGFydEZldGNoUmVxdWVzdChcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgY291bnRlciArIDEsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGVtaXR0ZXIuZW1pdCgncmVzcG9uc2UnLCByZXNwb25zZSk7XG4gIHJlcy5ib2R5LnBpcGUob3V0cHV0KTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0KFxuICByZXE6IEh0dHBSZXF1ZXN0LFxuICBvcHRpb25zXzogSHR0cFJlcXVlc3RPcHRpb25zID0ge30sXG4pOiBEdXBsZXgge1xuICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0cywgLi4ub3B0aW9uc18gfTtcbiAgY29uc3QgeyBpbnB1dCwgb3V0cHV0LCBzdHJlYW0gfSA9IGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMoXG4gICAgcmVxLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHN0YXJ0RmV0Y2hSZXF1ZXN0KHJlcSwgb3B0aW9ucywgaW5wdXQsIG91dHB1dCwgc3RyZWFtKTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQWlCQSxRQUFRLFFBQWtCLFFBQVE7QUFDbkQsT0FBT0MsS0FBSyxJQUFJQyxRQUFRLFFBQWlDLFlBQVk7QUFDckUsT0FBT0MscUJBQXFCLE1BQU0sbUJBQW1CO0FBQ3JELFNBQ0VDLCtCQUErQixFQUMvQkMsa0JBQWtCLEVBQ2xCQyxVQUFVLEVBQ1ZDLHNCQUFzQixRQUNqQixrQkFBa0I7QUFFekIsU0FBU0MsU0FBUyxRQUFRLGVBQWU7QUFDekMsT0FBT0MsRUFBRSxNQUFNLGtCQUFrQjs7QUFFakM7QUFD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aUIsQ0FDZnlILEdBQUcsRUFDSDNHLE9BQU8sRUFDUDZDLFNBQVMsRUFDVDNDLE1BQU0sRUFDTkMsT0FBTyxFQUNQZSxPQUFPLEdBQUcsQ0FDWixDQUFDO1lBQUEsQ0FDTCxDQUFDO1VBQ0gsQ0FBQyxDQUFDLE9BQU9xRixHQUFHLEVBQUU7WUFDWnBHLE9BQU8sQ0FBQ3FGLElBQUksQ0FBQyxPQUFPLEVBQUVlLEdBQUcsQ0FBQztVQUM1QjtVQUFDLE9BQUE5RCxTQUFBLENBQUFnRCxNQUFBO1FBQUE7VUFHSHRGLE9BQU8sQ0FBQ3FGLElBQUksQ0FBQyxVQUFVLEVBQUVuRCxRQUFRLENBQUM7VUFDbENOLEdBQUcsQ0FBQ1AsSUFBSSxDQUFDb0YsSUFBSSxDQUFDMUcsTUFBTSxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUF1QyxTQUFBLENBQUFtRCxJQUFBO01BQUE7SUFBQSxHQUFBOUYsUUFBQTtFQUFBLENBQ3ZCO0VBQUEsT0FBQU4sa0JBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFLRCxlQUFlLFNBQVNLLE9BQU9BLENBQzdCNEcsR0FBZ0IsRUFFUjtFQUFBLElBRFJFLFFBQTRCLEdBQUFuSCxTQUFBLENBQUFrRCxNQUFBLFFBQUFsRCxTQUFBLFFBQUFtRCxTQUFBLEdBQUFuRCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBRWpDLElBQU1NLE9BQU8sR0FBQStFLGFBQUEsQ0FBQUEsYUFBQSxLQUFRaEcsUUFBUSxHQUFLOEgsUUFBUSxDQUFFO0VBQzVDLElBQUFDLHFCQUFBLEdBQWtDckksK0JBQStCLENBQy9Ea0ksR0FBRyxFQUNIM0csT0FDRixDQUFDO0lBSE9DLEtBQUssR0FBQTZHLHFCQUFBLENBQUw3RyxLQUFLO0lBQUVDLE1BQU0sR0FBQTRHLHFCQUFBLENBQU41RyxNQUFNO0lBQUU2RyxNQUFNLEdBQUFELHFCQUFBLENBQU5DLE1BQU07RUFJN0I3SCxpQkFBaUIsQ0FBQ3lILEdBQUcsRUFBRTNHLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUU2RyxNQUFNLENBQUM7RUFDdEQsT0FBT0EsTUFBTTtBQUNmO0FBRUEsSUFBTTFCLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFJMkIsRUFBVTtFQUFBLE9BQUssSUFBQUMsUUFBQSxDQUFZLFVBQUNDLENBQUM7SUFBQSxPQUFLQyxXQUFBLENBQVdELENBQUMsRUFBRUYsRUFBRSxDQUFDO0VBQUEsRUFBQztBQUFBIiwiaWdub3JlTGlzdCI6W119