import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct"; 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 _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 _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 _Symbol$toPrimitive from "@babel/runtime-corejs3/core-js-stable/symbol/to-primitive"; import _typeof from "@babel/runtime-corejs3/helpers/typeof"; import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck"; import _createClass from "@babel/runtime-corejs3/helpers/createClass"; import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf"; import _inherits from "@babel/runtime-corejs3/helpers/inherits"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray"; var _excluded = ["Id", "type", "attributes"], _excluded2 = ["Id", "type", "attributes"], _excluded3 = ["Id", "type", "attributes"], _excluded4 = ["Id", "type", "attributes"]; function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[_Symbol$toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 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 _context59; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context59 = {}.toString.call(r)).call(_context59, 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; } 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 _context57, _context58; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context57 = ownKeys(Object(t), !0)).call(_context57, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context58 = ownKeys(Object(t))).call(_context58, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; import _Promise from "@babel/runtime-corejs3/core-js-stable/promise"; import _parseInt from "@babel/runtime-corejs3/core-js-stable/parse-int"; import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$entries from "@babel/runtime-corejs3/core-js-stable/object/entries"; import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes"; import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.join.js"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.number.constructor.js"; import "core-js/modules/es.object.keys.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.regexp.to-string.js"; import "core-js/modules/es.string.match.js"; import "core-js/modules/es.string.replace.js"; /** * */ import { EventEmitter } from 'events'; import jsforce from './jsforce'; import Transport, { CanvasTransport, XdProxyTransport, HttpProxyTransport } from './transport'; import { getLogger } from './util/logger'; import OAuth2 from './oauth2'; import Cache from './cache'; import HttpApi from './http-api'; import SessionRefreshDelegate from './session-refresh-delegate'; import Query from './query'; import SObject from './sobject'; import QuickAction from './quick-action'; import Process from './process'; import { formatDate } from './util/formatter'; import FormData from 'form-data'; /** * type definitions */ /** * */ var defaultConnectionConfig = { loginUrl: 'https://login.salesforce.com', instanceUrl: '', version: '50.0', logLevel: 'NONE', maxRequest: 10 }; /** * */ function esc(str) { return String(str || '').replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } /** * */ function parseSignedRequest(sr) { if (typeof sr === 'string') { if (_startsWithInstanceProperty(sr).call(sr, '{')) { // might be JSON return JSON.parse(sr); } // might be original base64-encoded signed request var msg = sr.split('.').pop(); // retrieve latter part if (!msg) { throw new Error('Invalid signed request'); } var json = Buffer.from(msg, 'base64').toString('utf-8'); return JSON.parse(json); } return sr; } /** @private **/ function parseIdUrl(url) { var _context; var _url$split$slice = _sliceInstanceProperty(_context = url.split('/')).call(_context, -2), _url$split$slice2 = _slicedToArray(_url$split$slice, 2), organizationId = _url$split$slice2[0], id = _url$split$slice2[1]; return { id: id, organizationId: organizationId, url: url }; } /** * Session Refresh delegate function for OAuth2 authz code flow * @private */ function oauthRefreshFn(_x, _x2) { return _oauthRefreshFn.apply(this, arguments); } /** * Session Refresh delegate function for username/password login * @private */ function _oauthRefreshFn() { _oauthRefreshFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee37(conn, callback) { var res, userInfo; return _regeneratorRuntime.wrap(function _callee37$(_context56) { while (1) switch (_context56.prev = _context56.next) { case 0: _context56.prev = 0; if (conn.refreshToken) { _context56.next = 3; break; } throw new Error('No refresh token found in the connection'); case 3: _context56.next = 5; return conn.oauth2.refreshToken(conn.refreshToken); case 5: res = _context56.sent; userInfo = parseIdUrl(res.id); conn._establish({ instanceUrl: res.instance_url, accessToken: res.access_token, userInfo: userInfo }); callback(undefined, res.access_token, res); _context56.next = 18; break; case 11: _context56.prev = 11; _context56.t0 = _context56["catch"](0); if (!(_context56.t0 instanceof Error)) { _context56.next = 17; break; } callback(_context56.t0); _context56.next = 18; break; case 17: throw _context56.t0; case 18: case "end": return _context56.stop(); } }, _callee37, null, [[0, 11]]); })); return _oauthRefreshFn.apply(this, arguments); } function createUsernamePasswordRefreshFn(username, password) { return /*#__PURE__*/function () { var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(conn, callback) { return _regeneratorRuntime.wrap(function _callee$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return conn.login(username, password); case 3: if (conn.accessToken) { _context2.next = 5; break; } throw new Error('Access token not found after login'); case 5: callback(null, conn.accessToken); _context2.next = 15; break; case 8: _context2.prev = 8; _context2.t0 = _context2["catch"](0); if (!(_context2.t0 instanceof Error)) { _context2.next = 14; break; } callback(_context2.t0); _context2.next = 15; break; case 14: throw _context2.t0; case 15: case "end": return _context2.stop(); } }, _callee, null, [[0, 8]]); })); return function (_x3, _x4) { return _ref.apply(this, arguments); }; }(); } /** * @private */ function toSaveResult(err) { return { success: false, errors: [err] }; } /** * */ function raiseNoModuleError(name) { var _context3; throw new Error(_concatInstanceProperty(_context3 = "API module '".concat(name, "' is not loaded, load 'jsforce/api/")).call(_context3, name, "' explicitly")); } /* * Constant of maximum records num in DML operation (update/delete) */ var MAX_DML_COUNT = 200; /** * */ export var Connection = /*#__PURE__*/function (_EventEmitter) { /** * */ function Connection() { var _this; var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Connection); _this = _callSuper(this, Connection); _defineProperty(_this, "limitInfo", {}); _defineProperty(_this, "sobjects", {}); /** * Synonym of Connection#create() */ _defineProperty(_this, "insert", _this.create); /** * Synonym of Connection#destroy() */ _defineProperty(_this, "delete", _this.destroy); /** * Synonym of Connection#destroy() */ _defineProperty(_this, "del", _this.destroy); /** * Module which manages process rules and approval processes */ _defineProperty(_this, "process", new Process(_this)); var loginUrl = config.loginUrl, instanceUrl = config.instanceUrl, version = config.version, oauth2 = config.oauth2, maxRequest = config.maxRequest, logLevel = config.logLevel, proxyUrl = config.proxyUrl, httpProxy = config.httpProxy; _this.loginUrl = loginUrl || defaultConnectionConfig.loginUrl; _this.instanceUrl = instanceUrl || defaultConnectionConfig.instanceUrl; if (_this.isLightningInstance()) { throw new Error('lightning URLs are not valid as instance URLs'); } _this.version = version || defaultConnectionConfig.version; _this.oauth2 = oauth2 instanceof OAuth2 ? oauth2 : new OAuth2(_objectSpread({ loginUrl: _this.loginUrl, proxyUrl: proxyUrl, httpProxy: httpProxy }, oauth2)); var refreshFn = config.refreshFn; if (!refreshFn && _this.oauth2.clientId) { refreshFn = oauthRefreshFn; } if (refreshFn) { _this._refreshDelegate = new SessionRefreshDelegate(_this, refreshFn); } _this._maxRequest = maxRequest || defaultConnectionConfig.maxRequest; _this._logger = logLevel ? Connection._logger.createInstance(logLevel) : Connection._logger; _this._logLevel = logLevel; _this._transport = proxyUrl ? new XdProxyTransport(proxyUrl) : httpProxy ? new HttpProxyTransport(httpProxy) : new Transport(); _this._callOptions = config.callOptions; _this.cache = new Cache(); var describeCacheKey = function describeCacheKey(type) { return type ? "describe.".concat(type) : 'describe'; }; var describe = Connection.prototype.describe; _this.describe = _this.cache.createCachedFunction(describe, _this, { key: describeCacheKey, strategy: 'NOCACHE' }); _this.describe$ = _this.cache.createCachedFunction(describe, _this, { key: describeCacheKey, strategy: 'HIT' }); _this.describe$$ = _this.cache.createCachedFunction(describe, _this, { key: describeCacheKey, strategy: 'IMMEDIATE' }); _this.describeSObject = _this.describe; _this.describeSObject$ = _this.describe$; _this.describeSObject$$ = _this.describe$$; var describeGlobal = Connection.prototype.describeGlobal; _this.describeGlobal = _this.cache.createCachedFunction(describeGlobal, _this, { key: 'describeGlobal', strategy: 'NOCACHE' }); _this.describeGlobal$ = _this.cache.createCachedFunction(describeGlobal, _this, { key: 'describeGlobal', strategy: 'HIT' }); _this.describeGlobal$$ = _this.cache.createCachedFunction(describeGlobal, _this, { key: 'describeGlobal', strategy: 'IMMEDIATE' }); var accessToken = config.accessToken, refreshToken = config.refreshToken, sessionId = config.sessionId, serverUrl = config.serverUrl, signedRequest = config.signedRequest; _this._establish({ accessToken: accessToken, refreshToken: refreshToken, instanceUrl: instanceUrl, sessionId: sessionId, serverUrl: serverUrl, signedRequest: signedRequest }); jsforce.emit('connection:new', _this); return _this; } /* @private */ _inherits(Connection, _EventEmitter); return _createClass(Connection, [{ key: "analytics", get: // describe: (name: string) => Promise; // describeGlobal: () => Promise; // API libs are not instantiated here so that core module to remain without dependencies to them // It is responsible for developers to import api libs explicitly if they are using 'jsforce/core' instead of 'jsforce'. function get() { return raiseNoModuleError('analytics'); } }, { key: "apex", get: function get() { return raiseNoModuleError('apex'); } }, { key: "bulk", get: function get() { return raiseNoModuleError('bulk'); } }, { key: "bulk2", get: function get() { return raiseNoModuleError('bulk2'); } }, { key: "chatter", get: function get() { return raiseNoModuleError('chatter'); } }, { key: "metadata", get: function get() { return raiseNoModuleError('metadata'); } }, { key: "soap", get: function get() { return raiseNoModuleError('soap'); } }, { key: "streaming", get: function get() { return raiseNoModuleError('streaming'); } }, { key: "tooling", get: function get() { return raiseNoModuleError('tooling'); } }, { key: "_establish", value: function _establish(options) { var _context4; var accessToken = options.accessToken, refreshToken = options.refreshToken, instanceUrl = options.instanceUrl, sessionId = options.sessionId, serverUrl = options.serverUrl, signedRequest = options.signedRequest, userInfo = options.userInfo; this.instanceUrl = serverUrl ? _sliceInstanceProperty(_context4 = serverUrl.split('/')).call(_context4, 0, 3).join('/') : instanceUrl || this.instanceUrl; this.accessToken = sessionId || accessToken || this.accessToken; this.refreshToken = refreshToken || this.refreshToken; if (this.refreshToken && !this._refreshDelegate) { throw new Error('Refresh token is specified without oauth2 client information or refresh function'); } var signedRequestObject = signedRequest && parseSignedRequest(signedRequest); if (signedRequestObject) { this.accessToken = signedRequestObject.client.oauthToken; if (CanvasTransport.supported) { this._transport = new CanvasTransport(signedRequestObject); } } this.userInfo = userInfo || this.userInfo; this._sessionType = sessionId ? 'soap' : 'oauth2'; this._resetInstance(); } /* @priveate */ }, { key: "_clearSession", value: function _clearSession() { this.accessToken = null; this.refreshToken = null; this.instanceUrl = defaultConnectionConfig.instanceUrl; this.userInfo = null; this._sessionType = null; } /* @priveate */ }, { key: "_resetInstance", value: function _resetInstance() { var _this2 = this; this.limitInfo = {}; this.sobjects = {}; // TODO impl cache this.cache.clear(); this.cache.get('describeGlobal').removeAllListeners('value'); this.cache.get('describeGlobal').on('value', function (_ref2) { var result = _ref2.result; if (result) { var _iterator = _createForOfIteratorHelper(result.sobjects), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var so = _step.value; _this2.sobject(so.name); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } }); /* if (this.tooling) { this.tooling._resetInstance(); } */ } /** * Authorize the connection using OAuth2 flow. * Typically, just pass the code returned from authorization server in the first argument to complete authorization. * If you want to authorize with grant types other than `authorization_code`, you can also pass params object with the grant type. * * @returns {Promise} An object that contains the user ID, org ID and identity URL. * */ }, { key: "authorize", value: (function () { var _authorize = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(codeOrParams) { var _context5; var params, res, userInfo, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: params = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {}; _context6.next = 3; return this.oauth2.requestToken(codeOrParams, params); case 3: res = _context6.sent; userInfo = parseIdUrl(res.id); this._establish({ instanceUrl: res.instance_url, accessToken: res.access_token, refreshToken: res.refresh_token, userInfo: userInfo }); this._logger.debug(_concatInstanceProperty(_context5 = " completed. user id = ".concat(userInfo.id, ", org id = ")).call(_context5, userInfo.organizationId)); return _context6.abrupt("return", userInfo); case 8: case "end": return _context6.stop(); } }, _callee2, this); })); function authorize(_x5) { return _authorize.apply(this, arguments); } return authorize; }() /** * */ ) }, { key: "login", value: (function () { var _login = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(username, password) { var _this$oauth; return _regeneratorRuntime.wrap(function _callee3$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: this._refreshDelegate = new SessionRefreshDelegate(this, createUsernamePasswordRefreshFn(username, password)); if (!((_this$oauth = this.oauth2) !== null && _this$oauth !== void 0 && _this$oauth.clientId && this.oauth2.clientSecret)) { _context7.next = 3; break; } return _context7.abrupt("return", this.loginByOAuth2(username, password)); case 3: return _context7.abrupt("return", this.loginBySoap(username, password)); case 4: case "end": return _context7.stop(); } }, _callee3, this); })); function login(_x6, _x7) { return _login.apply(this, arguments); } return login; }() /** * Login by OAuth2 username & password flow */ ) }, { key: "loginByOAuth2", value: (function () { var _loginByOAuth = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(username, password) { var _context8; var res, userInfo; return _regeneratorRuntime.wrap(function _callee4$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: _context9.next = 2; return this.oauth2.authenticate(username, password); case 2: res = _context9.sent; userInfo = parseIdUrl(res.id); this._establish({ instanceUrl: res.instance_url, accessToken: res.access_token, userInfo: userInfo }); this._logger.info(_concatInstanceProperty(_context8 = " completed. user id = ".concat(userInfo.id, ", org id = ")).call(_context8, userInfo.organizationId)); return _context9.abrupt("return", userInfo); case 7: case "end": return _context9.stop(); } }, _callee4, this); })); function loginByOAuth2(_x8, _x9) { return _loginByOAuth.apply(this, arguments); } return loginByOAuth2; }() /** * */ ) }, { key: "loginBySoap", value: (function () { var _loginBySoap = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(username, password) { var _context10, _context11; var body, soapLoginEndpoint, response, m, faultstring, serverUrl, sessionId, userId, organizationId, idUrl, userInfo; return _regeneratorRuntime.wrap(function _callee5$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: if (!(!username || !password)) { _context12.next = 2; break; } return _context12.abrupt("return", _Promise.reject(new Error('no username password given'))); case 2: body = ['', '', '', '', "".concat(esc(username), ""), "".concat(esc(password), ""), '', '', ''].join(''); soapLoginEndpoint = [this.loginUrl, 'services/Soap/u', this.version].join('/'); _context12.next = 6; return this._transport.httpRequest({ method: 'POST', url: soapLoginEndpoint, body: body, headers: { 'Content-Type': 'text/xml', SOAPAction: '""' } }); case 6: response = _context12.sent; if (!(response.statusCode >= 400)) { _context12.next = 11; break; } m = response.body.match(/([^<]+)<\/faultstring>/); faultstring = m && m[1]; throw new Error(faultstring || response.body); case 11: if (!response.body.match(/true<\/passwordExpired>/g)) { _context12.next = 13; break; } throw new Error('Unable to login because the used password has expired.'); case 13: this._logger.debug("SOAP response = ".concat(response.body)); m = response.body.match(/([^<]+)<\/serverUrl>/); serverUrl = m && m[1]; m = response.body.match(/([^<]+)<\/sessionId>/); sessionId = m && m[1]; m = response.body.match(/([^<]+)<\/userId>/); userId = m && m[1]; m = response.body.match(/([^<]+)<\/organizationId>/); organizationId = m && m[1]; if (!(!serverUrl || !sessionId || !userId || !organizationId)) { _context12.next = 24; break; } throw new Error('could not extract session information from login response'); case 24: idUrl = [this.loginUrl, 'id', organizationId, userId].join('/'); userInfo = { id: userId, organizationId: organizationId, url: idUrl }; this._establish({ serverUrl: _sliceInstanceProperty(_context10 = serverUrl.split('/')).call(_context10, 0, 3).join('/'), sessionId: sessionId, userInfo: userInfo }); this._logger.info(_concatInstanceProperty(_context11 = " completed. user id = ".concat(userId, ", org id = ")).call(_context11, organizationId)); return _context12.abrupt("return", userInfo); case 29: case "end": return _context12.stop(); } }, _callee5, this); })); function loginBySoap(_x10, _x11) { return _loginBySoap.apply(this, arguments); } return loginBySoap; }() /** * Logout the current session */ ) }, { key: "logout", value: (function () { var _logout = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(revoke) { return _regeneratorRuntime.wrap(function _callee6$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: this._refreshDelegate = undefined; if (!(this._sessionType === 'oauth2')) { _context13.next = 3; break; } return _context13.abrupt("return", this.logoutByOAuth2(revoke)); case 3: return _context13.abrupt("return", this.logoutBySoap(revoke)); case 4: case "end": return _context13.stop(); } }, _callee6, this); })); function logout(_x12) { return _logout.apply(this, arguments); } return logout; }() /** * Logout the current session by revoking access token via OAuth2 session revoke */ ) }, { key: "logoutByOAuth2", value: (function () { var _logoutByOAuth = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(revoke) { var token; return _regeneratorRuntime.wrap(function _callee7$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: token = revoke ? this.refreshToken : this.accessToken; if (!token) { _context14.next = 4; break; } _context14.next = 4; return this.oauth2.revokeToken(token); case 4: // Destroy the session bound to this connection this._clearSession(); this._resetInstance(); case 6: case "end": return _context14.stop(); } }, _callee7, this); })); function logoutByOAuth2(_x13) { return _logoutByOAuth.apply(this, arguments); } return logoutByOAuth2; }() /** * Logout the session by using SOAP web service API */ ) }, { key: "logoutBySoap", value: (function () { var _logoutBySoap = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(revoke) { var _context15; var body, response, m, faultstring; return _regeneratorRuntime.wrap(function _callee8$(_context16) { while (1) switch (_context16.prev = _context16.next) { case 0: body = ['', '', '', "".concat(esc(revoke ? this.refreshToken : this.accessToken), ""), '', '', '', '', '', ''].join(''); _context16.next = 3; return this._transport.httpRequest({ method: 'POST', url: [this.instanceUrl, 'services/Soap/u', this.version].join('/'), body: body, headers: { 'Content-Type': 'text/xml', SOAPAction: '""' } }); case 3: response = _context16.sent; this._logger.debug(_concatInstanceProperty(_context15 = "SOAP statusCode = ".concat(response.statusCode, ", response = ")).call(_context15, response.body)); if (!(response.statusCode >= 400)) { _context16.next = 9; break; } m = response.body.match(/([^<]+)<\/faultstring>/); faultstring = m && m[1]; throw new Error(faultstring || response.body); case 9: // Destroy the session bound to this connection this._clearSession(); this._resetInstance(); case 11: case "end": return _context16.stop(); } }, _callee8, this); })); function logoutBySoap(_x14) { return _logoutBySoap.apply(this, arguments); } return logoutBySoap; }() /** * Send REST API request with given HTTP request info, with connected session information. * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ ) }, { key: "request", value: function request(_request) { var _this3 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // if request is simple string, regard it as url in GET method var request_ = typeof _request === 'string' ? { method: 'GET', url: _request } : _request; // if url is given in relative path, prepend base url or instance url before. request_ = _objectSpread(_objectSpread({}, request_), {}, { url: this._normalizeUrl(request_.url) }); var httpApi = new HttpApi(this, options); // log api usage and its quota httpApi.on('response', function (response) { if (response.headers && response.headers['sforce-limit-info']) { var apiUsage = response.headers['sforce-limit-info'].match(/api-usage=(\d+)\/(\d+)/); if (apiUsage) { _this3.limitInfo = { apiUsage: { used: _parseInt(apiUsage[1], 10), limit: _parseInt(apiUsage[2], 10) } }; } } }); return httpApi.request(request_); } /** * Send HTTP GET request * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ }, { key: "requestGet", value: function requestGet(url, options) { var request = { method: 'GET', url: url }; return this.request(request, options); } /** * Send HTTP POST request with JSON body, with connected session information * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ }, { key: "requestPost", value: function requestPost(url, body, options) { var request = { method: 'POST', url: url, body: _JSON$stringify(body), headers: { 'content-type': 'application/json' } }; return this.request(request, options); } /** * Send HTTP PUT request with JSON body, with connected session information * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ }, { key: "requestPut", value: function requestPut(url, body, options) { var request = { method: 'PUT', url: url, body: _JSON$stringify(body), headers: { 'content-type': 'application/json' } }; return this.request(request, options); } /** * Send HTTP PATCH request with JSON body * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ }, { key: "requestPatch", value: function requestPatch(url, body, options) { var request = { method: 'PATCH', url: url, body: _JSON$stringify(body), headers: { 'content-type': 'application/json' } }; return this.request(request, options); } /** * Send HTTP DELETE request * * Endpoint URL can be absolute URL ('https://na1.salesforce.com/services/data/v32.0/sobjects/Account/describe') * , relative path from root ('/services/data/v32.0/sobjects/Account/describe') * , or relative path from version root ('/sobjects/Account/describe'). */ }, { key: "requestDelete", value: function requestDelete(url, options) { var request = { method: 'DELETE', url: url }; return this.request(request, options); } /** @private **/ }, { key: "_baseUrl", value: function _baseUrl() { return [this.instanceUrl, 'services/data', "v".concat(this.version)].join('/'); } /** * Convert path to absolute url * @private */ }, { key: "_normalizeUrl", value: function _normalizeUrl(url) { if (_startsWithInstanceProperty(url).call(url, '/')) { if (_startsWithInstanceProperty(url).call(url, this.instanceUrl + '/services/')) { return url; } if (_startsWithInstanceProperty(url).call(url, '/services/')) { return this.instanceUrl + url; } return this._baseUrl() + url; } return url; } /** * */ }, { key: "query", value: function query(soql, options) { return new Query(this, soql, options); } /** * Execute search by SOSL * * @param {String} sosl - SOSL string * @param {Callback.>} [callback] - Callback function * @returns {Promise.>} */ }, { key: "search", value: function search(sosl) { var url = this._baseUrl() + '/search?q=' + encodeURIComponent(sosl); return this.request(url); } /** * */ }, { key: "queryMore", value: function queryMore(locator, options) { return new Query(this, { locator: locator }, options); } /* */ }, { key: "_ensureVersion", value: function _ensureVersion(majorVersion) { var versions = this.version.split('.'); return _parseInt(versions[0], 10) >= majorVersion; } /* */ }, { key: "_supports", value: function _supports(feature) { switch (feature) { case 'sobject-collection': // sobject collection is available only in API ver 42.0+ return this._ensureVersion(42); default: return false; } } /** * Retrieve specified records */ }, { key: "retrieve", value: function () { var _retrieve = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9(type, ids) { var options, _args9 = arguments; return _regeneratorRuntime.wrap(function _callee9$(_context17) { while (1) switch (_context17.prev = _context17.next) { case 0: options = _args9.length > 2 && _args9[2] !== undefined ? _args9[2] : {}; return _context17.abrupt("return", _Array$isArray(ids) ? // check the version whether SObject collection API is supported (42.0) this._ensureVersion(42) ? this._retrieveMany(type, ids, options) : this._retrieveParallel(type, ids, options) : this._retrieveSingle(type, ids, options)); case 2: case "end": return _context17.stop(); } }, _callee9, this); })); function retrieve(_x15, _x16) { return _retrieve.apply(this, arguments); } return retrieve; }() /** @private */ }, { key: "_retrieveSingle", value: (function () { var _retrieveSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee10(type, id, options) { var url, fields, headers; return _regeneratorRuntime.wrap(function _callee10$(_context18) { while (1) switch (_context18.prev = _context18.next) { case 0: if (id) { _context18.next = 2; break; } throw new Error('Invalid record ID. Specify valid record ID value'); case 2: url = [this._baseUrl(), 'sobjects', type, id].join('/'); fields = options.fields, headers = options.headers; if (fields) { url += "?fields=".concat(fields.join(',')); } return _context18.abrupt("return", this.request({ method: 'GET', url: url, headers: headers })); case 6: case "end": return _context18.stop(); } }, _callee10, this); })); function _retrieveSingle(_x17, _x18, _x19) { return _retrieveSingle2.apply(this, arguments); } return _retrieveSingle; }() /** @private */) }, { key: "_retrieveParallel", value: (function () { var _retrieveParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee11(type, ids, options) { var _this4 = this; return _regeneratorRuntime.wrap(function _callee11$(_context19) { while (1) switch (_context19.prev = _context19.next) { case 0: if (!(ids.length > this._maxRequest)) { _context19.next = 2; break; } throw new Error('Exceeded max limit of concurrent call'); case 2: return _context19.abrupt("return", _Promise.all(_mapInstanceProperty(ids).call(ids, function (id) { return _this4._retrieveSingle(type, id, options).catch(function (err) { if (options.allOrNone || err.errorCode !== 'NOT_FOUND') { throw err; } return null; }); }))); case 3: case "end": return _context19.stop(); } }, _callee11, this); })); function _retrieveParallel(_x20, _x21, _x22) { return _retrieveParallel2.apply(this, arguments); } return _retrieveParallel; }() /** @private */) }, { key: "_retrieveMany", value: (function () { var _retrieveMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee12(type, ids, options) { var _context20; var url, fields; return _regeneratorRuntime.wrap(function _callee12$(_context21) { while (1) switch (_context21.prev = _context21.next) { case 0: if (!(ids.length === 0)) { _context21.next = 2; break; } return _context21.abrupt("return", []); case 2: url = [this._baseUrl(), 'composite', 'sobjects', type].join('/'); _context21.t0 = options.fields; if (_context21.t0) { _context21.next = 10; break; } _context21.t1 = _mapInstanceProperty; _context21.next = 8; return this.describe$(type); case 8: _context21.t2 = _context20 = _context21.sent.fields; _context21.t0 = (0, _context21.t1)(_context21.t2).call(_context20, function (field) { return field.name; }); case 10: fields = _context21.t0; return _context21.abrupt("return", this.request({ method: 'POST', url: url, body: _JSON$stringify({ ids: ids, fields: fields }), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) })); case 12: case "end": return _context21.stop(); } }, _callee12, this); })); function _retrieveMany(_x23, _x24, _x25) { return _retrieveMany2.apply(this, arguments); } return _retrieveMany; }() /** * Create records */ ) }, { key: "create", value: ( /** * @param type * @param records * @param options */ function () { var _create = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee13(type, records) { var options, ret, _args13 = arguments; return _regeneratorRuntime.wrap(function _callee13$(_context22) { while (1) switch (_context22.prev = _context22.next) { case 0: options = _args13.length > 2 && _args13[2] !== undefined ? _args13[2] : {}; if (!_Array$isArray(records)) { _context22.next = 14; break; } if (!this._ensureVersion(42)) { _context22.next = 8; break; } _context22.next = 5; return this._createMany(type, records, options); case 5: _context22.t1 = _context22.sent; _context22.next = 11; break; case 8: _context22.next = 10; return this._createParallel(type, records, options); case 10: _context22.t1 = _context22.sent; case 11: _context22.t0 = _context22.t1; _context22.next = 17; break; case 14: _context22.next = 16; return this._createSingle(type, records, options); case 16: _context22.t0 = _context22.sent; case 17: ret = _context22.t0; return _context22.abrupt("return", ret); case 19: case "end": return _context22.stop(); } }, _callee13, this); })); function create(_x26, _x27) { return _create.apply(this, arguments); } return create; }() /** @private */) }, { key: "_createSingle", value: (function () { var _createSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee14(type, record, options) { var Id, rtype, attributes, rec, sobjectType, url, contentType, body, _context23, form; return _regeneratorRuntime.wrap(function _callee14$(_context24) { while (1) switch (_context24.prev = _context24.next) { case 0: Id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded); sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype; if (sobjectType) { _context24.next = 4; break; } throw new Error('No SObject Type defined in record'); case 4: url = [this._baseUrl(), 'sobjects', sobjectType].join('/'); if (options !== null && options !== void 0 && options.multipartFileFields) { // Send the record as a multipart/form-data request. Useful for fields containing large binary blobs. form = new FormData(); // Extract the fields requested to be sent separately from the JSON _forEachInstanceProperty(_context23 = _Object$entries(options.multipartFileFields)).call(_context23, function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), fieldName = _ref4[0], fileDetails = _ref4[1]; form.append(fieldName, Buffer.from(rec[fieldName], 'base64'), fileDetails); delete rec[fieldName]; }); // Serialize the remaining fields as JSON form.append(type, _JSON$stringify(rec), { contentType: 'application/json' }); contentType = form.getHeaders()['content-type']; // This is necessary to ensure the 'boundary' is present body = form; } else { // Default behavior: send the request as JSON contentType = 'application/json'; body = _JSON$stringify(rec); } return _context24.abrupt("return", this.request({ method: 'POST', url: url, body: body, headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': contentType }) })); case 7: case "end": return _context24.stop(); } }, _callee14, this); })); function _createSingle(_x28, _x29, _x30) { return _createSingle2.apply(this, arguments); } return _createSingle; }() /** @private */) }, { key: "_createParallel", value: (function () { var _createParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee15(type, records, options) { var _this5 = this; return _regeneratorRuntime.wrap(function _callee15$(_context25) { while (1) switch (_context25.prev = _context25.next) { case 0: if (!(records.length > this._maxRequest)) { _context25.next = 2; break; } throw new Error('Exceeded max limit of concurrent call'); case 2: return _context25.abrupt("return", _Promise.all(_mapInstanceProperty(records).call(records, function (record) { return _this5._createSingle(type, record, options).catch(function (err) { // be aware that allOrNone in parallel mode will not revert the other successful requests // it only raises error when met at least one failed request. if (options.allOrNone || !err.errorCode) { throw err; } return toSaveResult(err); }); }))); case 3: case "end": return _context25.stop(); } }, _callee15, this); })); function _createParallel(_x31, _x32, _x33) { return _createParallel2.apply(this, arguments); } return _createParallel; }() /** @private */) }, { key: "_createMany", value: (function () { var _createMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee16(type, records, options) { var _context26, _records, url; return _regeneratorRuntime.wrap(function _callee16$(_context27) { while (1) switch (_context27.prev = _context27.next) { case 0: if (!(records.length === 0)) { _context27.next = 2; break; } return _context27.abrupt("return", _Promise.resolve([])); case 2: if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) { _context27.next = 16; break; } _context27.t0 = _concatInstanceProperty(_context26 = []); _context27.t1 = _context26; _context27.t2 = _toConsumableArray; _context27.next = 8; return this._createMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), options); case 8: _context27.t3 = _context27.sent; _context27.t4 = (0, _context27.t2)(_context27.t3); _context27.t5 = _toConsumableArray; _context27.next = 13; return this._createMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), options); case 13: _context27.t6 = _context27.sent; _context27.t7 = (0, _context27.t5)(_context27.t6); return _context27.abrupt("return", _context27.t0.call.call(_context27.t0, _context27.t1, _context27.t4, _context27.t7)); case 16: _records = _mapInstanceProperty(records).call(records, function (record) { var Id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded2); var sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype; if (!sobjectType) { throw new Error('No SObject Type defined in record'); } return _objectSpread({ attributes: { type: sobjectType } }, rec); }); url = [this._baseUrl(), 'composite', 'sobjects'].join('/'); return _context27.abrupt("return", this.request({ method: 'POST', url: url, body: _JSON$stringify({ allOrNone: options.allOrNone || false, records: _records }), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) })); case 19: case "end": return _context27.stop(); } }, _callee16, this); })); function _createMany(_x34, _x35, _x36) { return _createMany2.apply(this, arguments); } return _createMany; }()) }, { key: "update", value: /** * @param type * @param records * @param options */ function update(type, records) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return _Array$isArray(records) ? // check the version whether SObject collection API is supported (42.0) this._ensureVersion(42) ? this._updateMany(type, records, options) : this._updateParallel(type, records, options) : this._updateSingle(type, records, options); } /** @private */ }, { key: "_updateSingle", value: (function () { var _updateSingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee17(type, record, options) { var id, rtype, attributes, rec, sobjectType, url; return _regeneratorRuntime.wrap(function _callee17$(_context28) { while (1) switch (_context28.prev = _context28.next) { case 0: id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded3); if (id) { _context28.next = 3; break; } throw new Error('Record id is not found in record.'); case 3: sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype; if (sobjectType) { _context28.next = 6; break; } throw new Error('No SObject Type defined in record'); case 6: url = [this._baseUrl(), 'sobjects', sobjectType, id].join('/'); return _context28.abrupt("return", this.request({ method: 'PATCH', url: url, body: _JSON$stringify(rec), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) }, { noContentResponse: { id: id, success: true, errors: [] } })); case 8: case "end": return _context28.stop(); } }, _callee17, this); })); function _updateSingle(_x37, _x38, _x39) { return _updateSingle2.apply(this, arguments); } return _updateSingle; }() /** @private */) }, { key: "_updateParallel", value: (function () { var _updateParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee18(type, records, options) { var _this6 = this; return _regeneratorRuntime.wrap(function _callee18$(_context29) { while (1) switch (_context29.prev = _context29.next) { case 0: if (!(records.length > this._maxRequest)) { _context29.next = 2; break; } throw new Error('Exceeded max limit of concurrent call'); case 2: return _context29.abrupt("return", _Promise.all(_mapInstanceProperty(records).call(records, function (record) { return _this6._updateSingle(type, record, options).catch(function (err) { // be aware that allOrNone in parallel mode will not revert the other successful requests // it only raises error when met at least one failed request. if (options.allOrNone || !err.errorCode) { throw err; } return toSaveResult(err); }); }))); case 3: case "end": return _context29.stop(); } }, _callee18, this); })); function _updateParallel(_x40, _x41, _x42) { return _updateParallel2.apply(this, arguments); } return _updateParallel; }() /** @private */) }, { key: "_updateMany", value: (function () { var _updateMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee19(type, records, options) { var _context30, _records, url; return _regeneratorRuntime.wrap(function _callee19$(_context31) { while (1) switch (_context31.prev = _context31.next) { case 0: if (!(records.length === 0)) { _context31.next = 2; break; } return _context31.abrupt("return", []); case 2: if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) { _context31.next = 16; break; } _context31.t0 = _concatInstanceProperty(_context30 = []); _context31.t1 = _context30; _context31.t2 = _toConsumableArray; _context31.next = 8; return this._updateMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), options); case 8: _context31.t3 = _context31.sent; _context31.t4 = (0, _context31.t2)(_context31.t3); _context31.t5 = _toConsumableArray; _context31.next = 13; return this._updateMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), options); case 13: _context31.t6 = _context31.sent; _context31.t7 = (0, _context31.t5)(_context31.t6); return _context31.abrupt("return", _context31.t0.call.call(_context31.t0, _context31.t1, _context31.t4, _context31.t7)); case 16: _records = _mapInstanceProperty(records).call(records, function (record) { var id = record.Id, rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded4); if (!id) { throw new Error('Record id is not found in record.'); } var sobjectType = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || rtype; if (!sobjectType) { throw new Error('No SObject Type defined in record'); } return _objectSpread({ id: id, attributes: { type: sobjectType } }, rec); }); url = [this._baseUrl(), 'composite', 'sobjects'].join('/'); return _context31.abrupt("return", this.request({ method: 'PATCH', url: url, body: _JSON$stringify({ allOrNone: options.allOrNone || false, records: _records }), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) })); case 19: case "end": return _context31.stop(); } }, _callee19, this); })); function _updateMany(_x43, _x44, _x45) { return _updateMany2.apply(this, arguments); } return _updateMany; }() /** * Upsert records */ ) }, { key: "upsert", value: ( /** * * @param type * @param records * @param extIdField * @param options */ function () { var _upsert = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee20(type, records, extIdField) { var options, _args20 = arguments; return _regeneratorRuntime.wrap(function _callee20$(_context32) { while (1) switch (_context32.prev = _context32.next) { case 0: options = _args20.length > 3 && _args20[3] !== undefined ? _args20[3] : {}; return _context32.abrupt("return", _Array$isArray(records) ? // check the version whether SObject collection API is supported (46.0) this._ensureVersion(46) ? this._upsertMany(type, records, extIdField, options) : this._upsertParallel(type, records, extIdField, options) : this._upsertParallel(type, records, extIdField, options)); case 2: case "end": return _context32.stop(); } }, _callee20, this); })); function upsert(_x46, _x47, _x48) { return _upsert.apply(this, arguments); } return upsert; }() /** @private */) }, { key: "_upsertMany", value: (function () { var _upsertMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee21(type, records, extIdField) { var options, _context33, _records, url, _args21 = arguments; return _regeneratorRuntime.wrap(function _callee21$(_context35) { while (1) switch (_context35.prev = _context35.next) { case 0: options = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {}; if (!(records.length === 0)) { _context35.next = 3; break; } return _context35.abrupt("return", []); case 3: if (!(records.length > MAX_DML_COUNT && options.allowRecursive)) { _context35.next = 17; break; } _context35.t0 = _concatInstanceProperty(_context33 = []); _context35.t1 = _context33; _context35.t2 = _toConsumableArray; _context35.next = 9; return this._upsertMany(type, _sliceInstanceProperty(records).call(records, 0, MAX_DML_COUNT), extIdField, options); case 9: _context35.t3 = _context35.sent; _context35.t4 = (0, _context35.t2)(_context35.t3); _context35.t5 = _toConsumableArray; _context35.next = 14; return this._upsertMany(type, _sliceInstanceProperty(records).call(records, MAX_DML_COUNT), extIdField, options); case 14: _context35.t6 = _context35.sent; _context35.t7 = (0, _context35.t5)(_context35.t6); return _context35.abrupt("return", _context35.t0.call.call(_context35.t0, _context35.t1, _context35.t4, _context35.t7)); case 17: _records = _mapInstanceProperty(records).call(records, function (recordItem) { var _context34; var extId = recordItem[extIdField], recordType = recordItem.type, attributes = recordItem.attributes, rec = _objectWithoutProperties(recordItem, _mapInstanceProperty(_context34 = [extIdField, "type", "attributes"]).call(_context34, _toPropertyKey)); var sobjectType = recordType || (attributes === null || attributes === void 0 ? void 0 : attributes.type) || type; if (!extId) { throw new Error('External ID is not found in record.'); } if (!sobjectType) { throw new Error('No SObject Type defined in record'); } return _objectSpread(_defineProperty(_defineProperty({}, extIdField, extId), "attributes", { type: sobjectType }), rec); }); url = [this._baseUrl(), 'composite', 'sobjects', type, extIdField].join('/'); return _context35.abrupt("return", this.request({ method: 'PATCH', url: url, body: _JSON$stringify({ allOrNone: options.allOrNone || false, records: _records }), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) })); case 20: case "end": return _context35.stop(); } }, _callee21, this); })); function _upsertMany(_x49, _x50, _x51) { return _upsertMany2.apply(this, arguments); } return _upsertMany; }() /** @private */) }, { key: "_upsertParallel", value: (function () { var _upsertParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee22(type, records, extIdField) { var _this7 = this; var options, isArray, _records, results, _args22 = arguments; return _regeneratorRuntime.wrap(function _callee22$(_context37) { while (1) switch (_context37.prev = _context37.next) { case 0: options = _args22.length > 3 && _args22[3] !== undefined ? _args22[3] : {}; isArray = _Array$isArray(records); _records = _Array$isArray(records) ? records : [records]; if (!(_records.length > this._maxRequest)) { _context37.next = 5; break; } throw new Error('Exceeded max limit of concurrent call'); case 5: _context37.next = 7; return _Promise.all(_mapInstanceProperty(_records).call(_records, function (record) { var _context36; var extId = record[extIdField], rtype = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _mapInstanceProperty(_context36 = [extIdField, "type", "attributes"]).call(_context36, _toPropertyKey)); var url = [_this7._baseUrl(), 'sobjects', type, extIdField, extId].join('/'); return _this7.request({ method: 'PATCH', url: url, body: _JSON$stringify(rec), headers: _objectSpread(_objectSpread({}, options.headers || {}), {}, { 'content-type': 'application/json' }) }, { noContentResponse: { success: true, errors: [] } }).catch(function (err) { // Be aware that `allOrNone` option in upsert method // will not revert the other successful requests. // It only raises error when met at least one failed request. if (!isArray || options.allOrNone || !err.errorCode) { throw err; } return toSaveResult(err); }); })); case 7: results = _context37.sent; return _context37.abrupt("return", isArray ? results : results[0]); case 9: case "end": return _context37.stop(); } }, _callee22, this); })); function _upsertParallel(_x52, _x53, _x54) { return _upsertParallel2.apply(this, arguments); } return _upsertParallel; }() /** * Delete records */ ) }, { key: "destroy", value: ( /** * @param type * @param ids * @param options */ function () { var _destroy = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee23(type, ids) { var options, _args23 = arguments; return _regeneratorRuntime.wrap(function _callee23$(_context38) { while (1) switch (_context38.prev = _context38.next) { case 0: options = _args23.length > 2 && _args23[2] !== undefined ? _args23[2] : {}; return _context38.abrupt("return", _Array$isArray(ids) ? // check the version whether SObject collection API is supported (42.0) this._ensureVersion(42) ? this._destroyMany(type, ids, options) : this._destroyParallel(type, ids, options) : this._destroySingle(type, ids, options)); case 2: case "end": return _context38.stop(); } }, _callee23, this); })); function destroy(_x55, _x56) { return _destroy.apply(this, arguments); } return destroy; }() /** @private */) }, { key: "_destroySingle", value: (function () { var _destroySingle2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee24(type, id, options) { var url; return _regeneratorRuntime.wrap(function _callee24$(_context39) { while (1) switch (_context39.prev = _context39.next) { case 0: url = [this._baseUrl(), 'sobjects', type, id].join('/'); return _context39.abrupt("return", this.request({ method: 'DELETE', url: url, headers: options.headers || {} }, { noContentResponse: { id: id, success: true, errors: [] } })); case 2: case "end": return _context39.stop(); } }, _callee24, this); })); function _destroySingle(_x57, _x58, _x59) { return _destroySingle2.apply(this, arguments); } return _destroySingle; }() /** @private */) }, { key: "_destroyParallel", value: (function () { var _destroyParallel2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee25(type, ids, options) { var _this8 = this; return _regeneratorRuntime.wrap(function _callee25$(_context40) { while (1) switch (_context40.prev = _context40.next) { case 0: if (!(ids.length > this._maxRequest)) { _context40.next = 2; break; } throw new Error('Exceeded max limit of concurrent call'); case 2: return _context40.abrupt("return", _Promise.all(_mapInstanceProperty(ids).call(ids, function (id) { return _this8._destroySingle(type, id, options).catch(function (err) { // Be aware that `allOrNone` option in parallel mode // will not revert the other successful requests. // It only raises error when met at least one failed request. if (options.allOrNone || !err.errorCode) { throw err; } return toSaveResult(err); }); }))); case 3: case "end": return _context40.stop(); } }, _callee25, this); })); function _destroyParallel(_x60, _x61, _x62) { return _destroyParallel2.apply(this, arguments); } return _destroyParallel; }() /** @private */) }, { key: "_destroyMany", value: (function () { var _destroyMany2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee26(type, ids, options) { var _context41, url; return _regeneratorRuntime.wrap(function _callee26$(_context42) { while (1) switch (_context42.prev = _context42.next) { case 0: if (!(ids.length === 0)) { _context42.next = 2; break; } return _context42.abrupt("return", []); case 2: if (!(ids.length > MAX_DML_COUNT && options.allowRecursive)) { _context42.next = 16; break; } _context42.t0 = _concatInstanceProperty(_context41 = []); _context42.t1 = _context41; _context42.t2 = _toConsumableArray; _context42.next = 8; return this._destroyMany(type, _sliceInstanceProperty(ids).call(ids, 0, MAX_DML_COUNT), options); case 8: _context42.t3 = _context42.sent; _context42.t4 = (0, _context42.t2)(_context42.t3); _context42.t5 = _toConsumableArray; _context42.next = 13; return this._destroyMany(type, _sliceInstanceProperty(ids).call(ids, MAX_DML_COUNT), options); case 13: _context42.t6 = _context42.sent; _context42.t7 = (0, _context42.t5)(_context42.t6); return _context42.abrupt("return", _context42.t0.call.call(_context42.t0, _context42.t1, _context42.t4, _context42.t7)); case 16: url = [this._baseUrl(), 'composite', 'sobjects?ids='].join('/') + ids.join(','); if (options.allOrNone) { url += '&allOrNone=true'; } return _context42.abrupt("return", this.request({ method: 'DELETE', url: url, headers: options.headers || {} })); case 19: case "end": return _context42.stop(); } }, _callee26, this); })); function _destroyMany(_x63, _x64, _x65) { return _destroyMany2.apply(this, arguments); } return _destroyMany; }()) }, { key: "describe", value: ( /** * Describe SObject metadata */ function () { var _describe = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee27(type) { var url, body; return _regeneratorRuntime.wrap(function _callee27$(_context43) { while (1) switch (_context43.prev = _context43.next) { case 0: url = [this._baseUrl(), 'sobjects', type, 'describe'].join('/'); _context43.next = 3; return this.request(url); case 3: body = _context43.sent; return _context43.abrupt("return", body); case 5: case "end": return _context43.stop(); } }, _callee27, this); })); function describe(_x66) { return _describe.apply(this, arguments); } return describe; }() /** * Describe global SObjects */ ) }, { key: "describeGlobal", value: (function () { var _describeGlobal = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee28() { var url, body; return _regeneratorRuntime.wrap(function _callee28$(_context44) { while (1) switch (_context44.prev = _context44.next) { case 0: url = "".concat(this._baseUrl(), "/sobjects"); _context44.next = 3; return this.request(url); case 3: body = _context44.sent; return _context44.abrupt("return", body); case 5: case "end": return _context44.stop(); } }, _callee28, this); })); function describeGlobal() { return _describeGlobal.apply(this, arguments); } return describeGlobal; }() /** * Get SObject instance */ ) }, { key: "sobject", value: function sobject(type) { var so = this.sobjects[type] || new SObject(this, type); this.sobjects[type] = so; return so; } /** * Get identity information of current user */ }, { key: "identity", value: (function () { var _identity = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee29() { var _this$userInfo; var options, url, _res, res, _args29 = arguments; return _regeneratorRuntime.wrap(function _callee29$(_context45) { while (1) switch (_context45.prev = _context45.next) { case 0: options = _args29.length > 0 && _args29[0] !== undefined ? _args29[0] : {}; url = (_this$userInfo = this.userInfo) === null || _this$userInfo === void 0 ? void 0 : _this$userInfo.url; if (url) { _context45.next = 7; break; } _context45.next = 5; return this.request({ method: 'GET', url: this._baseUrl(), headers: options.headers }); case 5: _res = _context45.sent; url = _res.identity; case 7: url += '?format=json'; if (this.accessToken) { url += "&oauth_token=".concat(encodeURIComponent(this.accessToken)); } _context45.next = 11; return this.request({ method: 'GET', url: url }); case 11: res = _context45.sent; this.userInfo = { id: res.user_id, organizationId: res.organization_id, url: res.id }; return _context45.abrupt("return", res); case 14: case "end": return _context45.stop(); } }, _callee29, this); })); function identity() { return _identity.apply(this, arguments); } return identity; }() /** * List recently viewed records */ ) }, { key: "recent", value: (function () { var _recent = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee30(type, limit) { var url, _yield$this$request, recentItems; return _regeneratorRuntime.wrap(function _callee30$(_context46) { while (1) switch (_context46.prev = _context46.next) { case 0: /* eslint-disable no-param-reassign */ if (typeof type === 'number') { limit = type; type = undefined; } if (!type) { _context46.next = 8; break; } url = [this._baseUrl(), 'sobjects', type].join('/'); _context46.next = 5; return this.request(url); case 5: _yield$this$request = _context46.sent; recentItems = _yield$this$request.recentItems; return _context46.abrupt("return", limit ? _sliceInstanceProperty(recentItems).call(recentItems, 0, limit) : recentItems); case 8: url = "".concat(this._baseUrl(), "/recent"); if (limit) { url += "?limit=".concat(limit); } return _context46.abrupt("return", this.request(url)); case 11: case "end": return _context46.stop(); } }, _callee30, this); })); function recent(_x67, _x68) { return _recent.apply(this, arguments); } return recent; }() /** * Retrieve updated records */ ) }, { key: "updated", value: (function () { var _updated = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee31(type, start, end) { var url, body; return _regeneratorRuntime.wrap(function _callee31$(_context47) { while (1) switch (_context47.prev = _context47.next) { case 0: /* eslint-disable no-param-reassign */ url = [this._baseUrl(), 'sobjects', type, 'updated'].join('/'); if (typeof start === 'string') { start = new Date(start); } start = formatDate(start); url += "?start=".concat(encodeURIComponent(start)); if (typeof end === 'string') { end = new Date(end); } end = formatDate(end); url += "&end=".concat(encodeURIComponent(end)); _context47.next = 9; return this.request(url); case 9: body = _context47.sent; return _context47.abrupt("return", body); case 11: case "end": return _context47.stop(); } }, _callee31, this); })); function updated(_x69, _x70, _x71) { return _updated.apply(this, arguments); } return updated; }() /** * Retrieve deleted records */ ) }, { key: "deleted", value: (function () { var _deleted = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee32(type, start, end) { var url, body; return _regeneratorRuntime.wrap(function _callee32$(_context48) { while (1) switch (_context48.prev = _context48.next) { case 0: /* eslint-disable no-param-reassign */ url = [this._baseUrl(), 'sobjects', type, 'deleted'].join('/'); if (typeof start === 'string') { start = new Date(start); } start = formatDate(start); url += "?start=".concat(encodeURIComponent(start)); if (typeof end === 'string') { end = new Date(end); } end = formatDate(end); url += "&end=".concat(encodeURIComponent(end)); _context48.next = 9; return this.request(url); case 9: body = _context48.sent; return _context48.abrupt("return", body); case 11: case "end": return _context48.stop(); } }, _callee32, this); })); function deleted(_x72, _x73, _x74) { return _deleted.apply(this, arguments); } return deleted; }() /** * Returns a list of all tabs */ ) }, { key: "tabs", value: (function () { var _tabs = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee33() { var url, body; return _regeneratorRuntime.wrap(function _callee33$(_context49) { while (1) switch (_context49.prev = _context49.next) { case 0: url = [this._baseUrl(), 'tabs'].join('/'); _context49.next = 3; return this.request(url); case 3: body = _context49.sent; return _context49.abrupt("return", body); case 5: case "end": return _context49.stop(); } }, _callee33, this); })); function tabs() { return _tabs.apply(this, arguments); } return tabs; }() /** * Returns current system limit in the organization */ ) }, { key: "limits", value: (function () { var _limits = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee34() { var url, body; return _regeneratorRuntime.wrap(function _callee34$(_context50) { while (1) switch (_context50.prev = _context50.next) { case 0: url = [this._baseUrl(), 'limits'].join('/'); _context50.next = 3; return this.request(url); case 3: body = _context50.sent; return _context50.abrupt("return", body); case 5: case "end": return _context50.stop(); } }, _callee34, this); })); function limits() { return _limits.apply(this, arguments); } return limits; }() /** * Returns a theme info */ ) }, { key: "theme", value: (function () { var _theme = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee35() { var url, body; return _regeneratorRuntime.wrap(function _callee35$(_context51) { while (1) switch (_context51.prev = _context51.next) { case 0: url = [this._baseUrl(), 'theme'].join('/'); _context51.next = 3; return this.request(url); case 3: body = _context51.sent; return _context51.abrupt("return", body); case 5: case "end": return _context51.stop(); } }, _callee35, this); })); function theme() { return _theme.apply(this, arguments); } return theme; }() /** * Returns all registered global quick actions */ ) }, { key: "quickActions", value: (function () { var _quickActions = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee36() { var body; return _regeneratorRuntime.wrap(function _callee36$(_context52) { while (1) switch (_context52.prev = _context52.next) { case 0: _context52.next = 2; return this.request('/quickActions'); case 2: body = _context52.sent; return _context52.abrupt("return", body); case 4: case "end": return _context52.stop(); } }, _callee36, this); })); function quickActions() { return _quickActions.apply(this, arguments); } return quickActions; }() /** * Get reference for specified global quick action */ ) }, { key: "quickAction", value: function quickAction(actionName) { return new QuickAction(this, "/quickActions/".concat(actionName)); } }, { key: "isLightningInstance", value: function isLightningInstance() { var _context53, _context54, _context55; return _includesInstanceProperty(_context53 = this.instanceUrl).call(_context53, '.lightning.force.com') || _includesInstanceProperty(_context54 = this.instanceUrl).call(_context54, '.lightning.crmforce.mil') || _includesInstanceProperty(_context55 = this.instanceUrl).call(_context55, '.lightning.sfcrmapps.cn'); } }]); }(EventEmitter); _defineProperty(Connection, "_logger", getLogger('connection')); export default Connection; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJqc2ZvcmNlIiwiVHJhbnNwb3J0IiwiQ2FudmFzVHJhbnNwb3J0IiwiWGRQcm94eVRyYW5zcG9ydCIsIkh0dHBQcm94eVRyYW5zcG9ydCIsImdldExvZ2dlciIsIk9BdXRoMiIsIkNhY2hlIiwiSHR0cEFwaSIsIlNlc3Npb25SZWZyZXNoRGVsZWdhdGUiLCJRdWVyeSIsIlNPYmplY3QiLCJRdWlja0FjdGlvbiIsIlByb2Nlc3MiLCJmb3JtYXREYXRlIiwiRm9ybURhdGEiLCJkZWZhdWx0Q29ubmVjdGlvbkNvbmZpZyIsImxvZ2luVXJsIiwiaW5zdGFuY2VVcmwiLCJ2ZXJzaW9uIiwibG9nTGV2ZWwiLCJtYXhSZXF1ZXN0IiwiZXNjIiwic3RyIiwiU3RyaW5nIiwicmVwbGFjZSIsInBhcnNlU2lnbmVkUmVxdWVzdCIsInNyIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiY2FsbCIsIkpTT04iLCJwYXJzZSIsIm1zZyIsInNwbGl0IiwicG9wIiwiRXJyb3IiLCJqc29uIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicGFyc2VJZFVybCIsInVybCIsIl9jb250ZXh0IiwiX3VybCRzcGxpdCRzbGljZSIsIl9zbGljZUluc3RhbmNlUHJvcGVydHkiLCJfdXJsJHNwbGl0JHNsaWNlMiIsIl9zbGljZWRUb0FycmF5Iiwib3JnYW5pemF0aW9uSWQiLCJpZCIsIm9hdXRoUmVmcmVzaEZuIiwiX3giLCJfeDIiLCJfb2F1dGhSZWZyZXNoRm4iLCJhcHBseSIsImFyZ3VtZW50cyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlMzciLCJjb25uIiwiY2FsbGJhY2siLCJyZXMiLCJ1c2VySW5mbyIsIndyYXAiLCJfY2FsbGVlMzckIiwiX2NvbnRleHQ1NiIsInByZXYiLCJuZXh0IiwicmVmcmVzaFRva2VuIiwib2F1dGgyIiwic2VudCIsIl9lc3RhYmxpc2giLCJpbnN0YW5jZV91cmwiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsInVuZGVmaW5lZCIsInQwIiwic3RvcCIsImNyZWF0ZVVzZXJuYW1lUGFzc3dvcmRSZWZyZXNoRm4iLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiX3JlZiIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0MiIsImxvZ2luIiwiX3gzIiwiX3g0IiwidG9TYXZlUmVzdWx0IiwiZXJyIiwic3VjY2VzcyIsImVycm9ycyIsInJhaXNlTm9Nb2R1bGVFcnJvciIsIm5hbWUiLCJfY29udGV4dDMiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsIk1BWF9ETUxfQ09VTlQiLCJDb25uZWN0aW9uIiwiX0V2ZW50RW1pdHRlciIsIl90aGlzIiwiY29uZmlnIiwibGVuZ3RoIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsIl9kZWZpbmVQcm9wZXJ0eSIsImNyZWF0ZSIsImRlc3Ryb3kiLCJwcm94eVVybCIsImh0dHBQcm94eSIsImlzTGlnaHRuaW5nSW5zdGFuY2UiLCJfb2JqZWN0U3ByZWFkIiwicmVmcmVzaEZuIiwiY2xpZW50SWQiLCJfcmVmcmVzaERlbGVnYXRlIiwiX21heFJlcXVlc3QiLCJfbG9nZ2VyIiwiY3JlYXRlSW5zdGFuY2UiLCJfbG9nTGV2ZWwiLCJfdHJhbnNwb3J0IiwiX2NhbGxPcHRpb25zIiwiY2FsbE9wdGlvbnMiLCJjYWNoZSIsImRlc2NyaWJlQ2FjaGVLZXkiLCJ0eXBlIiwiZGVzY3JpYmUiLCJwcm90b3R5cGUiLCJjcmVhdGVDYWNoZWRGdW5jdGlvbiIsImtleSIsInN0cmF0ZWd5IiwiZGVzY3JpYmUkIiwiZGVzY3JpYmUkJCIsImRlc2NyaWJlU09iamVjdCIsImRlc2NyaWJlU09iamVjdCQiLCJkZXNjcmliZVNPYmplY3QkJCIsImRlc2NyaWJlR2xvYmFsIiwiZGVzY3JpYmVHbG9iYWwkIiwiZGVzY3JpYmVHbG9iYWwkJCIsInNlc3Npb25JZCIsInNlcnZlclVybCIsInNpZ25lZFJlcXVlc3QiLCJlbWl0IiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwiZ2V0IiwidmFsdWUiLCJvcHRpb25zIiwiX2NvbnRleHQ0Iiwiam9pbiIsInNpZ25lZFJlcXVlc3RPYmplY3QiLCJjbGllbnQiLCJvYXV0aFRva2VuIiwic3VwcG9ydGVkIiwiX3Nlc3Npb25UeXBlIiwiX3Jlc2V0SW5zdGFuY2UiLCJfY2xlYXJTZXNzaW9uIiwiX3RoaXMyIiwibGltaXRJbmZvIiwic29iamVjdHMiLCJjbGVhciIsInJlbW92ZUFsbExpc3RlbmVycyIsIm9uIiwiX3JlZjIiLCJyZXN1bHQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwic28iLCJzb2JqZWN0IiwiZSIsImYiLCJfYXV0aG9yaXplIiwiX2NhbGxlZTIiLCJjb2RlT3JQYXJhbXMiLCJfY29udGV4dDUiLCJwYXJhbXMiLCJfYXJnczIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDYiLCJyZXF1ZXN0VG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiZGVidWciLCJhYnJ1cHQiLCJhdXRob3JpemUiLCJfeDUiLCJfbG9naW4iLCJfY2FsbGVlMyIsIl90aGlzJG9hdXRoIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQ3IiwiY2xpZW50U2VjcmV0IiwibG9naW5CeU9BdXRoMiIsImxvZ2luQnlTb2FwIiwiX3g2IiwiX3g3IiwiX2xvZ2luQnlPQXV0aCIsIl9jYWxsZWU0IiwiX2NvbnRleHQ4IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ5IiwiYXV0aGVudGljYXRlIiwiaW5mbyIsIl94OCIsIl94OSIsIl9sb2dpbkJ5U29hcCIsIl9jYWxsZWU1IiwiX2NvbnRleHQxMCIsIl9jb250ZXh0MTEiLCJib2R5Iiwic29hcExvZ2luRW5kcG9pbnQiLCJyZXNwb25zZSIsIm0iLCJmYXVsdHN0cmluZyIsInVzZXJJZCIsImlkVXJsIiwiX2NhbGxlZTUkIiwiX2NvbnRleHQxMiIsIl9Qcm9taXNlIiwicmVqZWN0IiwiaHR0cFJlcXVlc3QiLCJtZXRob2QiLCJoZWFkZXJzIiwiU09BUEFjdGlvbiIsInN0YXR1c0NvZGUiLCJtYXRjaCIsIl94MTAiLCJfeDExIiwiX2xvZ291dCIsIl9jYWxsZWU2IiwicmV2b2tlIiwiX2NhbGxlZTYkIiwiX2NvbnRleHQxMyIsImxvZ291dEJ5T0F1dGgyIiwibG9nb3V0QnlTb2FwIiwibG9nb3V0IiwiX3gxMiIsIl9sb2dvdXRCeU9BdXRoIiwiX2NhbGxlZTciLCJ0b2tlbiIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTQiLCJyZXZva2VUb2tlbiIsIl94MTMiLCJfbG9nb3V0QnlTb2FwIiwiX2NhbGxlZTgiLCJfY29udGV4dDE1IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQxNiIsIl94MTQiLCJyZXF1ZXN0IiwiX3RoaXMzIiwicmVxdWVzdF8iLCJfbm9ybWFsaXplVXJsIiwiaHR0cEFwaSIsImFwaVVzYWdlIiwidXNlZCIsIl9wYXJzZUludCIsImxpbWl0IiwicmVxdWVzdEdldCIsInJlcXVlc3RQb3N0IiwiX0pTT04kc3RyaW5naWZ5IiwicmVxdWVzdFB1dCIsInJlcXVlc3RQYXRjaCIsInJlcXVlc3REZWxldGUiLCJfYmFzZVVybCIsInF1ZXJ5Iiwic29xbCIsInNlYXJjaCIsInNvc2wiLCJlbmNvZGVVUklDb21wb25lbnQiLCJxdWVyeU1vcmUiLCJsb2NhdG9yIiwiX2Vuc3VyZVZlcnNpb24iLCJtYWpvclZlcnNpb24iLCJ2ZXJzaW9ucyIsIl9zdXBwb3J0cyIsImZlYXR1cmUiLCJfcmV0cmlldmUiLCJfY2FsbGVlOSIsImlkcyIsIl9hcmdzOSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0MTciLCJfQXJyYXkkaXNBcnJheSIsIl9yZXRyaWV2ZU1hbnkiLCJfcmV0cmlldmVQYXJhbGxlbCIsIl9yZXRyaWV2ZVNpbmdsZSIsInJldHJpZXZlIiwiX3gxNSIsIl94MTYiLCJfcmV0cmlldmVTaW5nbGUyIiwiX2NhbGxlZTEwIiwiZmllbGRzIiwiX2NhbGxlZTEwJCIsIl9jb250ZXh0MTgiLCJfeDE3IiwiX3gxOCIsIl94MTkiLCJfcmV0cmlldmVQYXJhbGxlbDIiLCJfY2FsbGVlMTEiLCJfdGhpczQiLCJfY2FsbGVlMTEkIiwiX2NvbnRleHQxOSIsImFsbCIsIl9tYXBJbnN0YW5jZVByb3BlcnR5IiwiY2F0Y2giLCJhbGxPck5vbmUiLCJlcnJvckNvZGUiLCJfeDIwIiwiX3gyMSIsIl94MjIiLCJfcmV0cmlldmVNYW55MiIsIl9jYWxsZWUxMiIsIl9jb250ZXh0MjAiLCJfY2FsbGVlMTIkIiwiX2NvbnRleHQyMSIsInQxIiwidDIiLCJmaWVsZCIsIl94MjMiLCJfeDI0IiwiX3gyNSIsIl9jcmVhdGUiLCJfY2FsbGVlMTMiLCJyZWNvcmRzIiwicmV0IiwiX2FyZ3MxMyIsIl9jYWxsZWUxMyQiLCJfY29udGV4dDIyIiwiX2NyZWF0ZU1hbnkiLCJfY3JlYXRlUGFyYWxsZWwiLCJfY3JlYXRlU2luZ2xlIiwiX3gyNiIsIl94MjciLCJfY3JlYXRlU2luZ2xlMiIsIl9jYWxsZWUxNCIsInJlY29yZCIsIklkIiwicnR5cGUiLCJhdHRyaWJ1dGVzIiwicmVjIiwic29iamVjdFR5cGUiLCJjb250ZW50VHlwZSIsIl9jb250ZXh0MjMiLCJmb3JtIiwiX2NhbGxlZTE0JCIsIl9jb250ZXh0MjQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtdWx0aXBhcnRGaWxlRmllbGRzIiwiX2ZvckVhY2hJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRlbnRyaWVzIiwiX3JlZjMiLCJfcmVmNCIsImZpZWxkTmFtZSIsImZpbGVEZXRhaWxzIiwiYXBwZW5kIiwiZ2V0SGVhZGVycyIsIl94MjgiLCJfeDI5IiwiX3gzMCIsIl9jcmVhdGVQYXJhbGxlbDIiLCJfY2FsbGVlMTUiLCJfdGhpczUiLCJfY2FsbGVlMTUkIiwiX2NvbnRleHQyNSIsIl94MzEiLCJfeDMyIiwiX3gzMyIsIl9jcmVhdGVNYW55MiIsIl9jYWxsZWUxNiIsIl9jb250ZXh0MjYiLCJfcmVjb3JkcyIsIl9jYWxsZWUxNiQiLCJfY29udGV4dDI3IiwicmVzb2x2ZSIsImFsbG93UmVjdXJzaXZlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwidDMiLCJ0NCIsInQ1IiwidDYiLCJ0NyIsIl9leGNsdWRlZDIiLCJfeDM0IiwiX3gzNSIsIl94MzYiLCJ1cGRhdGUiLCJfdXBkYXRlTWFueSIsIl91cGRhdGVQYXJhbGxlbCIsIl91cGRhdGVTaW5nbGUiLCJfdXBkYXRlU2luZ2xlMiIsIl9jYWxsZWUxNyIsIl9jYWxsZWUxNyQiLCJfY29udGV4dDI4IiwiX2V4Y2x1ZGVkMyIsIm5vQ29udGVudFJlc3BvbnNlIiwiX3gzNyIsIl94MzgiLCJfeDM5IiwiX3VwZGF0ZVBhcmFsbGVsMiIsIl9jYWxsZWUxOCIsIl90aGlzNiIsIl9jYWxsZWUxOCQiLCJfY29udGV4dDI5IiwiX3g0MCIsIl94NDEiLCJfeDQyIiwiX3VwZGF0ZU1hbnkyIiwiX2NhbGxlZTE5IiwiX2NvbnRleHQzMCIsIl9jYWxsZWUxOSQiLCJfY29udGV4dDMxIiwiX2V4Y2x1ZGVkNCIsIl94NDMiLCJfeDQ0IiwiX3g0NSIsIl91cHNlcnQiLCJfY2FsbGVlMjAiLCJleHRJZEZpZWxkIiwiX2FyZ3MyMCIsIl9jYWxsZWUyMCQiLCJfY29udGV4dDMyIiwiX3Vwc2VydE1hbnkiLCJfdXBzZXJ0UGFyYWxsZWwiLCJ1cHNlcnQiLCJfeDQ2IiwiX3g0NyIsIl94NDgiLCJfdXBzZXJ0TWFueTIiLCJfY2FsbGVlMjEiLCJfY29udGV4dDMzIiwiX2FyZ3MyMSIsIl9jYWxsZWUyMSQiLCJfY29udGV4dDM1IiwicmVjb3JkSXRlbSIsIl9jb250ZXh0MzQiLCJleHRJZCIsInJlY29yZFR5cGUiLCJfdG9Qcm9wZXJ0eUtleSIsIl94NDkiLCJfeDUwIiwiX3g1MSIsIl91cHNlcnRQYXJhbGxlbDIiLCJfY2FsbGVlMjIiLCJfdGhpczciLCJpc0FycmF5IiwicmVzdWx0cyIsIl9hcmdzMjIiLCJfY2FsbGVlMjIkIiwiX2NvbnRleHQzNyIsIl9jb250ZXh0MzYiLCJfeDUyIiwiX3g1MyIsIl94NTQiLCJfZGVzdHJveSIsIl9jYWxsZWUyMyIsIl9hcmdzMjMiLCJfY2FsbGVlMjMkIiwiX2NvbnRleHQzOCIsIl9kZXN0cm95TWFueSIsIl9kZXN0cm95UGFyYWxsZWwiLCJfZGVzdHJveVNpbmdsZSIsIl94NTUiLCJfeDU2IiwiX2Rlc3Ryb3lTaW5nbGUyIiwiX2NhbGxlZTI0IiwiX2NhbGxlZTI0JCIsIl9jb250ZXh0MzkiLCJfeDU3IiwiX3g1OCIsIl94NTkiLCJfZGVzdHJveVBhcmFsbGVsMiIsIl9jYWxsZWUyNSIsIl90aGlzOCIsIl9jYWxsZWUyNSQiLCJfY29udGV4dDQwIiwiX3g2MCIsIl94NjEiLCJfeDYyIiwiX2Rlc3Ryb3lNYW55MiIsIl9jYWxsZWUyNiIsIl9jb250ZXh0NDEiLCJfY2FsbGVlMjYkIiwiX2NvbnRleHQ0MiIsIl94NjMiLCJfeDY0IiwiX3g2NSIsIl9kZXNjcmliZSIsIl9jYWxsZWUyNyIsIl9jYWxsZWUyNyQiLCJfY29udGV4dDQzIiwiX3g2NiIsIl9kZXNjcmliZUdsb2JhbCIsIl9jYWxsZWUyOCIsIl9jYWxsZWUyOCQiLCJfY29udGV4dDQ0IiwiX2lkZW50aXR5IiwiX2NhbGxlZTI5IiwiX3RoaXMkdXNlckluZm8iLCJfcmVzIiwiX2FyZ3MyOSIsIl9jYWxsZWUyOSQiLCJfY29udGV4dDQ1IiwiaWRlbnRpdHkiLCJ1c2VyX2lkIiwib3JnYW5pemF0aW9uX2lkIiwiX3JlY2VudCIsIl9jYWxsZWUzMCIsIl95aWVsZCR0aGlzJHJlcXVlc3QiLCJyZWNlbnRJdGVtcyIsIl9jYWxsZWUzMCQiLCJfY29udGV4dDQ2IiwicmVjZW50IiwiX3g2NyIsIl94NjgiLCJfdXBkYXRlZCIsIl9jYWxsZWUzMSIsInN0YXJ0IiwiZW5kIiwiX2NhbGxlZTMxJCIsIl9jb250ZXh0NDciLCJEYXRlIiwidXBkYXRlZCIsIl94NjkiLCJfeDcwIiwiX3g3MSIsIl9kZWxldGVkIiwiX2NhbGxlZTMyIiwiX2NhbGxlZTMyJCIsIl9jb250ZXh0NDgiLCJkZWxldGVkIiwiX3g3MiIsIl94NzMiLCJfeDc0IiwiX3RhYnMiLCJfY2FsbGVlMzMiLCJfY2FsbGVlMzMkIiwiX2NvbnRleHQ0OSIsInRhYnMiLCJfbGltaXRzIiwiX2NhbGxlZTM0IiwiX2NhbGxlZTM0JCIsIl9jb250ZXh0NTAiLCJsaW1pdHMiLCJfdGhlbWUiLCJfY2FsbGVlMzUiLCJfY2FsbGVlMzUkIiwiX2NvbnRleHQ1MSIsInRoZW1lIiwiX3F1aWNrQWN0aW9ucyIsIl9jYWxsZWUzNiIsIl9jYWxsZWUzNiQiLCJfY29udGV4dDUyIiwicXVpY2tBY3Rpb25zIiwicXVpY2tBY3Rpb24iLCJhY3Rpb25OYW1lIiwiX2NvbnRleHQ1MyIsIl9jb250ZXh0NTQiLCJfY29udGV4dDU1IiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBqc2ZvcmNlIGZyb20gJy4vanNmb3JjZSc7XG5pbXBvcnQge1xuICBIdHRwUmVxdWVzdCxcbiAgSHR0cFJlc3BvbnNlLFxuICBDYWxsYmFjayxcbiAgUmVjb3JkLFxuICBTYXZlUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG4gIERlc2NyaWJlR2xvYmFsUmVzdWx0LFxuICBEZXNjcmliZVNPYmplY3RSZXN1bHQsXG4gIERlc2NyaWJlVGFiLFxuICBEZXNjcmliZVRoZW1lLFxuICBEZXNjcmliZVF1aWNrQWN0aW9uUmVzdWx0LFxuICBVcGRhdGVkUmVzdWx0LFxuICBEZWxldGVkUmVzdWx0LFxuICBTZWFyY2hSZXN1bHQsXG4gIE9yZ2FuaXphdGlvbkxpbWl0c0luZm8sXG4gIE9wdGlvbmFsLFxuICBTaWduZWRSZXF1ZXN0T2JqZWN0LFxuICBTYXZlRXJyb3IsXG4gIERtbE9wdGlvbnMsXG4gIFJldHJpZXZlT3B0aW9ucyxcbiAgU2NoZW1hLFxuICBTT2JqZWN0TmFtZXMsXG4gIFNPYmplY3RJbnB1dFJlY29yZCxcbiAgU09iamVjdFVwZGF0ZVJlY29yZCxcbiAgU09iamVjdEZpZWxkTmFtZXMsXG4gIFVzZXJJbmZvLFxuICBJZGVudGl0eUluZm8sXG4gIExpbWl0SW5mbyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTdHJlYW1Qcm9taXNlIH0gZnJvbSAnLi91dGlsL3Byb21pc2UnO1xuaW1wb3J0IFRyYW5zcG9ydCwge1xuICBDYW52YXNUcmFuc3BvcnQsXG4gIFhkUHJveHlUcmFuc3BvcnQsXG4gIEh0dHBQcm94eVRyYW5zcG9ydCxcbn0gZnJvbSAnLi90cmFuc3BvcnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBnZXRMb2dnZXIgfSBmcm9tICcuL3V0aWwvbG9nZ2VyJztcbmltcG9ydCB7IExvZ0xldmVsQ29uZmlnIH0gZnJvbSAnLi91dGlsL2xvZ2dlcic7XG5pbXBvcnQgT0F1dGgyLCB7IFRva2VuUmVzcG9uc2UgfSBmcm9tICcuL29hdXRoMic7XG5pbXBvcnQgeyBPQXV0aDJDb25maWcgfSBmcm9tICcuL29hdXRoMic7XG5pbXBvcnQgQ2FjaGUsIHsgQ2FjaGVkRnVuY3Rpb24gfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCBIdHRwQXBpIGZyb20gJy4vaHR0cC1hcGknO1xuaW1wb3J0IFNlc3Npb25SZWZyZXNoRGVsZWdhdGUsIHtcbiAgU2Vzc2lvblJlZnJlc2hGdW5jLFxufSBmcm9tICcuL3Nlc3Npb24tcmVmcmVzaC1kZWxlZ2F0ZSc7XG5pbXBvcnQgUXVlcnkgZnJvbSAnLi9xdWVyeSc7XG5pbXBvcnQgeyBRdWVyeU9wdGlvbnMgfSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCBTT2JqZWN0IGZyb20gJy4vc29iamVjdCc7XG5pbXBvcnQgUXVpY2tBY3Rpb24gZnJvbSAnLi9xdWljay1hY3Rpb24nO1xuaW1wb3J0IFByb2Nlc3MgZnJvbSAnLi9wcm9jZXNzJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuL3V0aWwvZm9ybWF0dGVyJztcbmltcG9ydCBBbmFseXRpY3MgZnJvbSAnLi9hcGkvYW5hbHl0aWNzJztcbmltcG9ydCBBcGV4IGZyb20gJy4vYXBpL2FwZXgnO1xuaW1wb3J0IHsgQnVsayB9IGZyb20gJy4vYXBpL2J1bGsnO1xuaW1wb3J0IHsgQnVsa1YyIH0gZnJvbSAnLi9hcGkvYnVsazInO1xuaW1wb3J0IENoYXR0ZXIgZnJvbSAnLi9hcGkvY2hhdHRlcic7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi9hcGkvbWV0YWRhdGEnO1xuaW1wb3J0IFNvYXBBcGkgZnJvbSAnLi9hcGkvc29hcCc7XG5pbXBvcnQgU3RyZWFtaW5nIGZyb20gJy4vYXBpL3N0cmVhbWluZyc7XG5pbXBvcnQgVG9vbGluZyBmcm9tICcuL2FwaS90b29saW5nJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuXG4vKipcbiAqIHR5cGUgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29ubmVjdGlvbkNvbmZpZzxTIGV4dGVuZHMgU2NoZW1hID0gU2NoZW1hPiA9IHtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgbG9naW5Vcmw/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGluc3RhbmNlVXJsPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHNlcnZlclVybD86IHN0cmluZztcbiAgc2lnbmVkUmVxdWVzdD86IHN0cmluZztcbiAgb2F1dGgyPzogT0F1dGgyIHwgT0F1dGgyQ29uZmlnO1xuICBtYXhSZXF1ZXN0PzogbnVtYmVyO1xuICBwcm94eVVybD86IHN0cmluZztcbiAgaHR0cFByb3h5Pzogc3RyaW5nO1xuICBsb2dMZXZlbD86IExvZ0xldmVsQ29uZmlnO1xuICBjYWxsT3B0aW9ucz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWZyZXNoRm4/OiBTZXNzaW9uUmVmcmVzaEZ1bmM8Uz47XG59O1xuXG5leHBvcnQgdHlwZSBDb25uZWN0aW9uRXN0YWJsaXNoT3B0aW9ucyA9IHtcbiAgYWNjZXNzVG9rZW4/OiBPcHRpb25hbDxzdHJpbmc+O1xuICByZWZyZXNoVG9rZW4/OiBPcHRpb25hbDxzdHJpbmc+O1xuICBpbnN0YW5jZVVybD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNlc3Npb25JZD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNlcnZlclVybD86IE9wdGlvbmFsPHN0cmluZz47XG4gIHNpZ25lZFJlcXVlc3Q/OiBPcHRpb25hbDxzdHJpbmcgfCBTaWduZWRSZXF1ZXN0T2JqZWN0PjtcbiAgdXNlckluZm8/OiBPcHRpb25hbDxVc2VySW5mbz47XG59O1xuXG4vKipcbiAqXG4gKi9cbmNvbnN0IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnOiB7XG4gIGxvZ2luVXJsOiBzdHJpbmc7XG4gIGluc3RhbmNlVXJsOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgbG9nTGV2ZWw6IExvZ0xldmVsQ29uZmlnO1xuICBtYXhSZXF1ZXN0OiBudW1iZXI7XG59ID0ge1xuICBsb2dpblVybDogJ2h0dHBzOi8vbG9naW4uc2FsZXNmb3JjZS5jb20nLFxuICBpbnN0YW5jZVVybDogJycsXG4gIHZlcnNpb246ICc1MC4wJyxcbiAgbG9nTGV2ZWw6ICdOT05FJyxcbiAgbWF4UmVxdWVzdDogMTAsXG59O1xuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGVzYyhzdHI6IE9wdGlvbmFsPHN0cmluZz4pOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKHN0ciB8fCAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBwYXJzZVNpZ25lZFJlcXVlc3Qoc3I6IHN0cmluZyB8IE9iamVjdCk6IFNpZ25lZFJlcXVlc3RPYmplY3Qge1xuICBpZiAodHlwZW9mIHNyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChzci5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgIC8vIG1pZ2h0IGJlIEpTT05cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHNyKTtcbiAgICB9IC8vIG1pZ2h0IGJlIG9yaWdpbmFsIGJhc2U2NC1lbmNvZGVkIHNpZ25lZCByZXF1ZXN0XG4gICAgY29uc3QgbXNnID0gc3Iuc3BsaXQoJy4nKS5wb3AoKTsgLy8gcmV0cmlldmUgbGF0dGVyIHBhcnRcbiAgICBpZiAoIW1zZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25lZCByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShtc2csICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuICByZXR1cm4gc3IgYXMgU2lnbmVkUmVxdWVzdE9iamVjdDtcbn1cblxuLyoqIEBwcml2YXRlICoqL1xuZnVuY3Rpb24gcGFyc2VJZFVybCh1cmw6IHN0cmluZykge1xuICBjb25zdCBbb3JnYW5pemF0aW9uSWQsIGlkXSA9IHVybC5zcGxpdCgnLycpLnNsaWNlKC0yKTtcbiAgcmV0dXJuIHsgaWQsIG9yZ2FuaXphdGlvbklkLCB1cmwgfTtcbn1cblxuLyoqXG4gKiBTZXNzaW9uIFJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24gZm9yIE9BdXRoMiBhdXRoeiBjb2RlIGZsb3dcbiAqIEBwcml2YXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9hdXRoUmVmcmVzaEZuPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBjb25uOiBDb25uZWN0aW9uPFM+LFxuICBjYWxsYmFjazogQ2FsbGJhY2s8c3RyaW5nLCBUb2tlblJlc3BvbnNlPixcbikge1xuICB0cnkge1xuICAgIGlmICghY29ubi5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiB0aGUgY29ubmVjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCBjb25uLm9hdXRoMi5yZWZyZXNoVG9rZW4oY29ubi5yZWZyZXNoVG9rZW4pO1xuICAgIGNvbnN0IHVzZXJJbmZvID0gcGFyc2VJZFVybChyZXMuaWQpO1xuICAgIGNvbm4uX2VzdGFibGlzaCh7XG4gICAgICBpbnN0YW5jZVVybDogcmVzLmluc3RhbmNlX3VybCxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgdXNlckluZm8sXG4gICAgfSk7XG4gICAgY2FsbGJhY2sodW5kZWZpbmVkLCByZXMuYWNjZXNzX3Rva2VuLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXNzaW9uIFJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24gZm9yIHVzZXJuYW1lL3Bhc3N3b3JkIGxvZ2luXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVVc2VybmFtZVBhc3N3b3JkUmVmcmVzaEZuPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBhc3luYyAoXG4gICAgY29ubjogQ29ubmVjdGlvbjxTPixcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8c3RyaW5nLCBUb2tlblJlc3BvbnNlPixcbiAgKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm4ubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgIGlmICghY29ubi5hY2Nlc3NUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY2VzcyB0b2tlbiBub3QgZm91bmQgYWZ0ZXIgbG9naW4nKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGNvbm4uYWNjZXNzVG9rZW4pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvU2F2ZVJlc3VsdChlcnI6IFNhdmVFcnJvcik6IFNhdmVSZXN1bHQge1xuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yczogW2Vycl0sXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gcmFpc2VOb01vZHVsZUVycm9yKG5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBUEkgbW9kdWxlICcke25hbWV9JyBpcyBub3QgbG9hZGVkLCBsb2FkICdqc2ZvcmNlL2FwaS8ke25hbWV9JyBleHBsaWNpdGx5YCxcbiAgKTtcbn1cblxuLypcbiAqIENvbnN0YW50IG9mIG1heGltdW0gcmVjb3JkcyBudW0gaW4gRE1MIG9wZXJhdGlvbiAodXBkYXRlL2RlbGV0ZSlcbiAqL1xuY29uc3QgTUFYX0RNTF9DT1VOVCA9IDIwMDtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbjxTIGV4dGVuZHMgU2NoZW1hID0gU2NoZW1hPiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfbG9nZ2VyID0gZ2V0TG9nZ2VyKCdjb25uZWN0aW9uJyk7XG5cbiAgdmVyc2lvbjogc3RyaW5nO1xuICBsb2dpblVybDogc3RyaW5nO1xuICBpbnN0YW5jZVVybDogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogT3B0aW9uYWw8c3RyaW5nPjtcbiAgcmVmcmVzaFRva2VuOiBPcHRpb25hbDxzdHJpbmc+O1xuICB1c2VySW5mbzogT3B0aW9uYWw8VXNlckluZm8+O1xuICBsaW1pdEluZm86IExpbWl0SW5mbyA9IHt9O1xuICBvYXV0aDI6IE9BdXRoMjtcbiAgc29iamVjdHM6IHsgW04gaW4gU09iamVjdE5hbWVzPFM+XT86IFNPYmplY3Q8UywgTj4gfSA9IHt9O1xuICBjYWNoZTogQ2FjaGU7XG4gIF9jYWxsT3B0aW9uczogT3B0aW9uYWw8eyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0+O1xuICBfbWF4UmVxdWVzdDogbnVtYmVyO1xuICBfbG9nZ2VyOiBMb2dnZXI7XG4gIF9sb2dMZXZlbDogT3B0aW9uYWw8TG9nTGV2ZWxDb25maWc+O1xuICBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG4gIF9zZXNzaW9uVHlwZTogT3B0aW9uYWw8J3NvYXAnIHwgJ29hdXRoMic+O1xuICBfcmVmcmVzaERlbGVnYXRlOiBPcHRpb25hbDxTZXNzaW9uUmVmcmVzaERlbGVnYXRlPFM+PjtcblxuICAvLyBkZXNjcmliZTogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxEZXNjcmliZVNPYmplY3RSZXN1bHQ+O1xuICBkZXNjcmliZSQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8RGVzY3JpYmVTT2JqZWN0UmVzdWx0Pj47XG4gIGRlc2NyaWJlJCQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IERlc2NyaWJlU09iamVjdFJlc3VsdD47XG4gIGRlc2NyaWJlU09iamVjdDogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxEZXNjcmliZVNPYmplY3RSZXN1bHQ+O1xuICBkZXNjcmliZVNPYmplY3QkOiBDYWNoZWRGdW5jdGlvbjxcbiAgICAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPERlc2NyaWJlU09iamVjdFJlc3VsdD5cbiAgPjtcbiAgZGVzY3JpYmVTT2JqZWN0JCQ6IENhY2hlZEZ1bmN0aW9uPChuYW1lOiBzdHJpbmcpID0+IERlc2NyaWJlU09iamVjdFJlc3VsdD47XG4gIC8vIGRlc2NyaWJlR2xvYmFsOiAoKSA9PiBQcm9taXNlPERlc2NyaWJlR2xvYmFsUmVzdWx0PjtcbiAgZGVzY3JpYmVHbG9iYWwkOiBDYWNoZWRGdW5jdGlvbjwoKSA9PiBQcm9taXNlPERlc2NyaWJlR2xvYmFsUmVzdWx0Pj47XG4gIGRlc2NyaWJlR2xvYmFsJCQ6IENhY2hlZEZ1bmN0aW9uPCgpID0+IERlc2NyaWJlR2xvYmFsUmVzdWx0PjtcblxuICAvLyBBUEkgbGlicyBhcmUgbm90IGluc3RhbnRpYXRlZCBoZXJlIHNvIHRoYXQgY29yZSBtb2R1bGUgdG8gcmVtYWluIHdpdGhvdXQgZGVwZW5kZW5jaWVzIHRvIHRoZW1cbiAgLy8gSXQgaXMgcmVzcG9uc2libGUgZm9yIGRldmVsb3BlcnMgdG8gaW1wb3J0IGFwaSBsaWJzIGV4cGxpY2l0bHkgaWYgdGhleSBhcmUgdXNpbmcgJ2pzZm9yY2UvY29yZScgaW5zdGVhZCBvZiAnanNmb3JjZScuXG4gIGdldCBhbmFseXRpY3MoKTogQW5hbHl0aWNzPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdhbmFseXRpY3MnKTtcbiAgfVxuXG4gIGdldCBhcGV4KCk6IEFwZXg8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2FwZXgnKTtcbiAgfVxuXG4gIGdldCBidWxrKCk6IEJ1bGs8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2J1bGsnKTtcbiAgfVxuXG4gIGdldCBidWxrMigpOiBCdWxrVjI8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ2J1bGsyJyk7XG4gIH1cblxuICBnZXQgY2hhdHRlcigpOiBDaGF0dGVyPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdjaGF0dGVyJyk7XG4gIH1cblxuICBnZXQgbWV0YWRhdGEoKTogTWV0YWRhdGE8Uz4ge1xuICAgIHJldHVybiByYWlzZU5vTW9kdWxlRXJyb3IoJ21ldGFkYXRhJyk7XG4gIH1cblxuICBnZXQgc29hcCgpOiBTb2FwQXBpPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCdzb2FwJyk7XG4gIH1cblxuICBnZXQgc3RyZWFtaW5nKCk6IFN0cmVhbWluZzxTPiB7XG4gICAgcmV0dXJuIHJhaXNlTm9Nb2R1bGVFcnJvcignc3RyZWFtaW5nJyk7XG4gIH1cblxuICBnZXQgdG9vbGluZygpOiBUb29saW5nPFM+IHtcbiAgICByZXR1cm4gcmFpc2VOb01vZHVsZUVycm9yKCd0b29saW5nJyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29ubmVjdGlvbkNvbmZpZzxTPiA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7XG4gICAgICBsb2dpblVybCxcbiAgICAgIGluc3RhbmNlVXJsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIG9hdXRoMixcbiAgICAgIG1heFJlcXVlc3QsXG4gICAgICBsb2dMZXZlbCxcbiAgICAgIHByb3h5VXJsLFxuICAgICAgaHR0cFByb3h5LFxuICAgIH0gPSBjb25maWc7XG4gICAgdGhpcy5sb2dpblVybCA9IGxvZ2luVXJsIHx8IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnLmxvZ2luVXJsO1xuICAgIHRoaXMuaW5zdGFuY2VVcmwgPSBpbnN0YW5jZVVybCB8fCBkZWZhdWx0Q29ubmVjdGlvbkNvbmZpZy5pbnN0YW5jZVVybDtcblxuICAgIGlmICh0aGlzLmlzTGlnaHRuaW5nSW5zdGFuY2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaWdodG5pbmcgVVJMcyBhcmUgbm90IHZhbGlkIGFzIGluc3RhbmNlIFVSTHMnKTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uIHx8IGRlZmF1bHRDb25uZWN0aW9uQ29uZmlnLnZlcnNpb247XG4gICAgdGhpcy5vYXV0aDIgPVxuICAgICAgb2F1dGgyIGluc3RhbmNlb2YgT0F1dGgyXG4gICAgICAgID8gb2F1dGgyXG4gICAgICAgIDogbmV3IE9BdXRoMih7XG4gICAgICAgICAgICBsb2dpblVybDogdGhpcy5sb2dpblVybCxcbiAgICAgICAgICAgIHByb3h5VXJsLFxuICAgICAgICAgICAgaHR0cFByb3h5LFxuICAgICAgICAgICAgLi4ub2F1dGgyLFxuICAgICAgICAgIH0pO1xuICAgIGxldCByZWZyZXNoRm4gPSBjb25maWcucmVmcmVzaEZuO1xuICAgIGlmICghcmVmcmVzaEZuICYmIHRoaXMub2F1dGgyLmNsaWVudElkKSB7XG4gICAgICByZWZyZXNoRm4gPSBvYXV0aFJlZnJlc2hGbjtcbiAgICB9XG4gICAgaWYgKHJlZnJlc2hGbikge1xuICAgICAgdGhpcy5fcmVmcmVzaERlbGVnYXRlID0gbmV3IFNlc3Npb25SZWZyZXNoRGVsZWdhdGUodGhpcywgcmVmcmVzaEZuKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4UmVxdWVzdCA9IG1heFJlcXVlc3QgfHwgZGVmYXVsdENvbm5lY3Rpb25Db25maWcubWF4UmVxdWVzdDtcbiAgICB0aGlzLl9sb2dnZXIgPSBsb2dMZXZlbFxuICAgICAgPyBDb25uZWN0aW9uLl9sb2dnZXIuY3JlYXRlSW5zdGFuY2UobG9nTGV2ZWwpXG4gICAgICA6IENvbm5lY3Rpb24uX2xvZ2dlcjtcbiAgICB0aGlzLl9sb2dMZXZlbCA9IGxvZ0xldmVsO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHByb3h5VXJsXG4gICAgICA/IG5ldyBYZFByb3h5VHJhbnNwb3J0KHByb3h5VXJsKVxuICAgICAgOiBodHRwUHJveHlcbiAgICAgID8gbmV3IEh0dHBQcm94eVRyYW5zcG9ydChodHRwUHJveHkpXG4gICAgICA6IG5ldyBUcmFuc3BvcnQoKTtcbiAgICB0aGlzLl9jYWxsT3B0aW9ucyA9IGNvbmZpZy5jYWxsT3B0aW9ucztcbiAgICB0aGlzLmNhY2hlID0gbmV3IENhY2hlKCk7XG4gICAgY29uc3QgZGVzY3JpYmVDYWNoZUtleSA9ICh0eXBlPzogc3RyaW5nKSA9PlxuICAgICAgdHlwZSA/IGBkZXNjcmliZS4ke3R5cGV9YCA6ICdkZXNjcmliZSc7XG4gICAgY29uc3QgZGVzY3JpYmUgPSBDb25uZWN0aW9uLnByb3RvdHlwZS5kZXNjcmliZTtcbiAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5jYWNoZS5jcmVhdGVDYWNoZWRGdW5jdGlvbihkZXNjcmliZSwgdGhpcywge1xuICAgICAga2V5OiBkZXNjcmliZUNhY2hlS2V5LFxuICAgICAgc3RyYXRlZ3k6ICdOT0NBQ0hFJyxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2NyaWJlJCA9IHRoaXMuY2FjaGUuY3JlYXRlQ2FjaGVkRnVuY3Rpb24oZGVzY3JpYmUsIHRoaXMsIHtcbiAgICAgIGtleTogZGVzY3JpYmVDYWNoZUtleSxcbiAgICAgIHN0cmF0ZWd5OiAnSElUJyxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2NyaWJlJCQgPSB0aGlzLmNhY2hlLmNyZWF0ZUNhY2hlZEZ1bmN0aW9uKGRlc2NyaWJlLCB0aGlzLCB7XG4gICAgICBrZXk6IGRlc2NyaWJlQ2FjaGVLZXksXG4gICAgICBzdHJhdGVneTogJ0lNTUVESUFURScsXG4gICAgfSkgYXMgYW55O1xuICAgIHRoaXMuZGVzY3JpYmVTT2JqZWN0ID0gdGhpcy5kZXNjcmliZTtcbiAgICB0aGlzLmRlc2NyaWJlU09iamVjdCQgPSB0aGlzLmRlc2NyaWJlJDtcbiAgICB0aGlzLmRlc2NyaWJlU09iamVjdCQkID0gdGhpcy5kZXNjcmliZSQkO1xuICAgIGNvbnN0IGRlc2NyaWJlR2xvYmFsID0gQ29ubmVjdGlvbi5wcm90b3R5cGUuZGVzY3JpYmVHbG9iYWw7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCA9IHRoaXMuY2FjaGUuY3JlYXRlQ2FjaGVkRnVuY3Rpb24oXG4gICAgICBkZXNjcmliZUdsb2JhbCxcbiAgICAgIHRoaXMsXG4gICAgICB7IGtleTogJ2Rlc2NyaWJlR2xvYmFsJywgc3RyYXRlZ3k6ICdOT0NBQ0hFJyB9LFxuICAgICk7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCQgPSB0aGlzLmNhY2hlLmNyZWF0ZUNhY2hlZEZ1bmN0aW9uKFxuICAgICAgZGVzY3JpYmVHbG9iYWwsXG4gICAgICB0aGlzLFxuICAgICAgeyBrZXk6ICdkZXNjcmliZUdsb2JhbCcsIHN0cmF0ZWd5OiAnSElUJyB9LFxuICAgICk7XG4gICAgdGhpcy5kZXNjcmliZUdsb2JhbCQkID0gdGhpcy5jYWNoZS5jcmVhdGVDYWNoZWRGdW5jdGlvbihcbiAgICAgIGRlc2NyaWJlR2xvYmFsLFxuICAgICAgdGhpcyxcbiAgICAgIHsga2V5OiAnZGVzY3JpYmVHbG9iYWwnLCBzdHJhdGVneTogJ0lNTUVESUFURScgfSxcbiAgICApIGFzIGFueTtcbiAgICBjb25zdCB7XG4gICAgICBhY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgfSA9IGNvbmZpZztcbiAgICB0aGlzLl9lc3RhYmxpc2goe1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW4sXG4gICAgICBpbnN0YW5jZVVybCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICBqc2ZvcmNlLmVtaXQoJ2Nvbm5lY3Rpb246bmV3JywgdGhpcyk7XG4gIH1cblxuICAvKiBAcHJpdmF0ZSAqL1xuICBfZXN0YWJsaXNoKG9wdGlvbnM6IENvbm5lY3Rpb25Fc3RhYmxpc2hPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW4sXG4gICAgICBpbnN0YW5jZVVybCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHNlcnZlclVybCxcbiAgICAgIHNpZ25lZFJlcXVlc3QsXG4gICAgICB1c2VySW5mbyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLmluc3RhbmNlVXJsID0gc2VydmVyVXJsXG4gICAgICA/IHNlcnZlclVybC5zcGxpdCgnLycpLnNsaWNlKDAsIDMpLmpvaW4oJy8nKVxuICAgICAgOiBpbnN0YW5jZVVybCB8fCB0aGlzLmluc3RhbmNlVXJsO1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzZXNzaW9uSWQgfHwgYWNjZXNzVG9rZW4gfHwgdGhpcy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbiB8fCB0aGlzLnJlZnJlc2hUb2tlbjtcbiAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4gJiYgIXRoaXMuX3JlZnJlc2hEZWxlZ2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVmcmVzaCB0b2tlbiBpcyBzcGVjaWZpZWQgd2l0aG91dCBvYXV0aDIgY2xpZW50IGluZm9ybWF0aW9uIG9yIHJlZnJlc2ggZnVuY3Rpb24nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVkUmVxdWVzdE9iamVjdCA9XG4gICAgICBzaWduZWRSZXF1ZXN0ICYmIHBhcnNlU2lnbmVkUmVxdWVzdChzaWduZWRSZXF1ZXN0KTtcbiAgICBpZiAoc2lnbmVkUmVxdWVzdE9iamVjdCkge1xuICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHNpZ25lZFJlcXVlc3RPYmplY3QuY2xpZW50Lm9hdXRoVG9rZW47XG4gICAgICBpZiAoQ2FudmFzVHJhbnNwb3J0LnN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgQ2FudmFzVHJhbnNwb3J0KHNpZ25lZFJlcXVlc3RPYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVzZXJJbmZvID0gdXNlckluZm8gfHwgdGhpcy51c2VySW5mbztcbiAgICB0aGlzLl9zZXNzaW9uVHlwZSA9IHNlc3Npb25JZCA/ICdzb2FwJyA6ICdvYXV0aDInO1xuICAgIHRoaXMuX3Jlc2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qIEBwcml2ZWF0ZSAqL1xuICBfY2xlYXJTZXNzaW9uKCkge1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbmNlVXJsID0gZGVmYXVsdENvbm5lY3Rpb25Db25maWcuaW5zdGFuY2VVcmw7XG4gICAgdGhpcy51c2VySW5mbyA9IG51bGw7XG4gICAgdGhpcy5fc2Vzc2lvblR5cGUgPSBudWxsO1xuICB9XG5cbiAgLyogQHByaXZlYXRlICovXG4gIF9yZXNldEluc3RhbmNlKCkge1xuICAgIHRoaXMubGltaXRJbmZvID0ge307XG4gICAgdGhpcy5zb2JqZWN0cyA9IHt9O1xuICAgIC8vIFRPRE8gaW1wbCBjYWNoZVxuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmNhY2hlLmdldCgnZGVzY3JpYmVHbG9iYWwnKS5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3ZhbHVlJyk7XG4gICAgdGhpcy5jYWNoZS5nZXQoJ2Rlc2NyaWJlR2xvYmFsJykub24oJ3ZhbHVlJywgKHsgcmVzdWx0IH0pID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBzbyBvZiByZXN1bHQuc29iamVjdHMpIHtcbiAgICAgICAgICB0aGlzLnNvYmplY3Qoc28ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKlxuICAgIGlmICh0aGlzLnRvb2xpbmcpIHtcbiAgICAgIHRoaXMudG9vbGluZy5fcmVzZXRJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAqL1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZSB0aGUgY29ubmVjdGlvbiB1c2luZyBPQXV0aDIgZmxvdy5cbiAgICogVHlwaWNhbGx5LCBqdXN0IHBhc3MgdGhlIGNvZGUgcmV0dXJuZWQgZnJvbSBhdXRob3JpemF0aW9uIHNlcnZlciBpbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY29tcGxldGUgYXV0aG9yaXphdGlvbi5cbiAgICogSWYgeW91IHdhbnQgdG8gYXV0aG9yaXplIHdpdGggZ3JhbnQgdHlwZXMgb3RoZXIgdGhhbiBgYXV0aG9yaXphdGlvbl9jb2RlYCwgeW91IGNhbiBhbHNvIHBhc3MgcGFyYW1zIG9iamVjdCB3aXRoIHRoZSBncmFudCB0eXBlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVc2VySW5mbz59IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyIElELCBvcmcgSUQgYW5kIGlkZW50aXR5IFVSTC5cbiAgICpcbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZShcbiAgICBjb2RlT3JQYXJhbXM6IHN0cmluZyB8IHsgZ3JhbnRfdHlwZTogc3RyaW5nOyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgcGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFVzZXJJbmZvPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aDIucmVxdWVzdFRva2VuKGNvZGVPclBhcmFtcywgcGFyYW1zKTtcbiAgICBjb25zdCB1c2VySW5mbyA9IHBhcnNlSWRVcmwocmVzLmlkKTtcbiAgICB0aGlzLl9lc3RhYmxpc2goe1xuICAgICAgaW5zdGFuY2VVcmw6IHJlcy5pbnN0YW5jZV91cmwsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVzLmFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzLnJlZnJlc2hfdG9rZW4sXG4gICAgICB1c2VySW5mbyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoXG4gICAgICBgPGxvZ2luPiBjb21wbGV0ZWQuIHVzZXIgaWQgPSAke3VzZXJJbmZvLmlkfSwgb3JnIGlkID0gJHt1c2VySW5mby5vcmdhbml6YXRpb25JZH1gLFxuICAgICk7XG4gICAgcmV0dXJuIHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIHRoaXMuX3JlZnJlc2hEZWxlZ2F0ZSA9IG5ldyBTZXNzaW9uUmVmcmVzaERlbGVnYXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGNyZWF0ZVVzZXJuYW1lUGFzc3dvcmRSZWZyZXNoRm4odXNlcm5hbWUsIHBhc3N3b3JkKSxcbiAgICApO1xuICAgIGlmICh0aGlzLm9hdXRoMj8uY2xpZW50SWQgJiYgdGhpcy5vYXV0aDIuY2xpZW50U2VjcmV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2dpbkJ5T0F1dGgyKHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvZ2luQnlTb2FwKHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gYnkgT0F1dGgyIHVzZXJuYW1lICYgcGFzc3dvcmQgZmxvd1xuICAgKi9cbiAgYXN5bmMgbG9naW5CeU9BdXRoMih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub2F1dGgyLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IHVzZXJJbmZvID0gcGFyc2VJZFVybChyZXMuaWQpO1xuICAgIHRoaXMuX2VzdGFibGlzaCh7XG4gICAgICBpbnN0YW5jZVVybDogcmVzLmluc3RhbmNlX3VybCxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgdXNlckluZm8sXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oXG4gICAgICBgPGxvZ2luPiBjb21wbGV0ZWQuIHVzZXIgaWQgPSAke3VzZXJJbmZvLmlkfSwgb3JnIGlkID0gJHt1c2VySW5mby5vcmdhbml6YXRpb25JZH1gLFxuICAgICk7XG4gICAgcmV0dXJuIHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBhc3luYyBsb2dpbkJ5U29hcCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdubyB1c2VybmFtZSBwYXNzd29yZCBnaXZlbicpKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgICc8c2U6RW52ZWxvcGUgeG1sbnM6c2U9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPicsXG4gICAgICAnPHNlOkhlYWRlci8+JyxcbiAgICAgICc8c2U6Qm9keT4nLFxuICAgICAgJzxsb2dpbiB4bWxucz1cInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiPicsXG4gICAgICBgPHVzZXJuYW1lPiR7ZXNjKHVzZXJuYW1lKX08L3VzZXJuYW1lPmAsXG4gICAgICBgPHBhc3N3b3JkPiR7ZXNjKHBhc3N3b3JkKX08L3Bhc3N3b3JkPmAsXG4gICAgICAnPC9sb2dpbj4nLFxuICAgICAgJzwvc2U6Qm9keT4nLFxuICAgICAgJzwvc2U6RW52ZWxvcGU+JyxcbiAgICBdLmpvaW4oJycpO1xuXG4gICAgY29uc3Qgc29hcExvZ2luRW5kcG9pbnQgPSBbXG4gICAgICB0aGlzLmxvZ2luVXJsLFxuICAgICAgJ3NlcnZpY2VzL1NvYXAvdScsXG4gICAgICB0aGlzLnZlcnNpb24sXG4gICAgXS5qb2luKCcvJyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl90cmFuc3BvcnQuaHR0cFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6IHNvYXBMb2dpbkVuZHBvaW50LFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIFNPQVBBY3Rpb246ICdcIlwiJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbGV0IG07XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICBtID0gcmVzcG9uc2UuYm9keS5tYXRjaCgvPGZhdWx0c3RyaW5nPihbXjxdKyk8XFwvZmF1bHRzdHJpbmc+Lyk7XG4gICAgICBjb25zdCBmYXVsdHN0cmluZyA9IG0gJiYgbVsxXTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihmYXVsdHN0cmluZyB8fCByZXNwb25zZS5ib2R5KTtcbiAgICB9XG4gICAgLy8gdGhlIEFQSSB3aWxsIHJldHVybiAyMDAgYW5kIGEgcmVzdHJpY2VkIHRva2VuIHdoZW4gdXNpbmcgYW4gZXhwaXJlZCBwYXNzd29yZDpcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5zYWxlc2ZvcmNlLmNvbS9kb2NzL2F0bGFzLmVuLXVzLmFwaS5tZXRhL2FwaS9zZm9yY2VfYXBpX2NhbGxzX2xvZ2luX2xvZ2lucmVzdWx0Lmh0bVxuICAgIC8vXG4gICAgLy8gd2UgbmVlZCB0byB0aHJvdyBoZXJlIHRvIGF2b2lkIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcCB3aXRoIHNlc3Npb24gcmVmcmVzaCB3aGVyZTpcbiAgICAvLyAgMS4gbG9naW4gaGFwcGVucywgYHRoaXMuYWNjZXNzVG9rZW5gIGlzIHNldCB0byB0aGUgcmVzdHJpY3RlZCB0b2tlblxuICAgIC8vICAyLiByZXF1ZXN0cyBoYXBwZW4sIGdldCBiYWNrIDQwMVxuICAgIC8vICAzLiB0cmlnZ2VyIHNlc3Npb24tcmVmcmVzaCAodXNlcm5hbWUvcGFzc3dvcmQgbG9naW4gaGFzIGEgZGVmYXVsdCBzZXNzaW9uIHJlZnJlc2ggZGVsZWdhdGUgZnVuY3Rpb24pXG4gICAgLy8gIDQuIGdldHMgc3R1Y2sgcmVmcmVzaGluZyBhIHJlc3RyaWN0ZWQgdG9rZW5cbiAgICBpZiAocmVzcG9uc2UuYm9keS5tYXRjaCgvPHBhc3N3b3JkRXhwaXJlZD50cnVlPFxcL3Bhc3N3b3JkRXhwaXJlZD4vZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvZ2luIGJlY2F1c2UgdGhlIHVzZWQgcGFzc3dvcmQgaGFzIGV4cGlyZWQuJylcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKGBTT0FQIHJlc3BvbnNlID0gJHtyZXNwb25zZS5ib2R5fWApO1xuICAgIG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88c2VydmVyVXJsPihbXjxdKyk8XFwvc2VydmVyVXJsPi8pO1xuICAgIGNvbnN0IHNlcnZlclVybCA9IG0gJiYgbVsxXTtcbiAgICBtID0gcmVzcG9uc2UuYm9keS5tYXRjaCgvPHNlc3Npb25JZD4oW148XSspPFxcL3Nlc3Npb25JZD4vKTtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBtICYmIG1bMV07XG4gICAgbSA9IHJlc3BvbnNlLmJvZHkubWF0Y2goLzx1c2VySWQ+KFtePF0rKTxcXC91c2VySWQ+Lyk7XG4gICAgY29uc3QgdXNlcklkID0gbSAmJiBtWzFdO1xuICAgIG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88b3JnYW5pemF0aW9uSWQ+KFtePF0rKTxcXC9vcmdhbml6YXRpb25JZD4vKTtcbiAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IG0gJiYgbVsxXTtcbiAgICBpZiAoIXNlcnZlclVybCB8fCAhc2Vzc2lvbklkIHx8ICF1c2VySWQgfHwgIW9yZ2FuaXphdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjb3VsZCBub3QgZXh0cmFjdCBzZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gbG9naW4gcmVzcG9uc2UnLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaWRVcmwgPSBbdGhpcy5sb2dpblVybCwgJ2lkJywgb3JnYW5pemF0aW9uSWQsIHVzZXJJZF0uam9pbignLycpO1xuICAgIGNvbnN0IHVzZXJJbmZvID0geyBpZDogdXNlcklkLCBvcmdhbml6YXRpb25JZCwgdXJsOiBpZFVybCB9O1xuICAgIHRoaXMuX2VzdGFibGlzaCh7XG4gICAgICBzZXJ2ZXJVcmw6IHNlcnZlclVybC5zcGxpdCgnLycpLnNsaWNlKDAsIDMpLmpvaW4oJy8nKSxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJJbmZvLFxuICAgIH0pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFxuICAgICAgYDxsb2dpbj4gY29tcGxldGVkLiB1c2VyIGlkID0gJHt1c2VySWR9LCBvcmcgaWQgPSAke29yZ2FuaXphdGlvbklkfWAsXG4gICAgKTtcbiAgICByZXR1cm4gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGxvZ291dChyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fcmVmcmVzaERlbGVnYXRlID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9zZXNzaW9uVHlwZSA9PT0gJ29hdXRoMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvZ291dEJ5T0F1dGgyKHJldm9rZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvZ291dEJ5U29hcChyZXZva2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCB0aGUgY3VycmVudCBzZXNzaW9uIGJ5IHJldm9raW5nIGFjY2VzcyB0b2tlbiB2aWEgT0F1dGgyIHNlc3Npb24gcmV2b2tlXG4gICAqL1xuICBhc3luYyBsb2dvdXRCeU9BdXRoMihyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSByZXZva2UgPyB0aGlzLnJlZnJlc2hUb2tlbiA6IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoMi5yZXZva2VUb2tlbih0b2tlbik7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgdGhlIHNlc3Npb24gYm91bmQgdG8gdGhpcyBjb25uZWN0aW9uXG4gICAgdGhpcy5fY2xlYXJTZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCB0aGUgc2Vzc2lvbiBieSB1c2luZyBTT0FQIHdlYiBzZXJ2aWNlIEFQSVxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QnlTb2FwKHJldm9rZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBib2R5ID0gW1xuICAgICAgJzxzZTpFbnZlbG9wZSB4bWxuczpzZT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+JyxcbiAgICAgICc8c2U6SGVhZGVyPicsXG4gICAgICAnPFNlc3Npb25IZWFkZXIgeG1sbnM9XCJ1cm46cGFydG5lci5zb2FwLnNmb3JjZS5jb21cIj4nLFxuICAgICAgYDxzZXNzaW9uSWQ+JHtlc2MoXG4gICAgICAgIHJldm9rZSA/IHRoaXMucmVmcmVzaFRva2VuIDogdGhpcy5hY2Nlc3NUb2tlbixcbiAgICAgICl9PC9zZXNzaW9uSWQ+YCxcbiAgICAgICc8L1Nlc3Npb25IZWFkZXI+JyxcbiAgICAgICc8L3NlOkhlYWRlcj4nLFxuICAgICAgJzxzZTpCb2R5PicsXG4gICAgICAnPGxvZ291dCB4bWxucz1cInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiLz4nLFxuICAgICAgJzwvc2U6Qm9keT4nLFxuICAgICAgJzwvc2U6RW52ZWxvcGU+JyxcbiAgICBdLmpvaW4oJycpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fdHJhbnNwb3J0Lmh0dHBSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiBbdGhpcy5pbnN0YW5jZVVybCwgJ3NlcnZpY2VzL1NvYXAvdScsIHRoaXMudmVyc2lvbl0uam9pbignLycpLFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIFNPQVBBY3Rpb246ICdcIlwiJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFxuICAgICAgYFNPQVAgc3RhdHVzQ29kZSA9ICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0sIHJlc3BvbnNlID0gJHtyZXNwb25zZS5ib2R5fWAsXG4gICAgKTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgIGNvbnN0IG0gPSByZXNwb25zZS5ib2R5Lm1hdGNoKC88ZmF1bHRzdHJpbmc+KFtePF0rKTxcXC9mYXVsdHN0cmluZz4vKTtcbiAgICAgIGNvbnN0IGZhdWx0c3RyaW5nID0gbSAmJiBtWzFdO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZhdWx0c3RyaW5nIHx8IHJlc3BvbnNlLmJvZHkpO1xuICAgIH1cbiAgICAvLyBEZXN0cm95IHRoZSBzZXNzaW9uIGJvdW5kIHRvIHRoaXMgY29ubmVjdGlvblxuICAgIHRoaXMuX2NsZWFyU2Vzc2lvbigpO1xuICAgIHRoaXMuX3Jlc2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIFJFU1QgQVBJIHJlcXVlc3Qgd2l0aCBnaXZlbiBIVFRQIHJlcXVlc3QgaW5mbywgd2l0aCBjb25uZWN0ZWQgc2Vzc2lvbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogRW5kcG9pbnQgVVJMIGNhbiBiZSBhYnNvbHV0ZSBVUkwgKCdodHRwczovL25hMS5zYWxlc2ZvcmNlLmNvbS9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIHJlbGF0aXZlIHBhdGggZnJvbSByb290ICgnL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgb3IgcmVsYXRpdmUgcGF0aCBmcm9tIHZlcnNpb24gcm9vdCAoJy9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJykuXG4gICAqL1xuICByZXF1ZXN0PFIgPSB1bmtub3duPihcbiAgICByZXF1ZXN0OiBzdHJpbmcgfCBIdHRwUmVxdWVzdCxcbiAgICBvcHRpb25zOiBPYmplY3QgPSB7fSxcbiAgKTogU3RyZWFtUHJvbWlzZTxSPiB7XG4gICAgLy8gaWYgcmVxdWVzdCBpcyBzaW1wbGUgc3RyaW5nLCByZWdhcmQgaXQgYXMgdXJsIGluIEdFVCBtZXRob2RcbiAgICBsZXQgcmVxdWVzdF86IEh0dHBSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJyA/IHsgbWV0aG9kOiAnR0VUJywgdXJsOiByZXF1ZXN0IH0gOiByZXF1ZXN0O1xuICAgIC8vIGlmIHVybCBpcyBnaXZlbiBpbiByZWxhdGl2ZSBwYXRoLCBwcmVwZW5kIGJhc2UgdXJsIG9yIGluc3RhbmNlIHVybCBiZWZvcmUuXG4gICAgcmVxdWVzdF8gPSB7XG4gICAgICAuLi5yZXF1ZXN0XyxcbiAgICAgIHVybDogdGhpcy5fbm9ybWFsaXplVXJsKHJlcXVlc3RfLnVybCksXG4gICAgfTtcbiAgICBjb25zdCBodHRwQXBpID0gbmV3IEh0dHBBcGkodGhpcywgb3B0aW9ucyk7XG4gICAgLy8gbG9nIGFwaSB1c2FnZSBhbmQgaXRzIHF1b3RhXG4gICAgaHR0cEFwaS5vbigncmVzcG9uc2UnLCAocmVzcG9uc2U6IEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1snc2ZvcmNlLWxpbWl0LWluZm8nXSkge1xuICAgICAgICBjb25zdCBhcGlVc2FnZSA9IHJlc3BvbnNlLmhlYWRlcnNbJ3Nmb3JjZS1saW1pdC1pbmZvJ10ubWF0Y2goXG4gICAgICAgICAgL2FwaS11c2FnZT0oXFxkKylcXC8oXFxkKykvLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYXBpVXNhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxpbWl0SW5mbyA9IHtcbiAgICAgICAgICAgIGFwaVVzYWdlOiB7XG4gICAgICAgICAgICAgIHVzZWQ6IHBhcnNlSW50KGFwaVVzYWdlWzFdLCAxMCksXG4gICAgICAgICAgICAgIGxpbWl0OiBwYXJzZUludChhcGlVc2FnZVsyXSwgMTApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGh0dHBBcGkucmVxdWVzdDxSPihyZXF1ZXN0Xyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIEdFVCByZXF1ZXN0XG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdEdldDxSID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHsgbWV0aG9kOiAnR0VUJywgdXJsIH07XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxSPihyZXF1ZXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIEhUVFAgUE9TVCByZXF1ZXN0IHdpdGggSlNPTiBib2R5LCB3aXRoIGNvbm5lY3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdFBvc3Q8UiA9IHVua25vd24+KHVybDogc3RyaW5nLCBib2R5OiBPYmplY3QsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Uj4ocmVxdWVzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIFBVVCByZXF1ZXN0IHdpdGggSlNPTiBib2R5LCB3aXRoIGNvbm5lY3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IFVSTCBjYW4gYmUgYWJzb2x1dGUgVVJMICgnaHR0cHM6Ly9uYTEuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCByZWxhdGl2ZSBwYXRoIGZyb20gcm9vdCAoJy9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB2ZXJzaW9uIHJvb3QgKCcvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpLlxuICAgKi9cbiAgcmVxdWVzdFB1dDxSPih1cmw6IHN0cmluZywgYm9keTogT2JqZWN0LCBvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgY29uc3QgcmVxdWVzdDogSHR0cFJlcXVlc3QgPSB7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Uj4ocmVxdWVzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBIVFRQIFBBVENIIHJlcXVlc3Qgd2l0aCBKU09OIGJvZHlcbiAgICpcbiAgICogRW5kcG9pbnQgVVJMIGNhbiBiZSBhYnNvbHV0ZSBVUkwgKCdodHRwczovL25hMS5zYWxlc2ZvcmNlLmNvbS9zZXJ2aWNlcy9kYXRhL3YzMi4wL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKVxuICAgKiAsIHJlbGF0aXZlIHBhdGggZnJvbSByb290ICgnL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgb3IgcmVsYXRpdmUgcGF0aCBmcm9tIHZlcnNpb24gcm9vdCAoJy9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJykuXG4gICAqL1xuICByZXF1ZXN0UGF0Y2g8UiA9IHVua25vd24+KHVybDogc3RyaW5nLCBib2R5OiBPYmplY3QsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHVybCxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFI+KHJlcXVlc3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgSFRUUCBERUxFVEUgcmVxdWVzdFxuICAgKlxuICAgKiBFbmRwb2ludCBVUkwgY2FuIGJlIGFic29sdXRlIFVSTCAoJ2h0dHBzOi8vbmExLnNhbGVzZm9yY2UuY29tL3NlcnZpY2VzL2RhdGEvdjMyLjAvc29iamVjdHMvQWNjb3VudC9kZXNjcmliZScpXG4gICAqICwgcmVsYXRpdmUgcGF0aCBmcm9tIHJvb3QgKCcvc2VydmljZXMvZGF0YS92MzIuMC9zb2JqZWN0cy9BY2NvdW50L2Rlc2NyaWJlJylcbiAgICogLCBvciByZWxhdGl2ZSBwYXRoIGZyb20gdmVyc2lvbiByb290ICgnL3NvYmplY3RzL0FjY291bnQvZGVzY3JpYmUnKS5cbiAgICovXG4gIHJlcXVlc3REZWxldGU8Uj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICBjb25zdCByZXF1ZXN0OiBIdHRwUmVxdWVzdCA9IHsgbWV0aG9kOiAnREVMRVRFJywgdXJsIH07XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxSPihyZXF1ZXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqKi9cbiAgX2Jhc2VVcmwoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmluc3RhbmNlVXJsLCAnc2VydmljZXMvZGF0YScsIGB2JHt0aGlzLnZlcnNpb259YF0uam9pbignLycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgcGF0aCB0byBhYnNvbHV0ZSB1cmxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ub3JtYWxpemVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHRoaXMuaW5zdGFuY2VVcmwgKyAnL3NlcnZpY2VzLycpKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgICB9XG4gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy9zZXJ2aWNlcy8nKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZVVybCArIHVybDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9iYXNlVXJsKCkgKyB1cmw7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHF1ZXJ5PFQgZXh0ZW5kcyBSZWNvcmQ+KFxuICAgIHNvcWw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxRdWVyeU9wdGlvbnM+LFxuICApOiBRdWVyeTxTLCBTT2JqZWN0TmFtZXM8Uz4sIFQsICdRdWVyeVJlc3VsdCc+IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5PFMsIFNPYmplY3ROYW1lczxTPiwgVCwgJ1F1ZXJ5UmVzdWx0Jz4odGhpcywgc29xbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBzZWFyY2ggYnkgU09TTFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc29zbCAtIFNPU0wgc3RyaW5nXG4gICAqIEBwYXJhbSB7Q2FsbGJhY2suPEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlLjxBcnJheS48UmVjb3JkUmVzdWx0Pj59XG4gICAqL1xuICBzZWFyY2goc29zbDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5fYmFzZVVybCgpICsgJy9zZWFyY2g/cT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNvc2wpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8U2VhcmNoUmVzdWx0Pih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBxdWVyeU1vcmU8VCBleHRlbmRzIFJlY29yZD4obG9jYXRvcjogc3RyaW5nLCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeTxTLCBTT2JqZWN0TmFtZXM8Uz4sIFQsICdRdWVyeVJlc3VsdCc+KFxuICAgICAgdGhpcyxcbiAgICAgIHsgbG9jYXRvciB9LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyogKi9cbiAgX2Vuc3VyZVZlcnNpb24obWFqb3JWZXJzaW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IHRoaXMudmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwYXJzZUludCh2ZXJzaW9uc1swXSwgMTApID49IG1ham9yVmVyc2lvbjtcbiAgfVxuXG4gIC8qICovXG4gIF9zdXBwb3J0cyhmZWF0dXJlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgIGNhc2UgJ3NvYmplY3QtY29sbGVjdGlvbic6IC8vIHNvYmplY3QgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgb25seSBpbiBBUEkgdmVyIDQyLjArXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgc3BlY2lmaWVkIHJlY29yZHNcbiAgICovXG4gIHJldHJpZXZlPE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJldHJpZXZlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ+O1xuICByZXRyaWV2ZTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IFJldHJpZXZlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmRbXT47XG4gIHJldHJpZXZlPE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUmV0cmlldmVPcHRpb25zLFxuICApOiBQcm9taXNlPFJlY29yZCB8IFJlY29yZFtdPjtcbiAgYXN5bmMgcmV0cmlldmUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgb3B0aW9uczogUmV0cmlldmVPcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlkcylcbiAgICAgID8gLy8gY2hlY2sgdGhlIHZlcnNpb24gd2hldGhlciBTT2JqZWN0IGNvbGxlY3Rpb24gQVBJIGlzIHN1cHBvcnRlZCAoNDIuMClcbiAgICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0MilcbiAgICAgICAgPyB0aGlzLl9yZXRyaWV2ZU1hbnkodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgICA6IHRoaXMuX3JldHJpZXZlUGFyYWxsZWwodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl9yZXRyaWV2ZVNpbmdsZSh0eXBlLCBpZHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9yZXRyaWV2ZVNpbmdsZSh0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJpZXZlT3B0aW9ucykge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZWNvcmQgSUQuIFNwZWNpZnkgdmFsaWQgcmVjb3JkIElEIHZhbHVlJyk7XG4gICAgfVxuICAgIGxldCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCBpZF0uam9pbignLycpO1xuICAgIGNvbnN0IHsgZmllbGRzLCBoZWFkZXJzIH0gPSBvcHRpb25zO1xuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIHVybCArPSBgP2ZpZWxkcz0ke2ZpZWxkcy5qb2luKCcsJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7IG1ldGhvZDogJ0dFVCcsIHVybCwgaGVhZGVycyB9KTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfcmV0cmlldmVQYXJhbGxlbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zOiBSZXRyaWV2ZU9wdGlvbnMsXG4gICkge1xuICAgIGlmIChpZHMubGVuZ3RoID4gdGhpcy5fbWF4UmVxdWVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXggbGltaXQgb2YgY29uY3VycmVudCBjYWxsJyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkcy5tYXAoKGlkKSA9PlxuICAgICAgICB0aGlzLl9yZXRyaWV2ZVNpbmdsZSh0eXBlLCBpZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCBlcnIuZXJyb3JDb2RlICE9PSAnTk9UX0ZPVU5EJykge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX3JldHJpZXZlTWFueSh0eXBlOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIG9wdGlvbnM6IFJldHJpZXZlT3B0aW9ucykge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdjb21wb3NpdGUnLCAnc29iamVjdHMnLCB0eXBlXS5qb2luKCcvJyk7XG4gICAgY29uc3QgZmllbGRzID1cbiAgICAgIG9wdGlvbnMuZmllbGRzIHx8XG4gICAgICAoYXdhaXQgdGhpcy5kZXNjcmliZSQodHlwZSkpLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZHMsIGZpZWxkcyB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSByZWNvcmRzXG4gICAqL1xuICBjcmVhdGU8XG4gICAgTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgICBJbnB1dFJlY29yZCBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPiA9IFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPlxuICA+KFxuICAgIHR5cGU6IE4sXG4gICAgcmVjb3JkczogSW5wdXRSZWNvcmRbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICBjcmVhdGU8XG4gICAgTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgICBJbnB1dFJlY29yZCBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPiA9IFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPlxuICA+KHR5cGU6IE4sIHJlY29yZDogSW5wdXRSZWNvcmQsIG9wdGlvbnM/OiBEbWxPcHRpb25zKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgY3JlYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkIHwgSW5wdXRSZWNvcmRbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPjtcbiAgLyoqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByZWNvcmRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgcmV0ID0gQXJyYXkuaXNBcnJheShyZWNvcmRzKVxuICAgICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Mi4wKVxuICAgICAgICB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKVxuICAgICAgICA/IGF3YWl0IHRoaXMuX2NyZWF0ZU1hbnkodHlwZSwgcmVjb3Jkcywgb3B0aW9ucylcbiAgICAgICAgOiBhd2FpdCB0aGlzLl9jcmVhdGVQYXJhbGxlbCh0eXBlLCByZWNvcmRzLCBvcHRpb25zKVxuICAgICAgOiBhd2FpdCB0aGlzLl9jcmVhdGVTaW5nbGUodHlwZSwgcmVjb3Jkcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfY3JlYXRlU2luZ2xlKHR5cGU6IHN0cmluZywgcmVjb3JkOiBSZWNvcmQsIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IElkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgY29uc3Qgc29iamVjdFR5cGUgPSB0eXBlIHx8IGF0dHJpYnV0ZXM/LnR5cGUgfHwgcnR5cGU7XG4gICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgc29iamVjdFR5cGVdLmpvaW4oJy8nKTtcbiAgICBsZXQgY29udGVudFR5cGUsIGJvZHk7XG5cbiAgICBpZiAob3B0aW9ucz8ubXVsdGlwYXJ0RmlsZUZpZWxkcykge1xuICAgICAgLy8gU2VuZCB0aGUgcmVjb3JkIGFzIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0LiBVc2VmdWwgZm9yIGZpZWxkcyBjb250YWluaW5nIGxhcmdlIGJpbmFyeSBibG9icy5cbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIGZpZWxkcyByZXF1ZXN0ZWQgdG8gYmUgc2VudCBzZXBhcmF0ZWx5IGZyb20gdGhlIEpTT05cbiAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMubXVsdGlwYXJ0RmlsZUZpZWxkcykuZm9yRWFjaChcbiAgICAgICAgKFtmaWVsZE5hbWUsIGZpbGVEZXRhaWxzXSkgPT4ge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKFxuICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20ocmVjW2ZpZWxkTmFtZV0sICdiYXNlNjQnKSxcbiAgICAgICAgICAgIGZpbGVEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZGVsZXRlIHJlY1tmaWVsZE5hbWVdO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBhcyBKU09OXG4gICAgICBmb3JtLmFwcGVuZCh0eXBlLCBKU09OLnN0cmluZ2lmeShyZWMpLCB7XG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KTtcbiAgICAgIGNvbnRlbnRUeXBlID0gZm9ybS5nZXRIZWFkZXJzKClbJ2NvbnRlbnQtdHlwZSddOyAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlICdib3VuZGFyeScgaXMgcHJlc2VudFxuICAgICAgYm9keSA9IGZvcm07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgYmVoYXZpb3I6IHNlbmQgdGhlIHJlcXVlc3QgYXMgSlNPTlxuICAgICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVjKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keTogYm9keSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2NyZWF0ZVBhcmFsbGVsKHR5cGU6IHN0cmluZywgcmVjb3JkczogUmVjb3JkW10sIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBpZiAocmVjb3Jkcy5sZW5ndGggPiB0aGlzLl9tYXhSZXF1ZXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VlZGVkIG1heCBsaW1pdCBvZiBjb25jdXJyZW50IGNhbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT5cbiAgICAgICAgdGhpcy5fY3JlYXRlU2luZ2xlKHR5cGUsIHJlY29yZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIGJlIGF3YXJlIHRoYXQgYWxsT3JOb25lIGluIHBhcmFsbGVsIG1vZGUgd2lsbCBub3QgcmV2ZXJ0IHRoZSBvdGhlciBzdWNjZXNzZnVsIHJlcXVlc3RzXG4gICAgICAgICAgLy8gaXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9jcmVhdGVNYW55KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICByZWNvcmRzOiBSZWNvcmRbXSxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT4ge1xuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKGF3YWl0IHRoaXMuX2NyZWF0ZU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZWNvcmRzLnNsaWNlKDAsIE1BWF9ETUxfQ09VTlQpLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpLFxuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fY3JlYXRlTWFueShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHJlY29yZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBfcmVjb3JkcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHsgSWQsIHR5cGU6IHJ0eXBlLCBhdHRyaWJ1dGVzLCAuLi5yZWMgfSA9IHJlY29yZDtcbiAgICAgIGNvbnN0IHNvYmplY3RUeXBlID0gdHlwZSB8fCBhdHRyaWJ1dGVzPy50eXBlIHx8IHJ0eXBlO1xuICAgICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNPYmplY3QgVHlwZSBkZWZpbmVkIGluIHJlY29yZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgYXR0cmlidXRlczogeyB0eXBlOiBzb2JqZWN0VHlwZSB9LCAuLi5yZWMgfTtcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnY29tcG9zaXRlJywgJ3NvYmplY3RzJ10uam9pbignLycpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmwsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFsbE9yTm9uZTogb3B0aW9ucy5hbGxPck5vbmUgfHwgZmFsc2UsXG4gICAgICAgIHJlY29yZHM6IF9yZWNvcmRzLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihvcHRpb25zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5vbnltIG9mIENvbm5lY3Rpb24jY3JlYXRlKClcbiAgICovXG4gIGluc2VydCA9IHRoaXMuY3JlYXRlO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcmVjb3Jkc1xuICAgKi9cbiAgdXBkYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgVXBkYXRlUmVjb3JkIGV4dGVuZHMgU09iamVjdFVwZGF0ZVJlY29yZDxTLCBOPiA9IFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFVwZGF0ZVJlY29yZFtdLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIHVwZGF0ZTxcbiAgICBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICAgIFVwZGF0ZVJlY29yZCBleHRlbmRzIFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj4gPSBTT2JqZWN0VXBkYXRlUmVjb3JkPFMsIE4+XG4gID4odHlwZTogTiwgcmVjb3JkOiBVcGRhdGVSZWNvcmQsIG9wdGlvbnM/OiBEbWxPcHRpb25zKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgdXBkYXRlPFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgVXBkYXRlUmVjb3JkIGV4dGVuZHMgU09iamVjdFVwZGF0ZVJlY29yZDxTLCBOPiA9IFNPYmplY3RVcGRhdGVSZWNvcmQ8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFVwZGF0ZVJlY29yZCB8IFVwZGF0ZVJlY29yZFtdLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHQgfCBTYXZlUmVzdWx0W10+O1xuICAvKipcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIHJlY29yZHNcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIHVwZGF0ZTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVjb3JkcylcbiAgICAgID8gLy8gY2hlY2sgdGhlIHZlcnNpb24gd2hldGhlciBTT2JqZWN0IGNvbGxlY3Rpb24gQVBJIGlzIHN1cHBvcnRlZCAoNDIuMClcbiAgICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0MilcbiAgICAgICAgPyB0aGlzLl91cGRhdGVNYW55KHR5cGUsIHJlY29yZHMsIG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5fdXBkYXRlUGFyYWxsZWwodHlwZSwgcmVjb3Jkcywgb3B0aW9ucylcbiAgICAgIDogdGhpcy5fdXBkYXRlU2luZ2xlKHR5cGUsIHJlY29yZHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF91cGRhdGVTaW5nbGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZDogUmVjb3JkLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgSWQ6IGlkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgaWYgKCFpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNvcmQgaWQgaXMgbm90IGZvdW5kIGluIHJlY29yZC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc29iamVjdFR5cGUgPSB0eXBlIHx8IGF0dHJpYnV0ZXM/LnR5cGUgfHwgcnR5cGU7XG4gICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgc29iamVjdFR5cGUsIGlkXS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICB1cmwsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlYyksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4ob3B0aW9ucy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbm9Db250ZW50UmVzcG9uc2U6IHsgaWQsIHN1Y2Nlc3M6IHRydWUsIGVycm9yczogW10gfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfdXBkYXRlUGFyYWxsZWwodHlwZTogc3RyaW5nLCByZWNvcmRzOiBSZWNvcmRbXSwgb3B0aW9uczogRG1sT3B0aW9ucykge1xuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IHRoaXMuX21heFJlcXVlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZWVkZWQgbWF4IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2FsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICByZWNvcmRzLm1hcCgocmVjb3JkKSA9PlxuICAgICAgICB0aGlzLl91cGRhdGVTaW5nbGUodHlwZSwgcmVjb3JkLCBvcHRpb25zKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgLy8gYmUgYXdhcmUgdGhhdCBhbGxPck5vbmUgaW4gcGFyYWxsZWwgbW9kZSB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHNcbiAgICAgICAgICAvLyBpdCBvbmx5IHJhaXNlcyBlcnJvciB3aGVuIG1ldCBhdCBsZWFzdCBvbmUgZmFpbGVkIHJlcXVlc3QuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuYWxsT3JOb25lIHx8ICFlcnIuZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0b1NhdmVSZXN1bHQoZXJyKTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX3VwZGF0ZU1hbnkoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZFtdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdFtdPiB7XG4gICAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKGF3YWl0IHRoaXMuX3VwZGF0ZU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZWNvcmRzLnNsaWNlKDAsIE1BWF9ETUxfQ09VTlQpLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpLFxuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fdXBkYXRlTWFueShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHJlY29yZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBfcmVjb3JkcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHsgSWQ6IGlkLCB0eXBlOiBydHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjb3JkIGlkIGlzIG5vdCBmb3VuZCBpbiByZWNvcmQuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzb2JqZWN0VHlwZSA9IHR5cGUgfHwgYXR0cmlidXRlcz8udHlwZSB8fCBydHlwZTtcbiAgICAgIGlmICghc29iamVjdFR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTT2JqZWN0IFR5cGUgZGVmaW5lZCBpbiByZWNvcmQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlkLCBhdHRyaWJ1dGVzOiB7IHR5cGU6IHNvYmplY3RUeXBlIH0sIC4uLnJlYyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdjb21wb3NpdGUnLCAnc29iamVjdHMnXS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICB1cmwsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFsbE9yTm9uZTogb3B0aW9ucy5hbGxPck5vbmUgfHwgZmFsc2UsXG4gICAgICAgIHJlY29yZHM6IF9yZWNvcmRzLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihvcHRpb25zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcmVjb3Jkc1xuICAgKi9cbiAgdXBzZXJ0PFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4sXG4gICAgRmllbGROYW1lcyBleHRlbmRzIFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+ID0gU09iamVjdEZpZWxkTmFtZXM8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogRmllbGROYW1lcyxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHRbXT47XG4gIHVwc2VydDxcbiAgICBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICAgIElucHV0UmVjb3JkIGV4dGVuZHMgU09iamVjdElucHV0UmVjb3JkPFMsIE4+ID0gU09iamVjdElucHV0UmVjb3JkPFMsIE4+LFxuICAgIEZpZWxkTmFtZXMgZXh0ZW5kcyBTT2JqZWN0RmllbGROYW1lczxTLCBOPiA9IFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+XG4gID4oXG4gICAgdHlwZTogTixcbiAgICByZWNvcmQ6IElucHV0UmVjb3JkLFxuICAgIGV4dElkRmllbGQ6IEZpZWxkTmFtZXMsXG4gICAgb3B0aW9ucz86IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PjtcbiAgdXBzZXJ0PFxuICAgIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gICAgSW5wdXRSZWNvcmQgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4gPSBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4sXG4gICAgRmllbGROYW1lcyBleHRlbmRzIFNPYmplY3RGaWVsZE5hbWVzPFMsIE4+ID0gU09iamVjdEZpZWxkTmFtZXM8UywgTj5cbiAgPihcbiAgICB0eXBlOiBOLFxuICAgIHJlY29yZHM6IElucHV0UmVjb3JkIHwgSW5wdXRSZWNvcmRbXSxcbiAgICBleHRJZEZpZWxkOiBGaWVsZE5hbWVzLFxuICAgIG9wdGlvbnM/OiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdCB8IFVwc2VydFJlc3VsdFtdPjtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByZWNvcmRzXG4gICAqIEBwYXJhbSBleHRJZEZpZWxkXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyB1cHNlcnQoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdLFxuICAgIGV4dElkRmllbGQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlY29yZHMpXG4gICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Ni4wKVxuICAgICAgdGhpcy5fZW5zdXJlVmVyc2lvbig0NilcbiAgICAgID8gdGhpcy5fdXBzZXJ0TWFueSh0eXBlLCByZWNvcmRzLCBleHRJZEZpZWxkLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl91cHNlcnRQYXJhbGxlbCh0eXBlLCByZWNvcmRzLCBleHRJZEZpZWxkLCBvcHRpb25zKVxuICAgIDogdGhpcy5fdXBzZXJ0UGFyYWxsZWwodHlwZSwgcmVjb3JkcywgZXh0SWRGaWVsZCwgb3B0aW9ucyk7XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuICBhc3luYyBfdXBzZXJ0TWFueShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcmVjb3JkczogUmVjb3JkIHwgUmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IE1BWF9ETUxfQ09VTlQgJiYgb3B0aW9ucy5hbGxvd1JlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKChhd2FpdCB0aGlzLl91cHNlcnRNYW55KFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVjb3Jkcy5zbGljZSgwLCBNQVhfRE1MX0NPVU5UKSxcbiAgICAgICAgICBleHRJZEZpZWxkLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkpIGFzIFNhdmVSZXN1bHRbXSksXG4gICAgICAgIC4uLigoYXdhaXQgdGhpcy5fdXBzZXJ0TWFueSh0eXBlLCByZWNvcmRzLnNsaWNlKE1BWF9ETUxfQ09VTlQpLCBleHRJZEZpZWxkLCBvcHRpb25zKSkgYXMgU2F2ZVJlc3VsdFtdKSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IF9yZWNvcmRzID0gcmVjb3Jkcy5tYXAoKHJlY29yZEl0ZW06IFJlY29yZCkgPT4ge1xuICAgICAgY29uc3QgeyBbZXh0SWRGaWVsZF06IGV4dElkLCB0eXBlOiByZWNvcmRUeXBlLCBhdHRyaWJ1dGVzLCAuLi5yZWMgfSA9IHJlY29yZEl0ZW07XG4gICAgICBjb25zdCBzb2JqZWN0VHlwZSA9IHJlY29yZFR5cGUgfHwgYXR0cmlidXRlcz8udHlwZSB8fCB0eXBlO1xuICAgICAgaWYgKCFleHRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4dGVybmFsIElEIGlzIG5vdCBmb3VuZCBpbiByZWNvcmQuJyk7XG4gICAgICB9IFxuICAgICAgaWYgKCFzb2JqZWN0VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNPYmplY3QgVHlwZSBkZWZpbmVkIGluIHJlY29yZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgW2V4dElkRmllbGRdOiBleHRJZCwgYXR0cmlidXRlczogeyB0eXBlOiBzb2JqZWN0VHlwZSB9LCAuLi5yZWMgfTtcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgW3RoaXMuX2Jhc2VVcmwoKSwgJ2NvbXBvc2l0ZScsICdzb2JqZWN0cycsIHR5cGUsIGV4dElkRmllbGRdLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHVybCxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYWxsT3JOb25lOiBvcHRpb25zLmFsbE9yTm9uZSB8fCBmYWxzZSxcbiAgICAgICAgcmVjb3JkczogX3JlY29yZHMsXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF91cHNlcnRQYXJhbGxlbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcmVjb3JkczogUmVjb3JkIHwgUmVjb3JkW10sXG4gICAgZXh0SWRGaWVsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocmVjb3Jkcyk7XG4gICAgY29uc3QgX3JlY29yZHMgPSBBcnJheS5pc0FycmF5KHJlY29yZHMpID8gcmVjb3JkcyA6IFtyZWNvcmRzXTtcbiAgICBpZiAoX3JlY29yZHMubGVuZ3RoID4gdGhpcy5fbWF4UmVxdWVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXggbGltaXQgb2YgY29uY3VycmVudCBjYWxsJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIF9yZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgW2V4dElkRmllbGRdOiBleHRJZCwgdHlwZTogcnR5cGUsIGF0dHJpYnV0ZXMsIC4uLnJlYyB9ID0gcmVjb3JkO1xuICAgICAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCBleHRJZEZpZWxkLCBleHRJZF0uam9pbihcbiAgICAgICAgICAnLycsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8U2F2ZVJlc3VsdD4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVjKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbm9Db250ZW50UmVzcG9uc2U6IHsgc3VjY2VzczogdHJ1ZSwgZXJyb3JzOiBbXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIEJlIGF3YXJlIHRoYXQgYGFsbE9yTm9uZWAgb3B0aW9uIGluIHVwc2VydCBtZXRob2RcbiAgICAgICAgICAvLyB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHMuXG4gICAgICAgICAgLy8gSXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmICghaXNBcnJheSB8fCBvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gaXNBcnJheSA/IHJlc3VsdHMgOiByZXN1bHRzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSByZWNvcmRzXG4gICAqL1xuICBkZXN0cm95PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICBkZXN0cm95PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KFxuICAgIHR5cGU6IE4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgZGVzdHJveTxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PihcbiAgICB0eXBlOiBOLFxuICAgIGlkczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IERtbE9wdGlvbnMsXG4gICk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT47XG4gIC8qKlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gaWRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyBkZXN0cm95KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM6IERtbE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaWRzKVxuICAgICAgPyAvLyBjaGVjayB0aGUgdmVyc2lvbiB3aGV0aGVyIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgaXMgc3VwcG9ydGVkICg0Mi4wKVxuICAgICAgICB0aGlzLl9lbnN1cmVWZXJzaW9uKDQyKVxuICAgICAgICA/IHRoaXMuX2Rlc3Ryb3lNYW55KHR5cGUsIGlkcywgb3B0aW9ucylcbiAgICAgICAgOiB0aGlzLl9kZXN0cm95UGFyYWxsZWwodHlwZSwgaWRzLCBvcHRpb25zKVxuICAgICAgOiB0aGlzLl9kZXN0cm95U2luZ2xlKHR5cGUsIGlkcywgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2Rlc3Ryb3lTaW5nbGUoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRG1sT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0PiB7XG4gICAgY29uc3QgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgdHlwZSwgaWRdLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB1cmwsXG4gICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5vQ29udGVudFJlc3BvbnNlOiB7IGlkLCBzdWNjZXNzOiB0cnVlLCBlcnJvcnM6IFtdIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgYXN5bmMgX2Rlc3Ryb3lQYXJhbGxlbCh0eXBlOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIG9wdGlvbnM6IERtbE9wdGlvbnMpIHtcbiAgICBpZiAoaWRzLmxlbmd0aCA+IHRoaXMuX21heFJlcXVlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZWVkZWQgbWF4IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2FsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZHMubWFwKChpZCkgPT5cbiAgICAgICAgdGhpcy5fZGVzdHJveVNpbmdsZSh0eXBlLCBpZCwgb3B0aW9ucykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIEJlIGF3YXJlIHRoYXQgYGFsbE9yTm9uZWAgb3B0aW9uIGluIHBhcmFsbGVsIG1vZGVcbiAgICAgICAgICAvLyB3aWxsIG5vdCByZXZlcnQgdGhlIG90aGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdHMuXG4gICAgICAgICAgLy8gSXQgb25seSByYWlzZXMgZXJyb3Igd2hlbiBtZXQgYXQgbGVhc3Qgb25lIGZhaWxlZCByZXF1ZXN0LlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbE9yTm9uZSB8fCAhZXJyLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9TYXZlUmVzdWx0KGVycik7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIGFzeW5jIF9kZXN0cm95TWFueShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zOiBEbWxPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoID4gTUFYX0RNTF9DT1VOVCAmJiBvcHRpb25zLmFsbG93UmVjdXJzaXZlKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi4oYXdhaXQgdGhpcy5fZGVzdHJveU1hbnkoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpZHMuc2xpY2UoMCwgTUFYX0RNTF9DT1VOVCksXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSksXG4gICAgICAgIC4uLihhd2FpdCB0aGlzLl9kZXN0cm95TWFueSh0eXBlLCBpZHMuc2xpY2UoTUFYX0RNTF9DT1VOVCksIG9wdGlvbnMpKSxcbiAgICAgIF07XG4gICAgfVxuICAgIGxldCB1cmwgPVxuICAgICAgW3RoaXMuX2Jhc2VVcmwoKSwgJ2NvbXBvc2l0ZScsICdzb2JqZWN0cz9pZHM9J10uam9pbignLycpICsgaWRzLmpvaW4oJywnKTtcbiAgICBpZiAob3B0aW9ucy5hbGxPck5vbmUpIHtcbiAgICAgIHVybCArPSAnJmFsbE9yTm9uZT10cnVlJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIHx8IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bm9ueW0gb2YgQ29ubmVjdGlvbiNkZXN0cm95KClcbiAgICovXG4gIGRlbGV0ZSA9IHRoaXMuZGVzdHJveTtcblxuICAvKipcbiAgICogU3lub255bSBvZiBDb25uZWN0aW9uI2Rlc3Ryb3koKVxuICAgKi9cbiAgZGVsID0gdGhpcy5kZXN0cm95O1xuXG4gIC8qKlxuICAgKiBEZXNjcmliZSBTT2JqZWN0IG1ldGFkYXRhXG4gICAqL1xuICBhc3luYyBkZXNjcmliZSh0eXBlOiBzdHJpbmcpOiBQcm9taXNlPERlc2NyaWJlU09iamVjdFJlc3VsdD4ge1xuICAgIGNvbnN0IHVybCA9IFt0aGlzLl9iYXNlVXJsKCksICdzb2JqZWN0cycsIHR5cGUsICdkZXNjcmliZSddLmpvaW4oJy8nKTtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVzY3JpYmVTT2JqZWN0UmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlIGdsb2JhbCBTT2JqZWN0c1xuICAgKi9cbiAgYXN5bmMgZGVzY3JpYmVHbG9iYWwoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5fYmFzZVVybCgpfS9zb2JqZWN0c2A7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlR2xvYmFsUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTT2JqZWN0IGluc3RhbmNlXG4gICAqL1xuICBzb2JqZWN0PE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4+KHR5cGU6IHN0cmluZ3xOKTogU09iamVjdDxTLCBOPjtcbiAgc29iamVjdDxOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+Pih0eXBlOiBOIHwgc3RyaW5nKTogU09iamVjdDxTLCBOPiB7XG4gICAgY29uc3Qgc28gPSB0aGlzLnNvYmplY3RzW3R5cGUgYXMgTl0gfHwgbmV3IFNPYmplY3QodGhpcywgdHlwZSBhcyBOKTtcbiAgICB0aGlzLnNvYmplY3RzW3R5cGUgYXMgTl0gPSBzbztcbiAgICByZXR1cm4gc287XG4gIH1cblxuICAvKipcbiAgICogR2V0IGlkZW50aXR5IGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgdXNlclxuICAgKi9cbiAgYXN5bmMgaWRlbnRpdHkob3B0aW9uczogeyBoZWFkZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IHRoaXMudXNlckluZm8/LnVybDtcbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHsgaWRlbnRpdHk6IHN0cmluZyB9Pih7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHVybDogdGhpcy5fYmFzZVVybCgpLFxuICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICB9KTtcbiAgICAgIHVybCA9IHJlcy5pZGVudGl0eTtcbiAgICB9XG4gICAgdXJsICs9ICc/Zm9ybWF0PWpzb24nO1xuICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICB1cmwgKz0gYCZvYXV0aF90b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFjY2Vzc1Rva2VuKX1gO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8SWRlbnRpdHlJbmZvPih7IG1ldGhvZDogJ0dFVCcsIHVybCB9KTtcbiAgICB0aGlzLnVzZXJJbmZvID0ge1xuICAgICAgaWQ6IHJlcy51c2VyX2lkLFxuICAgICAgb3JnYW5pemF0aW9uSWQ6IHJlcy5vcmdhbml6YXRpb25faWQsXG4gICAgICB1cmw6IHJlcy5pZCxcbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCByZWNlbnRseSB2aWV3ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVjZW50KHR5cGU/OiBzdHJpbmcgfCBudW1iZXIsIGxpbWl0PzogbnVtYmVyKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBsaW1pdCA9IHR5cGU7XG4gICAgICB0eXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdXJsO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlXS5qb2luKCcvJyk7XG4gICAgICBjb25zdCB7IHJlY2VudEl0ZW1zIH0gPSBhd2FpdCB0aGlzLnJlcXVlc3Q8eyByZWNlbnRJdGVtczogUmVjb3JkW10gfT4oXG4gICAgICAgIHVybCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbGltaXQgPyByZWNlbnRJdGVtcy5zbGljZSgwLCBsaW1pdCkgOiByZWNlbnRJdGVtcztcbiAgICB9XG4gICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybCgpfS9yZWNlbnRgO1xuICAgIGlmIChsaW1pdCkge1xuICAgICAgdXJsICs9IGA/bGltaXQ9JHtsaW1pdH1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFJlY29yZFtdPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlZChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgc3RhcnQ6IHN0cmluZyB8IERhdGUsXG4gICAgZW5kOiBzdHJpbmcgfCBEYXRlLFxuICApOiBQcm9taXNlPFVwZGF0ZWRSZXN1bHQ+IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgIGxldCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnc29iamVjdHMnLCB0eXBlLCAndXBkYXRlZCddLmpvaW4oJy8nKTtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgc3RhcnQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgfVxuICAgIHN0YXJ0ID0gZm9ybWF0RGF0ZShzdGFydCk7XG4gICAgdXJsICs9IGA/c3RhcnQ9JHtlbmNvZGVVUklDb21wb25lbnQoc3RhcnQpfWA7XG4gICAgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmQgPSBuZXcgRGF0ZShlbmQpO1xuICAgIH1cbiAgICBlbmQgPSBmb3JtYXREYXRlKGVuZCk7XG4gICAgdXJsICs9IGAmZW5kPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZCl9YDtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgVXBkYXRlZFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZWQoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHN0YXJ0OiBzdHJpbmcgfCBEYXRlLFxuICAgIGVuZDogc3RyaW5nIHwgRGF0ZSxcbiAgKTogUHJvbWlzZTxEZWxldGVkUmVzdWx0PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICBsZXQgdXJsID0gW3RoaXMuX2Jhc2VVcmwoKSwgJ3NvYmplY3RzJywgdHlwZSwgJ2RlbGV0ZWQnXS5qb2luKCcvJyk7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN0YXJ0ID0gbmV3IERhdGUoc3RhcnQpO1xuICAgIH1cbiAgICBzdGFydCA9IGZvcm1hdERhdGUoc3RhcnQpO1xuICAgIHVybCArPSBgP3N0YXJ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHN0YXJ0KX1gO1xuXG4gICAgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmQgPSBuZXcgRGF0ZShlbmQpO1xuICAgIH1cbiAgICBlbmQgPSBmb3JtYXREYXRlKGVuZCk7XG4gICAgdXJsICs9IGAmZW5kPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZCl9YDtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVsZXRlZFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGFic1xuICAgKi9cbiAgYXN5bmMgdGFicygpOiBQcm9taXNlPERlc2NyaWJlVGFiW10+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAndGFicyddLmpvaW4oJy8nKTtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCk7XG4gICAgcmV0dXJuIGJvZHkgYXMgRGVzY3JpYmVUYWJbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgc3lzdGVtIGxpbWl0IGluIHRoZSBvcmdhbml6YXRpb25cbiAgICovXG4gIGFzeW5jIGxpbWl0cygpOiBQcm9taXNlPE9yZ2FuaXphdGlvbkxpbWl0c0luZm8+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAnbGltaXRzJ10uam9pbignLycpO1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLnJlcXVlc3QodXJsKTtcbiAgICByZXR1cm4gYm9keSBhcyBPcmdhbml6YXRpb25MaW1pdHNJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB0aGVtZSBpbmZvXG4gICAqL1xuICBhc3luYyB0aGVtZSgpOiBQcm9taXNlPERlc2NyaWJlVGhlbWU+IHtcbiAgICBjb25zdCB1cmwgPSBbdGhpcy5fYmFzZVVybCgpLCAndGhlbWUnXS5qb2luKCcvJyk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlVGhlbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBnbG9iYWwgcXVpY2sgYWN0aW9uc1xuICAgKi9cbiAgYXN5bmMgcXVpY2tBY3Rpb25zKCk6IFByb21pc2U8RGVzY3JpYmVRdWlja0FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucmVxdWVzdCgnL3F1aWNrQWN0aW9ucycpO1xuICAgIHJldHVybiBib2R5IGFzIERlc2NyaWJlUXVpY2tBY3Rpb25SZXN1bHRbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVmZXJlbmNlIGZvciBzcGVjaWZpZWQgZ2xvYmFsIHF1aWNrIGFjdGlvblxuICAgKi9cbiAgcXVpY2tBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKTogUXVpY2tBY3Rpb248Uz4ge1xuICAgIHJldHVybiBuZXcgUXVpY2tBY3Rpb24odGhpcywgYC9xdWlja0FjdGlvbnMvJHthY3Rpb25OYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZHVsZSB3aGljaCBtYW5hZ2VzIHByb2Nlc3MgcnVsZXMgYW5kIGFwcHJvdmFsIHByb2Nlc3Nlc1xuICAgKi9cbiAgcHJvY2VzcyA9IG5ldyBQcm9jZXNzKHRoaXMpO1xuXG4gIHByaXZhdGUgaXNMaWdodG5pbmdJbnN0YW5jZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5mb3JjZS5jb20nKSB8fFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5jcm1mb3JjZS5taWwnKSB8fFxuICAgICAgdGhpcy5pbnN0YW5jZVVybC5pbmNsdWRlcygnLmxpZ2h0bmluZy5zZmNybWFwcHMuY24nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29ubmVjdGlvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWSxRQUFRLFFBQVE7QUFDckMsT0FBT0MsT0FBTyxNQUFNLFdBQVc7QUFnQy9CLE9BQU9DLFNBQVMsSUFDZEMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixRQUNiLGFBQWE7QUFDcEIsU0FBaUJDLFNBQVMsUUFBUSxlQUFlO0FBRWpELE9BQU9DLE1BQU0sTUFBeUIsVUFBVTtBQUVoRCxPQUFPQyxLQUFLLE1BQTBCLFNBQVM7QUFDL0MsT0FBT0MsT0FBTyxNQUFNLFlBQVk7QUFDaEMsT0FBT0Msc0JBQXNCLE1BRXRCLDRCQUE0QjtBQUNuQyxPQUFPQyxLQUFLLE1BQU0sU0FBUztBQUUzQixPQUFPQyxPQUFPLE1BQU0sV0FBVztBQUMvQixPQUFPQyxXQUFXLE1BQU0sZ0JBQWdCO0FBQ3hDLE9BQU9DLE9BQU8sTUFBTSxXQUFXO0FBQy9CLFNBQVNDLFVBQVUsUUFBUSxrQkFBa0I7QUFVN0MsT0FBT0MsUUFBUSxNQUFNLFdBQVc7O0FBRWhDO0FBQ0E7QUFDQTs7QUE2QkE7QUFDQTtBQUNBO0FBQ0EsSUFBTUMsdUJBTUwsR0FBRztFQUNGQyxRQUFRLEVBQUUsOEJBQThCO0VBQ3hDQyxXQUFXLEVBQUUsRUFBRTtFQUNmQyxP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