"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const test_run_tracker_1 = __importDefault(require("../../api/test-run-tracker")); const test_controller_1 = __importDefault(require("../../api/test-controller")); const observed_callsites_storage_1 = __importDefault(require("../../test-run/observed-callsites-storage")); const warning_log_1 = __importDefault(require("../../notifications/warning-log")); const type_1 = __importDefault(require("../../test-run/commands/type")); const base_1 = require("../../test-run/commands/base"); const testcafe_hammerhead_1 = require("testcafe-hammerhead"); const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise")); const async_event_emitter_1 = __importDefault(require("../../utils/async-event-emitter")); const marker_symbol_1 = __importDefault(require("../../test-run/marker-symbol")); const constants_1 = require("../../test-run/execute-js-expression/constants"); const marker_1 = require("../serialization/replicator/transforms/function-marker-transform/marker"); const get_fn_1 = __importDefault(require("../../assertions/get-fn")); const thennable_1 = require("../../utils/thennable"); const marker_2 = require("../serialization/replicator/transforms/promise-marker-transform/marker"); const observation_1 = require("../../test-run/commands/observation"); class TestRunProxy extends async_event_emitter_1.default { constructor({ dispatcher, id, test, options, browser, activeWindowId, messageBus }) { super(); this.debugging = false; this[marker_symbol_1.default] = true; this.dispatcher = dispatcher; this.id = id; this.test = test; this.ctx = Object.create(null); this.fixtureCtx = Object.create(null); this._options = options; this.browser = browser; this.assertionCommands = new Map(); this.switchToWindowByPredicateCommands = new Map(); this.asyncJsExpressionCallsites = new Map(); this.controller = new test_controller_1.default(this); this.observedCallsites = new observed_callsites_storage_1.default(); this.warningLog = new warning_log_1.default(null, warning_log_1.default.createAddWarningCallback(messageBus)); this.disableMultipleWindows = options.disableMultipleWindows; this.activeWindowId = activeWindowId; test_run_tracker_1.default.addActiveTestRun(this); this._initializeRequestHooks(); } _initializeRequestHooks() { this.test.requestHooks.forEach(this._attachWarningLog, this); } _attachWarningLog(hook) { hook._warningLog = this.warningLog; } _detachWarningLog(hook) { hook._warningLog = null; } _storeAssertionCommand(command) { command.id = (0, testcafe_hammerhead_1.generateUniqueId)(); this.assertionCommands.set(command.id, command); } _storeSwitchToWindowByPredicateCommand(command) { command.id = (0, testcafe_hammerhead_1.generateUniqueId)(); this.switchToWindowByPredicateCommands.set(command.id, command); } _handleAssertionCommand(command) { if ((0, lodash_1.isFunction)(command.actual)) { command.originActual = command.actual; command.actual = new marker_1.FunctionMarker(); this._storeAssertionCommand(command); } else if (command.actual instanceof re_executable_promise_1.default) this._storeAssertionCommand(command); else if ((0, thennable_1.isThennable)(command.actual)) { command.originActual = command.actual; command.actual = new marker_2.PromiseMarker(); this._storeAssertionCommand(command); } } _handleExecuteClientFunctionCommandBase(command) { command.esmRuntime = this.test.esmRuntime; } _storeActionCallsitesForExecutedAsyncJsExpression(callsite) { // @ts-ignore if ((callsite === null || callsite === void 0 ? void 0 : callsite.filename) !== constants_1.ERROR_FILENAME) return; const id = (0, testcafe_hammerhead_1.generateUniqueId)(); // @ts-ignore callsite.id = id; this.asyncJsExpressionCallsites.set(id, callsite); } async executeCommand(command, callsite) { if (command instanceof base_1.ActionCommandBase && callsite) this._storeActionCallsitesForExecutedAsyncJsExpression(callsite); if (command.type === type_1.default.assertion) this._handleAssertionCommand(command); else if (command.type === type_1.default.useRole) this.dispatcher.onRoleAppeared(command.role); else if (command.type === type_1.default.switchToWindowByPredicate) this._storeSwitchToWindowByPredicateCommand(command); else if (command instanceof observation_1.ExecuteClientFunctionCommandBase) this._handleExecuteClientFunctionCommandBase(command); return this.dispatcher.executeCommand({ command, callsite, id: this.id, }); } executeCommandSync(command, callsite) { if (command.type === type_1.default.assertion) this._handleAssertionCommand(command); else if (command.type === type_1.default.useRole) this.dispatcher.onRoleAppeared(command.role); return this.dispatcher.executeCommandSync({ command, callsite, id: this.id, }); } async addRequestHook(hook) { if (this.test.requestHooks.includes(hook)) return; this.test.requestHooks.push(hook); this._attachWarningLog(hook); await this.dispatcher.addRequestEventListeners({ hookId: hook.id, hookClassName: hook._className, rules: hook._requestFilterRules, }); } async removeRequestHook(hook) { if (!this.test.requestHooks.includes(hook)) return; (0, lodash_1.pull)(this.test.requestHooks, hook); this._detachWarningLog(hook); await this.dispatcher.removeRequestEventListeners({ rules: hook._requestFilterRules }); } async getAssertionActualValue(commandId) { const command = this.assertionCommands.get(commandId); return command.actual._reExecute(); } async executeAssertionFn(commandId) { const command = this.assertionCommands.get(commandId); command.actual = command.originActual; const fn = (0, get_fn_1.default)(command); return await fn(); } restoreOriginCallsiteForError(err) { err.errCallsite = this.asyncJsExpressionCallsites.get(err.errCallsite.id); this.asyncJsExpressionCallsites.clear(); } checkWindow(commandId, { title, url }) { const command = this.switchToWindowByPredicateCommands.get(commandId); return command.checkWindow({ title, url }); } } exports.default = TestRunProxy; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY29tcGlsZXIvdGVzdC1ydW4tcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBMEM7QUFDMUMsa0ZBQXdEO0FBRXhELGdGQUF1RDtBQUN2RCwyR0FBaUY7QUFDakYsa0ZBQXlEO0FBR3pELHdFQUF3RDtBQUN4RCx1REFBOEU7QUFJOUUsNkRBQXVEO0FBU3ZELDhGQUFvRTtBQUNwRSwwRkFBZ0U7QUFDaEUsaUZBQXlEO0FBQ3pELDhFQUFnRjtBQUVoRixvR0FBeUc7QUFDekcscUVBQTRDO0FBQzVDLHFEQUFvRDtBQUNwRCxtR0FBdUc7QUFDdkcscUVBQXVGO0FBRXZGLE1BQU0sWUFBYSxTQUFRLDZCQUFpQjtJQW1CeEMsWUFBb0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQW9CO1FBQ3hHLEtBQUssRUFBRSxDQUFDO1FBWkwsY0FBUyxHQUFHLEtBQUssQ0FBQztRQWNyQixJQUFJLENBQUMsdUJBQWEsQ0FBQyxHQUFzQixJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBMEIsVUFBVSxDQUFDO1FBQ3BELElBQUksQ0FBQyxFQUFFLEdBQWtDLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFnQyxJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLEdBQUcsR0FBaUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxHQUEwQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQTRCLE9BQU8sQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUE2QixPQUFPLENBQUM7UUFDakQsSUFBSSxDQUFDLGlC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LENBQUUsU0FBaUI7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQXFCLENBQUM7UUFFMUUsT0FBUSxPQUFPLENBQUMsTUFBOEIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFFLFNBQWlCO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFxQixDQUFDO1FBRTFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUV0QyxNQUFNLEVBQUUsR0FBRyxJQUFBLGdCQUFLLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUIsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSw2QkFBNkIsQ0FBRSxHQUF3QztRQUMxRSxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVNLFdBQVcsQ0FBRSxTQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBNEI7UUFDM0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQXFDLENBQUM7UUFFMUcsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNKO0FBRUQsa0JBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHVsbCwgaXNGdW5jdGlvbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgdGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IHsgVGVzdFJ1bkRpc3BhdGNoZXJQcm90b2NvbCB9IGZyb20gJy4vcHJvdG9jb2wnO1xuaW1wb3J0IFRlc3RDb250cm9sbGVyIGZyb20gJy4uLy4uL2FwaS90ZXN0LWNvbnRyb2xsZXInO1xuaW1wb3J0IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9vYnNlcnZlZC1jYWxsc2l0ZXMtc3RvcmFnZSc7XG5pbXBvcnQgV2FybmluZ0xvZyBmcm9tICcuLi8uLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbG9nJztcbmltcG9ydCB7IEFzc2VydGlvbkNvbW1hbmQgfSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9jb21tYW5kcy9hc3NlcnRpb24nO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ09NTUFORF9UWVBFIGZyb20gJy4uLy4uL3Rlc3QtcnVuL2NvbW1hbmRzL3R5cGUnO1xuaW1wb3J0IHsgQWN0aW9uQ29tbWFuZEJhc2UsIENvbW1hbmRCYXNlIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvYmFzZSc7XG5pbXBvcnQgeyBUZXN0UnVuUHJveHlJbml0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IFJlcXVlc3RIb29rIGZyb20gJy4uLy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2hvb2snO1xuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgQ2FsbHNpdGVSZWNvcmQgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuXG5pbXBvcnQge1xuICAgIENoZWNrV2luZG93UHJlZGljYXRlRGF0YSxcbiAgICBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCxcbiAgICBVc2VSb2xlQ29tbWFuZCxcbn0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvYWN0aW9ucyc7XG5cbmltcG9ydCBSZUV4ZWN1dGFibGVQcm9taXNlIGZyb20gJy4uLy4uL3V0aWxzL3JlLWV4ZWN1dGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgQXN5bmNFdmVudEVtaXR0ZXIgZnJvbSAnLi4vLi4vdXRpbHMvYXN5bmMtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgdGVzdFJ1bk1hcmtlciBmcm9tICcuLi8uLi90ZXN0LXJ1bi9tYXJrZXItc3ltYm9sJztcbmltcG9ydCB7IEVSUk9SX0ZJTEVOQU1FIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vZXhlY3V0ZS1qcy1leHByZXNzaW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBVbmNhdWdodFRlc3RDYWZlRXJyb3JJbkN1c3RvbVNjcmlwdCB9IGZyb20gJy4uLy4uL2Vycm9ycy90ZXN0LXJ1bic7XG5pbXBvcnQgeyBGdW5jdGlvbk1hcmtlciB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vcmVwbGljYXRvci90cmFuc2Zvcm1zL2Z1bmN0aW9uLW1hcmtlci10cmFuc2Zvcm0vbWFya2VyJztcbmltcG9ydCBnZXRGbiBmcm9tICcuLi8uLi9hc3NlcnRpb25zL2dldC1mbic7XG5pbXBvcnQgeyBpc1RoZW5uYWJsZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RoZW5uYWJsZSc7XG5pbXBvcnQgeyBQcm9taXNlTWFya2VyIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9yZXBsaWNhdG9yL3RyYW5zZm9ybXMvcHJvbWlzZS1tYXJrZXItdHJhbnNmb3JtL21hcmtlcic7XG5pbXBvcnQgeyBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSB9IGZyb20gJy4uLy4uL3Rlc3QtcnVuL2NvbW1hbmRzL29ic2VydmF0aW9uJztcblxuY2xhc3MgVGVzdFJ1blByb3h5IGV4dGVuZHMgQXN5bmNFdmVudEVtaXR0ZXIge1xuICAgIHByaXZhdGUgW3Rlc3RSdW5NYXJrZXJdOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBjb250cm9sbGVyOiBUZXN0Q29udHJvbGxlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb2JzZXJ2ZWRDYWxsc2l0ZXM6IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwdWJsaWMgZml4dHVyZUN0eDogb2JqZWN0O1xuICAgIHB1YmxpYyBkZWJ1Z2dpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc3BhdGNoZXI6IFRlc3RSdW5EaXNwYXRjaGVyUHJvdG9jb2w7XG4gICAgcHVibGljIGN0eDogb2JqZWN0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXNzZXJ0aW9uQ29tbWFuZHM6IE1hcDxzdHJpbmcsIEFzc2VydGlvbkNvbW1hbmQ+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmRzOiBNYXA8c3RyaW5nLCBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBhc3luY0pzRXhwcmVzc2lvbkNhbGxzaXRlczogTWFwPHN0cmluZywgQ2FsbHNpdGVSZWNvcmQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyOiBCcm93c2VyO1xuICAgIHB1YmxpYyByZWFkb25seSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHB1YmxpYyBhY3RpdmVXaW5kb3dJZDogbnVsbCB8IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyBkaXNwYXRjaGVyLCBpZCwgdGVzdCwgb3B0aW9ucywgYnJvd3NlciwgYWN0aXZlV2luZG93SWQsIG1lc3NhZ2VCdXMgfTogVGVzdFJ1blByb3h5SW5pdCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXNbdGVzdFJ1bk1hcmtlcl0gICAgICAgICAgICAgICAgICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyICAgICAgICAgICAgICAgICAgICAgICAgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlkO1xuICAgICAgICB0aGlzLnRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRlc3Q7XG4gICAgICAgIHRoaXMuY3R4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ICAgICAgICAgICAgICAgICAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9vcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuYnJvd3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnJvd3NlcjtcbiAgICAgICAgdGhpcy5hc3NlcnRpb25Db21tYW5kcyAgICAgICAgICAgICAgICAgPSBuZXcgTWFwPHN0cmluZywgQXNzZXJ0aW9uQ29tbWFuZD4oKTtcbiAgICAgICAgdGhpcy5zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZHMgPSBuZXcgTWFwPHN0cmluZywgU3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmQ+KCk7XG4gICAgICAgIHRoaXMuYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXMgICAgICAgID0gbmV3IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBUZXN0Q29udHJvbGxlcih0aGlzKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlZENhbGxzaXRlcyAgICAgICAgICAgICAgICAgPSBuZXcgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZyAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFdhcm5pbmdMb2cobnVsbCwgV2FybmluZ0xvZy5jcmVhdGVBZGRXYXJuaW5nQ2FsbGJhY2sobWVzc2FnZUJ1cykpO1xuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MgICAgICAgICAgICA9IG9wdGlvbnMuZGlzYWJsZU11bHRpcGxlV2luZG93cyBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmFjdGl2ZVdpbmRvd0lkICAgICAgICAgICAgICAgICAgICA9IGFjdGl2ZVdpbmRvd0lkO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLmFkZEFjdGl2ZVRlc3RSdW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVJlcXVlc3RIb29rcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVSZXF1ZXN0SG9va3MgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmZvckVhY2godGhpcy5fYXR0YWNoV2FybmluZ0xvZywgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXR0YWNoV2FybmluZ0xvZyAoaG9vazogUmVxdWVzdEhvb2spOiB2b2lkIHtcbiAgICAgICAgaG9vay5fd2FybmluZ0xvZyA9IHRoaXMud2FybmluZ0xvZztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRhY2hXYXJuaW5nTG9nIChob29rOiBSZXF1ZXN0SG9vayk6IHZvaWQge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdG9yZUFzc2VydGlvbkNvbW1hbmQgKGNvbW1hbmQ6IEFzc2VydGlvbkNvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgY29tbWFuZC5pZCA9IGdlbmVyYXRlVW5pcXVlSWQoKTtcblxuICAgICAgICB0aGlzLmFzc2VydGlvbkNvbW1hbmRzLnNldChjb21tYW5kLmlkLCBjb21tYW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdG9yZVN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kIChjb21tYW5kOiBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBjb21tYW5kLmlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xuXG4gICAgICAgIHRoaXMuc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmRzLnNldChjb21tYW5kLmlkLCBjb21tYW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVBc3NlcnRpb25Db21tYW5kIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbW1hbmQuYWN0dWFsKSkge1xuICAgICAgICAgICAgY29tbWFuZC5vcmlnaW5BY3R1YWwgPSBjb21tYW5kLmFjdHVhbDtcbiAgICAgICAgICAgIGNvbW1hbmQuYWN0dWFsICAgICAgID0gbmV3IEZ1bmN0aW9uTWFya2VyKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0b3JlQXNzZXJ0aW9uQ29tbWFuZChjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLmFjdHVhbCBpbnN0YW5jZW9mIFJlRXhlY3V0YWJsZVByb21pc2UpXG4gICAgICAgICAgICB0aGlzLl9zdG9yZUFzc2VydGlvbkNvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgZWxzZSBpZiAoaXNUaGVubmFibGUoY29tbWFuZC5hY3R1YWwpKSB7XG4gICAgICAgICAgICBjb21tYW5kLm9yaWdpbkFjdHVhbCA9IGNvbW1hbmQuYWN0dWFsO1xuICAgICAgICAgICAgY29tbWFuZC5hY3R1YWwgICAgICAgPSBuZXcgUHJvbWlzZU1hcmtlcigpO1xuXG4gICAgICAgICAgICB0aGlzLl9zdG9yZUFzc2VydGlvbkNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSAoY29tbWFuZDogRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZEJhc2UpOiB2b2lkIHtcbiAgICAgICAgY29tbWFuZC5lc21SdW50aW1lID0gdGhpcy50ZXN0LmVzbVJ1bnRpbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RvcmVBY3Rpb25DYWxsc2l0ZXNGb3JFeGVjdXRlZEFzeW5jSnNFeHByZXNzaW9uIChjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoY2FsbHNpdGU/LmZpbGVuYW1lICE9PSBFUlJPUl9GSUxFTkFNRSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBpZCA9IGdlbmVyYXRlVW5pcXVlSWQoKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNhbGxzaXRlLmlkID0gaWQ7XG5cbiAgICAgICAgdGhpcy5hc3luY0pzRXhwcmVzc2lvbkNhbGxzaXRlcy5zZXQoaWQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlIHwgQWN0aW9uQ29tbWFuZEJhc2UsIGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQgfCBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBY3Rpb25Db21tYW5kQmFzZSAmJiBjYWxsc2l0ZSlcbiAgICAgICAgICAgIHRoaXMuX3N0b3JlQWN0aW9uQ2FsbHNpdGVzRm9yRXhlY3V0ZWRBc3luY0pzRXhwcmVzc2lvbihjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmFzc2VydGlvbilcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUFzc2VydGlvbkNvbW1hbmQoY29tbWFuZCBhcyBBc3NlcnRpb25Db21tYW5kKTtcbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudXNlUm9sZSlcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5vblJvbGVBcHBlYXJlZCgoY29tbWFuZCBhcyBVc2VSb2xlQ29tbWFuZCkucm9sZSk7XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUpXG4gICAgICAgICAgICB0aGlzLl9zdG9yZVN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKGNvbW1hbmQgYXMgU3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmQpO1xuICAgICAgICBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZEJhc2UpXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZShjb21tYW5kKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyLmV4ZWN1dGVDb21tYW5kKHtcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICBjYWxsc2l0ZSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhlY3V0ZUNvbW1hbmRTeW5jIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogdW5rbm93biB7XG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5hc3NlcnRpb24pXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVBc3NlcnRpb25Db21tYW5kKGNvbW1hbmQgYXMgQXNzZXJ0aW9uQ29tbWFuZCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnVzZVJvbGUpXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIub25Sb2xlQXBwZWFyZWQoKGNvbW1hbmQgYXMgVXNlUm9sZUNvbW1hbmQpLnJvbGUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXIuZXhlY3V0ZUNvbW1hbmRTeW5jKHtcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICBjYWxsc2l0ZSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudGVzdC5yZXF1ZXN0SG9va3MucHVzaChob29rKTtcbiAgICAgICAgdGhpcy5fYXR0YWNoV2FybmluZ0xvZyhob29rKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHtcbiAgICAgICAgICAgIGhvb2tJZDogICAgICAgIGhvb2suaWQsXG4gICAgICAgICAgICBob29rQ2xhc3NOYW1lOiBob29rLl9jbGFzc05hbWUsXG4gICAgICAgICAgICBydWxlczogICAgICAgICBob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHB1bGwodGhpcy50ZXN0LnJlcXVlc3RIb29rcywgaG9vayk7XG4gICAgICAgIHRoaXMuX2RldGFjaFdhcm5pbmdMb2coaG9vayk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyh7IHJ1bGVzOiBob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEFzc2VydGlvbkFjdHVhbFZhbHVlIChjb21tYW5kSWQ6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5hc3NlcnRpb25Db21tYW5kcy5nZXQoY29tbWFuZElkKSBhcyBBc3NlcnRpb25Db21tYW5kO1xuXG4gICAgICAgIHJldHVybiAoY29tbWFuZC5hY3R1YWwgYXMgUmVFeGVjdXRhYmxlUHJvbWlzZSkuX3JlRXhlY3V0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQXNzZXJ0aW9uRm4gKGNvbW1hbmRJZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLmFzc2VydGlvbkNvbW1hbmRzLmdldChjb21tYW5kSWQpIGFzIEFzc2VydGlvbkNvbW1hbmQ7XG5cbiAgICAgICAgY29tbWFuZC5hY3R1YWwgPSBjb21tYW5kLm9yaWdpbkFjdHVhbDtcblxuICAgICAgICBjb25zdCBmbiA9IGdldEZuKGNvbW1hbmQpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlT3JpZ2luQ2FsbHNpdGVGb3JFcnJvciAoZXJyOiBVbmNhdWdodFRlc3RDYWZlRXJyb3JJbkN1c3RvbVNjcmlwdCk6IHZvaWQge1xuICAgICAgICBlcnIuZXJyQ2FsbHNpdGUgPSB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzLmdldChlcnIuZXJyQ2FsbHNpdGUuaWQpO1xuXG4gICAgICAgIHRoaXMuYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tXaW5kb3cgKGNvbW1hbmRJZDogc3RyaW5nLCB7IHRpdGxlLCB1cmwgfTogQ2hlY2tXaW5kb3dQcmVkaWNhdGVEYXRhKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kcy5nZXQoY29tbWFuZElkKSBhcyBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZDtcblxuICAgICAgICByZXR1cm4gY29tbWFuZC5jaGVja1dpbmRvdyh7IHRpdGxlLCB1cmwgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXN0UnVuUHJveHk7XG5cblxuIl19