"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createRequestOptions = void 0; const lodash_1 = require("lodash"); const is_stream_1 = __importDefault(require("is-stream")); const interfaces_1 = require("./interfaces"); const testcafe_hammerhead_1 = require("testcafe-hammerhead"); const content_types_1 = __importDefault(require("../../assets/content-types")); const http_headers_1 = __importDefault(require("../../utils/http-headers")); const types_1 = require("../../errors/types"); const runtime_1 = require("../../errors/runtime"); const actions_1 = require("../commands/actions"); const DEFAULT_ACCEPT = { [http_headers_1.default.accept]: `${content_types_1.default.json}, ${content_types_1.default.textPlain}, ${content_types_1.default.all}` }; const METHODS_WITH_CONTENT_TYPE = ['post', 'put', 'patch']; const DEFAULT_REQUEST_METHOD = 'GET'; const DEFAULT_PROTOCOL = 'http:'; function setContentTypeIfNotExists(headers, value) { if (!(0, lodash_1.isUndefined)(headers) && (0, lodash_1.isUndefined)(headers[http_headers_1.default.contentType])) headers[http_headers_1.default.contentType] = value; } function typeOf(value) { if (value === null) return 'null'; if (value && typeof value === 'object') return value.constructor.name.toLowerCase(); return typeof value; } function transformBody(headers, body) { if (!body) return Buffer.from(''); if (typeOf(body) === 'formdata' || typeOf(body) === 'file' || typeOf(body) === 'blob' || (0, lodash_1.isArrayBuffer)(body) || (0, lodash_1.isBuffer)(body) || (0, is_stream_1.default)(body)) return Buffer.from(body); else if (ArrayBuffer.isView(body)) return Buffer.from(body.buffer); else if (body instanceof URLSearchParams) { setContentTypeIfNotExists(headers, `${content_types_1.default.urlencoded};charset=utf-8`); return Buffer.from(body.toString()); } else if ((0, lodash_1.isObject)(body) || headers && headers[http_headers_1.default.contentType] === content_types_1.default.json) { setContentTypeIfNotExists(headers, content_types_1.default.json); return Buffer.from(JSON.stringify(body)); } else if (typeof body === 'string') setContentTypeIfNotExists(headers, content_types_1.default.textPlain); return body; } function getAuthString(auth) { return 'Basic ' + Buffer.from(auth.username + ':' + auth.password, 'utf8').toString('base64'); } function changeHeaderNamesToLowercase(headers) { const lowerCaseHeaders = {}; Object.keys(headers).forEach(headerName => { lowerCaseHeaders[headerName.toLowerCase()] = headers[headerName]; }); return lowerCaseHeaders; } async function prepareHeaders(headers, currentPageUrl, url, body, testRun, withCredentials, options) { var _a; const { host, origin } = url; const preparedHeaders = Object.assign({}, DEFAULT_ACCEPT, changeHeaderNamesToLowercase(headers)); preparedHeaders[http_headers_1.default.host] = host; preparedHeaders[http_headers_1.default.origin] = origin; preparedHeaders[http_headers_1.default.contentLength] = body.length; if (headers.method && METHODS_WITH_CONTENT_TYPE.includes(String(headers.method))) preparedHeaders[http_headers_1.default.contentType] = content_types_1.default.urlencoded; if (options.auth && withCredentials) preparedHeaders[http_headers_1.default.authorization] = getAuthString(options.auth); if ((_a = options.proxy) === null || _a === void 0 ? void 0 : _a.auth) preparedHeaders[http_headers_1.default.proxyAuthorization] = getAuthString(options.proxy.auth); if (withCredentials) { const currentPageCookies = testRun.session.cookies.getHeader({ url: currentPageUrl.href, hostname: currentPageUrl.hostname, }); if (currentPageCookies) preparedHeaders[http_headers_1.default.cookie] = currentPageCookies; } //NOTE: Additional header to recognize API requests in the hammerhead preparedHeaders[http_headers_1.default.isApiRequest] = 'true'; return preparedHeaders; } async function prepareUrl(testRun, currentPageUrl, url, callsite) { let preparedUrl; try { preparedUrl = url instanceof URL ? url : new URL(url, currentPageUrl.hostname ? currentPageUrl.origin : void 0); } catch (e) { throw new runtime_1.APIError(callsite, types_1.RUNTIME_ERRORS.requestUrlInvalidValueError, url); } return preparedUrl; } function prepareSearchParams(url, params) { if (!params) return url; let searchParams; if (params instanceof URLSearchParams) searchParams = params; else { searchParams = new URLSearchParams(); for (const key in params) { if (!params[key]) continue; (0, lodash_1.castArray)(params[key]).forEach(v => { searchParams.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v)); }); } } return `${url}${url.includes('?') ? '&' : '?'}${searchParams.toString()}`; } function getProxyUrl(testRun, url, withCredentials) { return testRun.executeCommand(new actions_1.GetProxyUrlCommand({ url: url, options: { credentials: withCredentials ? interfaces_1.Credentials.include : interfaces_1.Credentials.omit }, }, testRun, true)); } async function createRequestOptions(currentPageUrl, testRun, options, callsite) { options.headers = options.headers || {}; const url = await prepareUrl(testRun, currentPageUrl, options.url, callsite); const withCredentials = !currentPageUrl.host || (0, testcafe_hammerhead_1.sameOriginCheck)(currentPageUrl.href, url.href) || options.withCredentials || false; const body = transformBody(options.headers, options.body); const headers = await prepareHeaders(options.headers, currentPageUrl, url, body, testRun, withCredentials, options); const proxyUrl = await getProxyUrl(testRun, url.href, withCredentials); const proxyUrlObj = (0, testcafe_hammerhead_1.parseProxyUrl)(proxyUrl); let auth = options.auth; if (!auth && url.username && url.password) { auth = { username: url.username, password: url.password, }; } const requestParams = { method: options.method || DEFAULT_REQUEST_METHOD, url: proxyUrl, protocol: DEFAULT_PROTOCOL, hostname: proxyUrlObj.proxy.hostname, host: proxyUrlObj.proxy.hostname, port: proxyUrlObj.proxy.port, path: prepareSearchParams(proxyUrlObj.partAfterHost, options.params), auth: auth && withCredentials ? `${auth.username}:${auth.password}` : void 0, headers: headers, credentials: withCredentials ? testRun.session.getAuthCredentials() : void 0, body: body, disableHttp2: testRun.session.isHttp2Disabled(), requestTimeout: { ajax: options.timeout, page: options.timeout, }, }; if (options.proxy) { requestParams.externalProxySettings = { host: options.proxy.host, hostname: options.proxy.host, port: options.proxy.port.toString(), proxyAuth: options.proxy.auth ? `${options.proxy.auth.username}:${options.proxy.auth.password}` : void 0, }; requestParams.protocol = url.protocol; requestParams.host = url.host; requestParams.hostname = url.hostname; requestParams.port = url.port; requestParams.path = prepareSearchParams(url.pathname + url.search, options.params); } return new testcafe_hammerhead_1.RequestOptions(requestParams); } exports.createRequestOptions = createRequestOptions; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlcXVlc3Qtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0LXJ1bi9yZXF1ZXN0L2NyZWF0ZS1yZXF1ZXN0LW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbUNBTWdCO0FBQ2hCLDBEQUFpQztBQUNqQyw2Q0FLc0I7QUFDdEIsNkRBSzZCO0FBRTdCLCtFQUF1RDtBQUN2RCw0RUFBb0Q7QUFDcEQsOENBQW9EO0FBQ3BELGtEQUFnRDtBQUNoRCxpREFBeUQ7QUFHekQsTUFBTSxjQUFjLEdBQWMsRUFBRSxDQUFDLHNCQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyx1QkFBYSxDQUFDLElBQUksS0FBSyx1QkFBYSxDQUFDLFNBQVMsS0FBSyx1QkFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDdkksTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0QsTUFBTSxzQkFBc0IsR0FBTSxLQUFLLENBQUM7QUFDeEMsTUFBTSxnQkFBZ0IsR0FBWSxPQUFPLENBQUM7QUFFMUMsU0FBUyx5QkFBeUIsQ0FBRSxPQUE0QixFQUFFLEtBQWE7SUFDM0UsSUFBSSxDQUFDLElBQUEsb0JBQVcsRUFBQyxPQUFPLENBQUMsSUFBSSxJQUFBLG9CQUFXLEVBQUMsT0FBTyxDQUFDLHNCQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLHNCQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBRSxLQUFjO0lBQzNCLElBQUksS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFPLE1BQU0sQ0FBQztJQUVsQixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FB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QUU7UUFDakQsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3JCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTztTQUN4QjtLQUNKLENBQUM7SUFFRixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDZixhQUFhLENBQUMscUJBQXFCLEdBQUc7WUFDbEMsSUFBSSxFQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUM3QixRQUFRLEVBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQzdCLElBQUksRUFBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDeEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQzNHLENBQUM7UUFFRixhQUFhLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDdEMsYUFBYSxDQUFDLElBQUksR0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2xDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN0QyxhQUFhLENBQUMsSUFBSSxHQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDbEMsYUFBYSxDQUFDLElBQUksR0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzNGO0lBRUQsT0FBTyxJQUFJLG9DQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQXJERCxvREFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdXRnb2luZ0h0dHBIZWFkZXJzIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQge1xuICAgIGNhc3RBcnJheSxcbiAgICBpc0FycmF5QnVmZmVyLFxuICAgIGlzQnVmZmVyLFxuICAgIGlzT2JqZWN0LFxuICAgIGlzVW5kZWZpbmVkLFxufSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGlzU3RyZWFtIGZyb20gJ2lzLXN0cmVhbSc7XG5pbXBvcnQge1xuICAgIEF1dGhPcHRpb25zLFxuICAgIENyZWRlbnRpYWxzLFxuICAgIEV4dGVybmFsUmVxdWVzdE9wdGlvbnMsXG4gICAgUGFyYW1zLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgICBSZXF1ZXN0T3B0aW9ucyxcbiAgICBwYXJzZVByb3h5VXJsLFxuICAgIFJlcXVlc3RPcHRpb25zUGFyYW1zLFxuICAgIHNhbWVPcmlnaW5DaGVjayxcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgVGVzdFJ1biBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgQ09OVEVOVF9UWVBFUyBmcm9tICcuLi8uLi9hc3NldHMvY29udGVudC10eXBlcyc7XG5pbXBvcnQgSFRUUF9IRUFERVJTIGZyb20gJy4uLy4uL3V0aWxzL2h0dHAtaGVhZGVycyc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBBUElFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IEdldFByb3h5VXJsQ29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL2FjdGlvbnMnO1xuaW1wb3J0IHsgQ2FsbHNpdGVSZWNvcmQgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuXG5jb25zdCBERUZBVUxUX0FDQ0VQVCAgICAgICAgICAgID0geyBbSFRUUF9IRUFERVJTLmFjY2VwdF06IGAke0NPTlRFTlRfVFlQRVMuanNvbn0sICR7Q09OVEVOVF9UWVBFUy50ZXh0UGxhaW59LCAke0NPTlRFTlRfVFlQRVMuYWxsfWAgfTtcbmNvbnN0IE1FVEhPRFNfV0lUSF9DT05URU5UX1RZUEUgPSBbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ107XG5jb25zdCBERUZBVUxUX1JFUVVFU1RfTUVUSE9EICAgID0gJ0dFVCc7XG5jb25zdCBERUZBVUxUX1BST1RPQ09MICAgICAgICAgID0gJ2h0dHA6JztcblxuZnVuY3Rpb24gc2V0Q29udGVudFR5cGVJZk5vdEV4aXN0cyAoaGVhZGVyczogT3V0Z29pbmdIdHRwSGVhZGVycywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNVbmRlZmluZWQoaGVhZGVycykgJiYgaXNVbmRlZmluZWQoaGVhZGVyc1tIVFRQX0hFQURFUlMuY29udGVudFR5cGVdKSlcbiAgICAgICAgaGVhZGVyc1tIVFRQX0hFQURFUlMuY29udGVudFR5cGVdID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZiAodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuICdudWxsJztcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gdmFsdWUuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQm9keSAoaGVhZGVyczogT3V0Z29pbmdIdHRwSGVhZGVycywgYm9keT86IGFueSk6IEJ1ZmZlciB7XG4gICAgaWYgKCFib2R5KVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oJycpO1xuXG4gICAgaWYgKHR5cGVPZihib2R5KSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICB0eXBlT2YoYm9keSkgPT09ICdmaWxlJyB8fFxuICAgICAgICB0eXBlT2YoYm9keSkgPT09ICdibG9iJyB8fFxuICAgICAgICBpc0FycmF5QnVmZmVyKGJvZHkpIHx8XG4gICAgICAgIGlzQnVmZmVyKGJvZHkpIHx8XG4gICAgICAgIGlzU3RyZWFtKGJvZHkpXG4gICAgKVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYm9keSk7XG4gICAgZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpKVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYm9keS5idWZmZXIpO1xuXG4gICAgZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICBzZXRDb250ZW50VHlwZUlmTm90RXhpc3RzKGhlYWRlcnMsIGAke0NPTlRFTlRfVFlQRVMudXJsZW5jb2RlZH07Y2hhcnNldD11dGYtOGApO1xuXG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShib2R5LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChib2R5KSB8fCBoZWFkZXJzICYmIGhlYWRlcnNbSFRUUF9IRUFERVJTLmNvbnRlbnRUeXBlXSA9PT0gQ09OVEVOVF9UWVBFUy5qc29uKSB7XG4gICAgICAgIHNldENvbnRlbnRUeXBlSWZOb3RFeGlzdHMoaGVhZGVycywgQ09OVEVOVF9UWVBFUy5qc29uKTtcblxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHNldENvbnRlbnRUeXBlSWZOb3RFeGlzdHMoaGVhZGVycywgQ09OVEVOVF9UWVBFUy50ZXh0UGxhaW4pO1xuXG4gICAgcmV0dXJuIGJvZHk7XG59XG5cbmZ1bmN0aW9uIGdldEF1dGhTdHJpbmcgKGF1dGg6IEF1dGhPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShhdXRoLnVzZXJuYW1lICsgJzonICsgYXV0aC5wYXNzd29yZCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUhlYWRlck5hbWVzVG9Mb3dlcmNhc2UgKGhlYWRlcnM6IE91dGdvaW5nSHR0cEhlYWRlcnMpOiBPdXRnb2luZ0h0dHBIZWFkZXJzIHtcbiAgICBjb25zdCBsb3dlckNhc2VIZWFkZXJzOiBPdXRnb2luZ0h0dHBIZWFkZXJzID0ge307XG5cbiAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGhlYWRlck5hbWUgPT4ge1xuICAgICAgICBsb3dlckNhc2VIZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvd2VyQ2FzZUhlYWRlcnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVIZWFkZXJzIChoZWFkZXJzOiBPdXRnb2luZ0h0dHBIZWFkZXJzLCBjdXJyZW50UGFnZVVybDogVVJMLCB1cmw6IFVSTCwgYm9keTogQnVmZmVyLCB0ZXN0UnVuOiBUZXN0UnVuLCB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW4sIG9wdGlvbnM6IEV4dGVybmFsUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPE91dGdvaW5nSHR0cEhlYWRlcnM+IHtcbiAgICBjb25zdCB7IGhvc3QsIG9yaWdpbiB9ID0gdXJsO1xuXG4gICAgY29uc3QgcHJlcGFyZWRIZWFkZXJzOiBPdXRnb2luZ0h0dHBIZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BQ0NFUFQsIGNoYW5nZUhlYWRlck5hbWVzVG9Mb3dlcmNhc2UoaGVhZGVycykpO1xuXG5cbiAgICBwcmVwYXJlZEhlYWRlcnNbSFRUUF9IRUFERVJTLmhvc3RdID0gaG9zdDtcbiAgICBwcmVwYXJlZEhlYWRlcnNbSFRUUF9IRUFERVJTLm9yaWdpbl0gPSBvcmlnaW47XG4gICAgcHJlcGFyZWRIZWFkZXJzW0hUVFBfSEVBREVSUy5jb250ZW50TGVuZ3RoXSA9IGJvZHkubGVuZ3RoO1xuXG4gICAgaWYgKGhlYWRlcnMubWV0aG9kICYmIE1FVEhPRFNfV0lUSF9DT05URU5UX1RZUEUuaW5jbHVkZXMoU3RyaW5nKGhlYWRlcnMubWV0aG9kKSkpXG4gICAgICAgIHByZXBhcmVkSGVhZGVyc1tIVFRQX0hFQURFUlMuY29udGVudFR5cGVdID0gQ09OVEVOVF9UWVBFUy51cmxlbmNvZGVkO1xuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCAmJiB3aXRoQ3JlZGVudGlhbHMpXG4gICAgICAgIHByZXBhcmVkSGVhZGVyc1tIVFRQX0hFQURFUlMuYXV0aG9yaXphdGlvbl0gPSBnZXRBdXRoU3RyaW5nKG9wdGlvbnMuYXV0aCk7XG5cbiAgICBpZiAob3B0aW9ucy5wcm94eT8uYXV0aClcbiAgICAgICAgcHJlcGFyZWRIZWFkZXJzW0hUVFBfSEVBREVSUy5wcm94eUF1dGhvcml6YXRpb25dID0gZ2V0QXV0aFN0cmluZyhvcHRpb25zLnByb3h5LmF1dGgpO1xuXG4gICAgaWYgKHdpdGhDcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZUNvb2tpZXMgPSB0ZXN0UnVuLnNlc3Npb24uY29va2llcy5nZXRIZWFkZXIoe1xuICAgICAgICAgICAgdXJsOiAgICAgIGN1cnJlbnRQYWdlVXJsLmhyZWYsXG4gICAgICAgICAgICBob3N0bmFtZTogY3VycmVudFBhZ2VVcmwuaG9zdG5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjdXJyZW50UGFnZUNvb2tpZXMpXG4gICAgICAgICAgICBwcmVwYXJlZEhlYWRlcnNbSFRUUF9IRUFERVJTLmNvb2tpZV0gPSBjdXJyZW50UGFnZUNvb2tpZXM7XG4gICAgfVxuXG4gICAgLy9OT1RFOiBBZGRpdGlvbmFsIGhlYWRlciB0byByZWNvZ25pemUgQVBJIHJlcXVlc3RzIGluIHRoZSBoYW1tZXJoZWFkXG4gICAgcHJlcGFyZWRIZWFkZXJzW0hUVFBfSEVBREVSUy5pc0FwaVJlcXVlc3RdID0gJ3RydWUnO1xuXG4gICAgcmV0dXJuIHByZXBhcmVkSGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZVVybCAodGVzdFJ1bjogVGVzdFJ1biwgY3VycmVudFBhZ2VVcmw6IFVSTCwgdXJsOiBzdHJpbmcgfCBVUkwsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCB8IG51bGwpOiBQcm9taXNlPFVSTD4ge1xuICAgIGxldCBwcmVwYXJlZFVybDogVVJMO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcHJlcGFyZWRVcmwgPSB1cmwgaW5zdGFuY2VvZiBVUkxcbiAgICAgICAgICAgID8gdXJsXG4gICAgICAgICAgICA6IG5ldyBVUkwodXJsLCBjdXJyZW50UGFnZVVybC5ob3N0bmFtZSA/IGN1cnJlbnRQYWdlVXJsLm9yaWdpbiA6IHZvaWQgMCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihjYWxsc2l0ZSwgUlVOVElNRV9FUlJPUlMucmVxdWVzdFVybEludmFsaWRWYWx1ZUVycm9yLCB1cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBwcmVwYXJlZFVybDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVNlYXJjaFBhcmFtcyAodXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtcyk6IHN0cmluZyB7XG4gICAgaWYgKCFwYXJhbXMpXG4gICAgICAgIHJldHVybiB1cmw7XG5cbiAgICBsZXQgc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXM7XG5cbiAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKVxuICAgICAgICBzZWFyY2hQYXJhbXMgPSBwYXJhbXM7XG4gICAgZWxzZSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zW2tleV0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNhc3RBcnJheShwYXJhbXNba2V5XSkuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdHlwZW9mIHYgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodikgOiBTdHJpbmcodikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dXJsfSR7dXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyd9JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRQcm94eVVybCAodGVzdFJ1bjogVGVzdFJ1biwgdXJsOiBzdHJpbmcsIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0ZXN0UnVuLmV4ZWN1dGVDb21tYW5kKG5ldyBHZXRQcm94eVVybENvbW1hbmQoe1xuICAgICAgICB1cmw6ICAgICB1cmwsXG4gICAgICAgIG9wdGlvbnM6IHsgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/IENyZWRlbnRpYWxzLmluY2x1ZGUgOiBDcmVkZW50aWFscy5vbWl0IH0sXG4gICAgfSwgdGVzdFJ1biwgdHJ1ZSkpIGFzIFByb21pc2U8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zIChjdXJyZW50UGFnZVVybDogVVJMLCB0ZXN0UnVuOiBUZXN0UnVuLCBvcHRpb25zOiBFeHRlcm5hbFJlcXVlc3RPcHRpb25zLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQgfCBudWxsKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9ucz4ge1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcblxuICAgIGNvbnN0IHVybCAgICAgICAgICAgICA9IGF3YWl0IHByZXBhcmVVcmwodGVzdFJ1biwgY3VycmVudFBhZ2VVcmwsIG9wdGlvbnMudXJsLCBjYWxsc2l0ZSk7XG4gICAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gIWN1cnJlbnRQYWdlVXJsLmhvc3QgfHwgc2FtZU9yaWdpbkNoZWNrKGN1cnJlbnRQYWdlVXJsLmhyZWYsIHVybC5ocmVmKSB8fCBvcHRpb25zLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICBjb25zdCBib2R5ICAgICAgICAgICAgPSB0cmFuc2Zvcm1Cb2R5KG9wdGlvbnMuaGVhZGVycywgb3B0aW9ucy5ib2R5KTtcbiAgICBjb25zdCBoZWFkZXJzICAgICAgICAgPSBhd2FpdCBwcmVwYXJlSGVhZGVycyhvcHRpb25zLmhlYWRlcnMsIGN1cnJlbnRQYWdlVXJsLCB1cmwsIGJvZHksIHRlc3RSdW4sIHdpdGhDcmVkZW50aWFscywgb3B0aW9ucyk7XG4gICAgY29uc3QgcHJveHlVcmwgICAgICAgID0gYXdhaXQgZ2V0UHJveHlVcmwodGVzdFJ1biwgdXJsLmhyZWYsIHdpdGhDcmVkZW50aWFscyk7XG4gICAgY29uc3QgcHJveHlVcmxPYmogICAgID0gcGFyc2VQcm94eVVybChwcm94eVVybCk7XG4gICAgbGV0IGF1dGggICAgICAgICAgICAgID0gb3B0aW9ucy5hdXRoO1xuXG4gICAgaWYgKCFhdXRoICYmIHVybC51c2VybmFtZSAmJiB1cmwucGFzc3dvcmQpIHtcbiAgICAgICAgYXV0aCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1cmwudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogdXJsLnBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXM6IFJlcXVlc3RPcHRpb25zUGFyYW1zID0ge1xuICAgICAgICBtZXRob2Q6ICAgICAgICAgb3B0aW9ucy5tZXRob2QgfHwgREVGQVVMVF9SRVFVRVNUX01FVEhPRCxcbiAgICAgICAgdXJsOiAgICAgICAgICAgIHByb3h5VXJsLFxuICAgICAgICBwcm90b2NvbDogICAgICAgREVGQVVMVF9QUk9UT0NPTCxcbiAgICAgICAgaG9zdG5hbWU6ICAgICAgIHByb3h5VXJsT2JqLnByb3h5Lmhvc3RuYW1lLFxuICAgICAgICBob3N0OiAgICAgICAgICAgcHJveHlVcmxPYmoucHJveHkuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6ICAgICAgICAgICBwcm94eVVybE9iai5wcm94eS5wb3J0LFxuICAgICAgICBwYXRoOiAgICAgICAgICAgcHJlcGFyZVNlYXJjaFBhcmFtcyhwcm94eVVybE9iai5wYXJ0QWZ0ZXJIb3N0LCBvcHRpb25zLnBhcmFtcyksXG4gICAgICAgIGF1dGg6ICAgICAgICAgICBhdXRoICYmIHdpdGhDcmVkZW50aWFscyA/IGAke2F1dGgudXNlcm5hbWV9OiR7YXV0aC5wYXNzd29yZH1gIDogdm9pZCAwLFxuICAgICAgICBoZWFkZXJzOiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICAgIHdpdGhDcmVkZW50aWFscyA/IHRlc3RSdW4uc2Vzc2lvbi5nZXRBdXRoQ3JlZGVudGlhbHMoKSA6IHZvaWQgMCxcbiAgICAgICAgYm9keTogICAgICAgICAgIGJvZHksXG4gICAgICAgIGRpc2FibGVIdHRwMjogICB0ZXN0UnVuLnNlc3Npb24uaXNIdHRwMkRpc2FibGVkKCksXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0OiB7XG4gICAgICAgICAgICBhamF4OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgICAgICAgICBwYWdlOiBvcHRpb25zLnRpbWVvdXQsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLnByb3h5KSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMuZXh0ZXJuYWxQcm94eVNldHRpbmdzID0ge1xuICAgICAgICAgICAgaG9zdDogICAgICBvcHRpb25zLnByb3h5Lmhvc3QsXG4gICAgICAgICAgICBob3N0bmFtZTogIG9wdGlvbnMucHJveHkuaG9zdCxcbiAgICAgICAgICAgIHBvcnQ6ICAgICAgb3B0aW9ucy5wcm94eS5wb3J0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwcm94eUF1dGg6IG9wdGlvbnMucHJveHkuYXV0aCA/IGAke29wdGlvbnMucHJveHkuYXV0aC51c2VybmFtZX06JHtvcHRpb25zLnByb3h5LmF1dGgucGFzc3dvcmR9YCA6IHZvaWQgMCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0UGFyYW1zLnByb3RvY29sID0gdXJsLnByb3RvY29sO1xuICAgICAgICByZXF1ZXN0UGFyYW1zLmhvc3QgICAgID0gdXJsLmhvc3Q7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMuaG9zdG5hbWUgPSB1cmwuaG9zdG5hbWU7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMucG9ydCAgICAgPSB1cmwucG9ydDtcbiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXRoICAgICA9IHByZXBhcmVTZWFyY2hQYXJhbXModXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCwgb3B0aW9ucy5wYXJhbXMpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUmVxdWVzdE9wdGlvbnMocmVxdWVzdFBhcmFtcyk7XG59XG4iXX0=