testcafe 2.3.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/LICENSE +1 -1
- package/README.md +40 -46
- package/lib/api/test-controller/execution-context.js +4 -2
- package/lib/browser/connection/gateway.js +43 -1
- package/lib/browser/connection/index.js +24 -10
- package/lib/browser/connection/service-routes.js +3 -1
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +19 -5
- package/lib/browser/provider/index.js +4 -1
- package/lib/client/automation/deps/hammerhead.js +24 -0
- package/lib/client/automation/deps/testcafe-core.js +24 -0
- package/lib/client/automation/index.js +251 -54
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/automation/playback/press/get-key-info.js +44 -0
- package/lib/client/automation/playback/press/utils.js +142 -0
- package/lib/client/automation/utils/get-key-code.js +15 -0
- package/lib/client/automation/utils/get-key-identifier.js +14 -0
- package/lib/client/automation/utils/is-letter.js +7 -0
- package/lib/client/automation/utils/key-identifier-maps.js +93 -0
- package/lib/client/browser/idle-page/index.js +7 -2
- package/lib/client/core/index.js +46 -3
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/driver/index.js +45 -17
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/test-run/index.js.mustache +34 -30
- package/lib/client/ui/index.js +3230 -48
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.svg +15 -0
- package/lib/client/ui/styles.css +183 -41
- package/lib/live/test-runner.js +4 -2
- package/lib/proxyless/api-base.js +3 -2
- package/lib/proxyless/client/event-descriptor.js +67 -0
- package/lib/proxyless/client/input.js +36 -0
- package/lib/proxyless/client/key-press/utils.js +31 -0
- package/lib/proxyless/client/types.js +1 -1
- package/lib/proxyless/client/utils.js +32 -2
- package/lib/proxyless/cookie-provider.js +31 -3
- package/lib/proxyless/errors.js +20 -0
- package/lib/proxyless/index.js +2 -10
- package/lib/proxyless/request-pipeline/index.js +32 -3
- package/lib/proxyless/resource-injector.js +5 -4
- package/lib/proxyless/types.js +3 -2
- package/lib/proxyless/utils/cdp.js +4 -3
- package/lib/reporter/index.js +2 -1
- package/lib/runner/bootstrapper.js +8 -1
- package/lib/runner/index.js +57 -44
- package/lib/shared/utils/is-file-protocol.js +2 -2
- package/lib/test-run/commands/actions.js +2 -2
- package/lib/test-run/cookies/base.js +4 -1
- package/lib/test-run/cookies/provider.js +9 -2
- package/lib/test-run/execute-js-expression/index.js +4 -2
- package/lib/test-run/index.js +17 -12
- package/lib/test-run/request/create-request-options.js +23 -12
- package/lib/test-run/request/send.js +2 -3
- package/lib/utils/check-is-vm.js +58 -0
- package/package.json +9 -6
- package/lib/proxyless/client/event-simulator.js +0 -40
package/lib/runner/index.js
CHANGED
|
@@ -57,6 +57,7 @@ class Runner extends events_1.EventEmitter {
|
|
|
57
57
|
this.compilerService = compilerService;
|
|
58
58
|
this._options = {};
|
|
59
59
|
this._hasTaskErrors = false;
|
|
60
|
+
this._reporters = null;
|
|
60
61
|
this.apiMethodWasCalled = new flag_list_1.default([
|
|
61
62
|
option_names_1.default.src,
|
|
62
63
|
option_names_1.default.browsers,
|
|
@@ -157,6 +158,8 @@ class Runner extends events_1.EventEmitter {
|
|
|
157
158
|
await Promise.race(promises);
|
|
158
159
|
}
|
|
159
160
|
catch (err) {
|
|
161
|
+
await this._messageBus.emit('unhandled-rejection');
|
|
162
|
+
await Promise.all(reporters.map(reporter => reporter.taskInfo.pendingTaskDonePromise));
|
|
160
163
|
await this._disposeTaskAndRelatedAssets(task, browserSet, reporters, testedApp, runnableConfigurationId);
|
|
161
164
|
throw err;
|
|
162
165
|
}
|
|
@@ -430,6 +433,57 @@ class Runner extends events_1.EventEmitter {
|
|
|
430
433
|
if (!takeOnFails && reporterOptions && (0, lodash_1.castArray)(reporterOptions).some(reporter => reporter.name === DASHBOARD_REPORTER_NAME))
|
|
431
434
|
this.configuration.mergeOptions({ [option_names_1.default.screenshots]: { takeOnFails: true, autoTakeOnFails: true } });
|
|
432
435
|
}
|
|
436
|
+
_resetBeforeRun() {
|
|
437
|
+
this.apiMethodWasCalled.reset();
|
|
438
|
+
this._messageBus.clearListeners();
|
|
439
|
+
}
|
|
440
|
+
_getDashboardUrl() {
|
|
441
|
+
var _a;
|
|
442
|
+
const dashboardReporter = (_a = this._reporters.find(r => r.plugin.name === 'dashboard')) === null || _a === void 0 ? void 0 : _a.plugin;
|
|
443
|
+
return (dashboardReporter === null || dashboardReporter === void 0 ? void 0 : dashboardReporter.getReportUrl) ? dashboardReporter.getReportUrl() : '';
|
|
444
|
+
}
|
|
445
|
+
_prepareAndRunTask(options) {
|
|
446
|
+
const messageBusErrorPromise = (0, promisify_event_1.default)(this._messageBus, 'error');
|
|
447
|
+
const taskOptionsPromise = this._getRunTaskOptions(options);
|
|
448
|
+
const bindedTaskRunner = this._runTask.bind(this);
|
|
449
|
+
const runTaskPromise = taskOptionsPromise.then(bindedTaskRunner);
|
|
450
|
+
const promise = Promise.race([
|
|
451
|
+
runTaskPromise,
|
|
452
|
+
messageBusErrorPromise,
|
|
453
|
+
]);
|
|
454
|
+
return this._createCancelablePromise(promise);
|
|
455
|
+
}
|
|
456
|
+
async _prepareReporters() {
|
|
457
|
+
await this._addDashboardReporterIfNeeded();
|
|
458
|
+
await this._turnOnScreenshotsIfNeeded();
|
|
459
|
+
const reporterPlugins = await reporter_1.default.getReporterPlugins(this.configuration.getOption(option_names_1.default.reporter));
|
|
460
|
+
this._reporters = reporterPlugins.map(reporter => new reporter_1.default(reporter.plugin, this._messageBus, reporter.outStream, reporter.name));
|
|
461
|
+
await Promise.all(this._reporters.map(reporter => reporter.init()));
|
|
462
|
+
}
|
|
463
|
+
async _prepareOptions(options) {
|
|
464
|
+
this._options = Object.assign(this._options, options);
|
|
465
|
+
await this._setConfigurationOptions();
|
|
466
|
+
await this._prepareReporters();
|
|
467
|
+
await this._setBootstrapperOptions();
|
|
468
|
+
(0, log_entry_1.default)(DEBUG_LOGGER, this.configuration);
|
|
469
|
+
await this._validateRunOptions();
|
|
470
|
+
}
|
|
471
|
+
async _getRunTaskOptions(options) {
|
|
472
|
+
var _a;
|
|
473
|
+
await this._prepareOptions(options);
|
|
474
|
+
const { browserSet, tests, testedApp, commonClientScripts, id } = await this._createRunnableConfiguration();
|
|
475
|
+
await this._prepareClientScripts(tests, commonClientScripts);
|
|
476
|
+
const resultOptions = Object.assign(Object.assign({}, this.configuration.getOptions()), { dashboardUrl: this._getDashboardUrl() });
|
|
477
|
+
await ((_a = this.bootstrapper.compilerService) === null || _a === void 0 ? void 0 : _a.setOptions({ value: resultOptions }));
|
|
478
|
+
return {
|
|
479
|
+
browserSet,
|
|
480
|
+
tests,
|
|
481
|
+
testedApp,
|
|
482
|
+
runnableConfigurationId: id,
|
|
483
|
+
options: resultOptions,
|
|
484
|
+
reporters: this._reporters,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
433
487
|
async _getDashboardOptions() {
|
|
434
488
|
const storageOptions = await this._loadDashboardOptionsFromStorage();
|
|
435
489
|
const configOptions = this.configuration.getOption(option_names_1.default.dashboard);
|
|
@@ -561,49 +615,8 @@ class Runner extends events_1.EventEmitter {
|
|
|
561
615
|
return this;
|
|
562
616
|
}
|
|
563
617
|
run(options = {}) {
|
|
564
|
-
|
|
565
|
-
this.
|
|
566
|
-
this._messageBus.clearListeners();
|
|
567
|
-
const messageBusErrorPromise = (0, promisify_event_1.default)(this._messageBus, 'error');
|
|
568
|
-
this._options = Object.assign(this._options, options);
|
|
569
|
-
const runTaskPromise = Promise.resolve()
|
|
570
|
-
.then(() => this._setConfigurationOptions())
|
|
571
|
-
.then(async () => {
|
|
572
|
-
await this._addDashboardReporterIfNeeded();
|
|
573
|
-
await this._turnOnScreenshotsIfNeeded();
|
|
574
|
-
})
|
|
575
|
-
.then(() => reporter_1.default.getReporterPlugins(this.configuration.getOption(option_names_1.default.reporter)))
|
|
576
|
-
.then(reporterPlugins => {
|
|
577
|
-
reporters = reporterPlugins.map(reporter => new reporter_1.default(reporter.plugin, this._messageBus, reporter.outStream, reporter.name));
|
|
578
|
-
return Promise.all(reporters.map(reporter => reporter.init()));
|
|
579
|
-
})
|
|
580
|
-
.then(() => this._setBootstrapperOptions())
|
|
581
|
-
.then(() => {
|
|
582
|
-
(0, log_entry_1.default)(DEBUG_LOGGER, this.configuration);
|
|
583
|
-
return this._validateRunOptions();
|
|
584
|
-
})
|
|
585
|
-
.then(() => this._createRunnableConfiguration())
|
|
586
|
-
.then(async ({ browserSet, tests, testedApp, commonClientScripts, id }) => {
|
|
587
|
-
var _a, _b;
|
|
588
|
-
await this._prepareClientScripts(tests, commonClientScripts);
|
|
589
|
-
const dashboardReporter = (_a = reporters.find(r => r.plugin.name === 'dashboard')) === null || _a === void 0 ? void 0 : _a.plugin;
|
|
590
|
-
const dashboardUrl = (dashboardReporter === null || dashboardReporter === void 0 ? void 0 : dashboardReporter.getReportUrl) ? dashboardReporter.getReportUrl() : '';
|
|
591
|
-
const resultOptions = Object.assign(Object.assign({}, this.configuration.getOptions()), { dashboardUrl });
|
|
592
|
-
await ((_b = this.bootstrapper.compilerService) === null || _b === void 0 ? void 0 : _b.setOptions({ value: resultOptions }));
|
|
593
|
-
return this._runTask({
|
|
594
|
-
reporters,
|
|
595
|
-
browserSet,
|
|
596
|
-
tests,
|
|
597
|
-
testedApp,
|
|
598
|
-
options: resultOptions,
|
|
599
|
-
runnableConfigurationId: id,
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
|
-
const promises = [
|
|
603
|
-
runTaskPromise,
|
|
604
|
-
messageBusErrorPromise,
|
|
605
|
-
];
|
|
606
|
-
return this._createCancelablePromise(Promise.race(promises));
|
|
618
|
+
this._resetBeforeRun();
|
|
619
|
+
return this._prepareAndRunTask(options);
|
|
607
620
|
}
|
|
608
621
|
async stop() {
|
|
609
622
|
// NOTE: When taskPromise is cancelled, it is removed from
|
|
@@ -619,4 +632,4 @@ class Runner extends events_1.EventEmitter {
|
|
|
619
632
|
}
|
|
620
633
|
exports.default = Runner;
|
|
621
634
|
module.exports = exports.default;
|
|
622
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVubmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQXVEO0FBQ3ZELGtEQUEwQjtBQUMxQixzRUFBNkM7QUFDN0MsbUNBQXNDO0FBQ3RDLGlGQUFpRTtBQUVqRSxtQ0FPZ0I7QUFFaEIsa0VBQTBDO0FBQzFDLDJEQUFtQztBQUNuQyxrREFBMEI7QUFDMUIsaUZBQStEO0FBQy9ELCtDQUFpRDtBQUNqRCwyQ0FBaUQ7QUFDakQsdUVBQW1FO0FBQ25FLG9EQUFvRTtBQUNwRSwyRUFBa0Q7QUFDbEQsK0VBQXFEO0FBQ3JELDBEQUtnQztBQUVoQyxpRkFBeUQ7QUFDekQsbUVBQTBDO0FBQzFDLG1GQUEwRDtBQUMxRCx5RUFBOEQ7QUFDOUQsMERBQStEO0FBQy9ELDhGQUFvRTtBQUNwRSxxR0FBNEU7QUFDNUUsNENBQStFO0FBQy9FLHlFQUFnRDtBQUNoRCwrRUFBc0Q7QUFDdEQseUZBQWdFO0FBQ2hFLG1FQUE0RDtBQUM1RCxrREFBeUI7QUFDekIsaUZBQXdFO0FBQ3hFLHVFQUFzRDtBQUN0RCwwREFBMkI7QUFDM0IsNkVBQW9EO0FBQ3BELGdFQUE0RTtBQUM1RSxtRUFBMEM7QUFDMUMsdUVBQThDO0FBQzlDLG1GQUF5RDtBQUN6RCx3RUFBc0Y7QUFFdEYsTUFBTSxZQUFZLEdBQWMsSUFBQSxlQUFLLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN6RCxNQUFNLHVCQUF1QixHQUFHLFdBQVcsQ0FBQztBQUU1QyxNQUFxQixNQUFPLFNBQVEscUJBQVk7SUFDNUMsWUFBYSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFO1FBQzVFLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFdBQVcsR0FBVyxJQUFJLHFCQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFpQixLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBVSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEksSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFTLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxHQUFpQixhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxVQUFVLEdBQVksSUFBSSxxQkFBVSxDQUFDLElBQUksRUFBRSxxQkFBVSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxlQUFlLEdBQU8sZUFBZSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQWMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQVEsS0FBSyxDQUFDO1FBRWpDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLG1CQUFRLENBQUM7WUFDbkMsc0JBQVksQ0FBQyxHQUFHO1lBQ2hCLHNCQUFZLENBQUMsUUFBUTtZQUNyQixzQkFBWSxDQUFDLFFBQVE7WUFDckIsc0JBQVksQ0FBQyxhQUFhO1NBQzdCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxtQkFBbUIsQ0FBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGFBQWE7UUFDckYsT0FBTyxJQUFJLHNCQUFZLENBQUMsRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELGtCQUFrQixDQUFFLFVBQVU7UUFDMUIsT0FBTyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGlCQUFpQixDQUFFLFNBQVM7UUFDeEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxpQkFBaUIsQ0FBRSxTQUFTO1FBQ3hCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4RixDQUFDO0lBRUQsS0FBSyxDQUFDLDRCQUE0QixDQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSx1QkFBdUI7UUFDL0YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFekIsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELGNBQWMsQ0FBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDNUMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztZQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHNCQUFzQixDQUFFLEtBQUs7UUFDekIsS0FBSyxHQUFHLElBQUEsb0JBQU8sRUFBQyxLQUFLLENBQUMsQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ1YsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUUvQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsd0JBQXdCLENBQUUsV0FBVztRQUNqQyxNQUFNLE9BQU8sR0FBYSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBQSxhQUFNLEVBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFFLE9BQU87YUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDdkIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUIsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxXQUFXO2FBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyw2QkFBNkIsQ0FBRSxJQUFJLEVBQUUsdUJBQXVCOztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDckIsT0FBTztRQUVYLE1BQU0sQ0FBQSxNQUFBLElBQUksQ0FBQyxlQUFlLDBDQUFFLG9CQUFvQixDQUFDLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBLENBQUM7UUFFOUUsd0VBQXdFO1FBQ3hFLDJDQUEyQztRQUMzQywwRkFBMEY7UUFDMUYsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFJLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsV0FBVztJQUNYLG1CQUFtQixDQUFFLElBQUksRUFBRSxRQUFRO1FBQy9CLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRTdFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLGVBQWU7WUFDOUMsZUFBZSxHQUFHLENBQUMsQ0FBQztRQUV4QixPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsdUJBQXVCO1FBQ2pGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBQyxHQUFHLEVBQUMsRUFBRTtnQkFDcEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLEVBQUUsRUFBQyxFQUFFO29CQUNwRCxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QyxNQUFNLHNCQUFzQixHQUFHLElBQUEseUJBQWMsRUFBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkUsTUFBTSxnQkFBZ0IsR0FBUyxJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE1BQU0sc0JBQXNCLEdBQUcsSUFBQSx5QkFBYyxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekUsTUFBTSxnQkFBZ0IsR0FBUyxJQUFJLG9DQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFekYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ2hELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMzQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1AsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQztRQUVQLE1BQU0sUUFBUSxHQUFHO1lBQ2IsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixnQkFBZ0I7WUFDaEIsc0JBQXNCO1NBQ3pCLENBQUM7UUFFRixJQUFJLFNBQVM7WUFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxQyxJQUFJO1lBQ0EsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUV6RyxNQUFNLEdBQUcsQ0FBQztTQUNiO1FBRUQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFeEUsSUFBSSxnQkFBZ0IsQ0FBQyxtQkFBbUI7WUFDcEMsTUFBTSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztRQUUvQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFdBQVcsQ0FBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVO1FBQ2hFLE9BQU8sSUFBSSxjQUFJLENBQUM7WUFDWixLQUFLO1lBQ0wsdUJBQXVCO1lBQ3ZCLEtBQUs7WUFDTCxJQUFJO1lBQ0osZ0JBQWdCLEVBQUUsVUFBVTtZQUM1QixlQUFlLEVBQUcsSUFBSSxDQUFDLGVBQWU7WUFDdEMsVUFBVSxFQUFRLElBQUksQ0FBQyxXQUFXO1NBQ3JDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxRQUFRLENBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFO1FBQ25GLE1BQU0sSUFBSSxHQUFnQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMvRyxJQUFJLFNBQVMsR0FBYSxLQUFLLENBQUM7UUFFaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLHVDQUF1QixDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSw4QkFBYyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxNQUFNO29CQUNYLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUUvQixJQUFBLGlDQUFpQixHQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxzQ0FBc0IsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLHNDQUFzQixDQUFDLENBQUM7UUFFekMsTUFBTSxlQUFlLEdBQUcsR0FBRyxFQUFFO1lBQ3pCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBRXJDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDO1FBRUYsaUJBQWlCO2FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUNyQixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUIsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFNBQVM7Z0JBQ1YsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDakgsQ0FBQyxDQUFDO1FBRUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlLENBQUUsTUFBTTtRQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0UsTUFBTSwyQkFBMkIsR0FBRyxXQUFXLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxXQUFXO1lBQ3JFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksV0FBVyxJQUFJLElBQUEsbUJBQVUsRUFBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ILElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztnQkFDNUIsQ0FBQyxzQkFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLHNCQUFrQjthQUNqRCxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRCxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUM7WUFDaEIsT0FBTztRQUVYLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsMEJBQTBCO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0UsSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDO1lBQ3RCLE9BQU87UUFFWCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUM7WUFDeEUsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXBFLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0QsT0FBTyxPQUFPLFlBQVksb0JBQWlCO2dCQUN2QyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTztnQkFDM0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBQ3hDLENBQUMsQ0FBQztZQUNFLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsMkJBQTJCO1FBQ3ZCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVwRixJQUFJLENBQUMsbUJBQW1CO1lBQ3BCLE9BQU87UUFFWCxJQUFBLGdEQUErQixFQUFDLG1CQUFtQixFQUFFLHNCQUFZLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsNEJBQTRCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLGFBQWE7WUFDZCxPQUFPO1FBRVgsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRO1lBQ2pDLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUUxRSxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUM5QixJQUFJLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVU7Z0JBQ3pDLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDeEc7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQjtRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ3hELE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsSUFBSSxtQkFBRSxDQUFDLEdBQUc7WUFDTixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxJQUFJLG1CQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBQSx3QkFBYSxHQUFFO1lBQzVCLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCw2QkFBNkIsQ0FBRSxVQUFVO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWhFLElBQUksY0FBYyxLQUFLLEtBQUssQ0FBQztZQUN6QixPQUFPO1FBRVgsSUFBQSw0QkFBVSxFQUFDLG9CQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELDBCQUEwQjtRQUN0QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpFLElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQztZQUN0QixPQUFPO1FBRVgsSUFBQSw0QkFBVSxFQUFDLENBQUUsb0JBQUUsQ0FBQyxNQUFNLEVBQUUsb0JBQUUsQ0FBQyxLQUFLLENBQUUsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFckYsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO1lBQy9CLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhDLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzVDLElBQUEsNEJBQVUsRUFBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFakUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV0RyxJQUFJLENBQUMsSUFBSTtZQUNMLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxXQUFXO1lBQ1osV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsV0FBVztZQUNaLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDBCQUEwQjtRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTNELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWxHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxzQkFBWSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRTNGLElBQUksa0JBQWtCO1lBQ2xCLE9BQU87UUFFWCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztZQUV0RSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsc0JBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFBLGNBQVcsRUFBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNoRztRQUVELElBQUksV0FBVyxFQUFFO1lBQ2IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1lBRXRFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxzQkFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3BGO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUI7UUFDdkIsTUFBTSxTQUFTLEdBQWMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUU3RixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixJQUFJLFlBQVksSUFBSSxvQkFBb0I7Z0JBQ3BDLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUU5RixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsc0JBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFBLGNBQVcsRUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLHNCQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztTQUNsRjtRQUVELElBQUksWUFBWSxDQUFDLFVBQVU7WUFDdkIsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFBLGNBQVcsRUFBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7O1lBRS9ELFlBQVksQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFBLHVCQUFZLEdBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVU7WUFDeEIsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCx3QkFBd0I7UUFDcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsZUFBZTtZQUNoQixPQUFPO1FBRVgsTUFBTSxrQkFBa0IsR0FBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBcUIsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sY0FBYyxHQUFRLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFM0csSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQ3RCLE9BQU87UUFFWCxNQUFNLGVBQWUsR0FBRyxJQUFBLG9DQUEyQixFQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRixNQUFNLFlBQVksR0FBTSxJQUFBLHdCQUFlLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEQsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyxpQ0FBaUMsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELDZCQUE2QjtRQUN6QixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLG9CQUFvQjtZQUNyQixPQUFPO1FBRVgsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzRCxJQUFJLEdBQUc7WUFDSCxPQUFPO1FBRVgsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyRSxJQUFJLElBQUEsc0JBQVcsRUFBQyxRQUFRLENBQUM7WUFDckIsT0FBTztRQUVYLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsMEJBQTBCO1FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFakYsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRO1lBQ2xDLElBQUEsc0NBQXlCLEVBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsc0JBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxzQkFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNEJBQTRCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFlBQVk7YUFDbkIsMkJBQTJCLEVBQUU7YUFDN0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBRWhDLE9BQU8scUJBQXFCLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsdUJBQXVCLENBQUUsY0FBYyxFQUFFLFFBQVE7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLHlCQUFhLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFFekQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNO1lBQ3pCLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsa0NBQWtDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFBLGdDQUF3QixFQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUMxSixDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQWtCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDdkgsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQWlCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDN0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQWMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBZSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ2pJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQW1CLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDekgsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQWdCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDOUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBWSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1FBQ3ZJLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFnQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQVUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixHQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBb0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBWSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzRCxJQUFJLGVBQWUsR0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdFLDREQUE0RDtRQUM1RCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssS0FBSztZQUNoRSxPQUFPO1FBRVgsSUFBSSxDQUFDLGVBQWU7WUFDaEIsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUV6QixNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLHVCQUF1QixDQUFDLENBQUM7UUFFdEcsSUFBSSxDQUFDLGlCQUFpQjtZQUNsQixlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7O1lBRW5GLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztRQUVqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsc0JBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCwwQkFBMEI7UUFDdEIsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLElBQUksSUFBQSxrQkFBUyxFQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssdUJBQXVCLENBQUM7WUFDekgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLHNCQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDdEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLGFBQWEsR0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sVUFBVSxHQUFPLElBQUEseUJBQWEsR0FBRSxDQUFDO1FBRXZDLE9BQU8sSUFBQSxjQUFLLEVBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELEtBQUssQ0FBQyxnQ0FBZ0M7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSx3QkFBc0IsRUFBRSxDQUFDO1FBRTdDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXJCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFFLEtBQUssRUFBRSxhQUFhO1FBQzdDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUNiLE9BQU87WUFFWCxJQUFJLHVCQUF1QixHQUFHLE1BQU0sSUFBQSxjQUFpQixFQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRTNHLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUEscUJBQWEsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFFLFdBQVc7UUFDaEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxXQUFXLEVBQUU7WUFDL0IsSUFBSSxPQUFPLFlBQVksb0JBQWlCO2dCQUNwQyxTQUFTO1lBRWIsSUFBSSxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ2xFLE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBRSxXQUFXO1FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBQSwrQkFBb0IsRUFDeEMsR0FBRyxFQUFFLENBQUMsSUFBQSxtQ0FBVSxFQUFDLEVBQUUsQ0FBQyxFQUNwQiwrQkFBTSxDQUFDLHFDQUFxQyxFQUM1QztZQUNJLFdBQVcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLGVBQUk7U0FDekMsQ0FDSixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUs7WUFDTixPQUFPO1FBRVgsSUFBSSxnQkFBZ0I7WUFDaEIsTUFBTSxLQUFLLENBQUM7UUFFaEIsZ0JBQXFCLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ3pELENBQUM7SUFFRCxLQUFLLENBQUMsbUNBQW1DLENBQUUsaUJBQWlCO1FBQ3hELEtBQUssSUFBSSxXQUFXLElBQUksaUJBQWlCLEVBQUU7WUFDdkMsSUFBSSxXQUFXLFlBQVksb0JBQWlCO2dCQUN4QyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUUxQyxNQUFNLGNBQWMsR0FBTSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEcsSUFBSSxjQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLHNCQUFZLENBQ2xCLHNCQUFjLENBQUMsOENBQThDLEVBQzdELFdBQVcsQ0FBQyxLQUFLLENBQ3BCLENBQUM7YUFDTDtTQUNKO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0I7UUFDMUIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTTtJQUNOLGdCQUFnQixDQUFFLElBQUk7UUFDbEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFeEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEdBQUcsQ0FBRSxHQUFHLE9BQU87UUFDWCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHO1lBQzNCLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsOEJBQThCLEVBQUUsc0JBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1RixJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEdBQU8sSUFBSSxDQUFDO1FBRXZDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxRQUFRLENBQUUsR0FBRyxRQUFRO1FBQ2pCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVE7WUFDaEMsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyw4QkFBOEIsRUFBRSxzQkFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFhLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUV4QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFFLFdBQVc7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRXhDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxRQUFRLENBQUUsSUFBSSxFQUFFLE1BQU07UUFDbEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUTtZQUNoQyxNQUFNLElBQUksc0JBQVksQ0FBQyxzQkFBYyxDQUFDLDhCQUE4QixFQUFFLHNCQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFBLDJCQUFnQixFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQU8sSUFBSSxDQUFDO1FBRTVDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUUsTUFBTTtRQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsUUFBUSxDQUFFLEtBQUssRUFBRSxXQUFXO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFTLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFeEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBRSxHQUFHLE9BQU87UUFDbkIsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUUvQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1lBQ3BFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFFckYsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGVBQWU7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFjLElBQUksQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFZLENBQUMsWUFBWSxDQUFDLEdBQVcsT0FBTyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQVksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUVuRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsUUFBUSxDQUFFLE9BQU8sRUFBRSxTQUFTO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQVksQ0FBQyxVQUFVLENBQUMsR0FBSyxPQUFPLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsWUFBWSxDQUFFLElBQUk7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWhELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxhQUFhLENBQUUsR0FBRyxPQUFPO1FBQ3JCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWE7WUFDckMsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyw4QkFBOEIsRUFBRSxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRHLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBTyxJQUFJLENBQUM7UUFFakQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGVBQWUsQ0FBRSxJQUFJO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQVksQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFbkQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEdBQUcsQ0FBRSxPQUFPLEdBQUcsRUFBRTtRQUNiLElBQUksU0FBUyxDQUFDO1FBRWQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFbEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLHlCQUFjLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV0RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO2FBQ25DLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUMzQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDYixNQUFNLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNwQixTQUFTLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVoSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQzFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFBLG1CQUFRLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUzQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQzthQUMvQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTs7WUFDdEUsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFFN0QsTUFBTSxpQkFBaUIsR0FBRyxNQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsMENBQUUsTUFBTSxDQUFDO1lBQ3JGLE1BQU0sWUFBWSxHQUFRLENBQUEsaUJBQWlCLGFBQWpCLGlCQUFpQix1QkFBakIsaUJBQWlCLENBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRWxHLE1BQU0sYUFBYSxtQ0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUVsQyxZQUFZLEdBQ2YsQ0FBQztZQUVGLE1BQU0sQ0FBQSxNQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSwwQ0FBRSxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDO1lBRTlFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDakIsU0FBUztnQkFDVCxVQUFVO2dCQUNWLEtBQUs7Z0JBQ0wsU0FBUztnQkFDVCxPQUFPLEVBQWtCLGFBQWE7Z0JBQ3RDLHVCQUF1QixFQUFFLEVBQUU7YUFDOUIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFUCxNQUFNLFFBQVEsR0FBRztZQUNiLGNBQWM7WUFDZCxzQkFBc0I7U0FDekIsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDTiwwREFBMEQ7UUFDMUQsaUVBQWlFO1FBQ2pFLDRFQUE0RTtRQUM1RSw2REFBNkQ7UUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO1lBQ3RGLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFbEMsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNKO0FBOXdCRCx5QkE4d0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVzb2x2ZSBhcyByZXNvbHZlUGF0aCwgZGlybmFtZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBEYXNoYm9hcmRDb25maWdTdG9yYWdlIGZyb20gJy4uL2Rhc2hib2FyZC9jb25maWctc3RvcmFnZSc7XG5cbmltcG9ydCB7XG4gICAgZmxhdHRlbkRlZXAgYXMgZmxhdHRlbixcbiAgICBwdWxsIGFzIHJlbW92ZSxcbiAgICBpc0Z1bmN0aW9uLFxuICAgIHVuaXEsXG4gICAgY2FzdEFycmF5LFxuICAgIG1lcmdlLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgQm9vdHN0cmFwcGVyIGZyb20gJy4vYm9vdHN0cmFwcGVyJztcbmltcG9ydCBSZXBvcnRlciBmcm9tICcuLi9yZXBvcnRlcic7XG5pbXBvcnQgVGFzayBmcm9tICcuL3Rhc2snO1xuaW1wb3J0IGRlZmF1bHREZWJ1Z0xvZ2dlciBmcm9tICcuLi9ub3RpZmljYXRpb25zL2RlYnVnLWxvZ2dlcic7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyByZW5kZXJGb3JiaWRkZW5DaGFyc0xpc3QgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vdXRpbHMnO1xuaW1wb3J0IGRldGVjdEZGTVBFRyBmcm9tICcuLi91dGlscy9kZXRlY3QtZmZtcGVnJztcbmltcG9ydCBjaGVja0ZpbGVQYXRoIGZyb20gJy4uL3V0aWxzL2NoZWNrLWZpbGUtcGF0aCc7XG5pbXBvcnQge1xuICAgIGFkZFJ1bm5pbmdUZXN0LFxuICAgIHJlbW92ZVJ1bm5pbmdUZXN0LFxuICAgIHN0YXJ0SGFuZGxpbmdUZXN0RXJyb3JzLFxuICAgIHN0b3BIYW5kbGluZ1Rlc3RFcnJvcnMsXG59IGZyb20gJy4uL3V0aWxzL2hhbmRsZS1lcnJvcnMnO1xuXG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcbmltcG9ydCBGbGFnTGlzdCBmcm9tICcuLi91dGlscy9mbGFnLWxpc3QnO1xuaW1wb3J0IHByZXBhcmVSZXBvcnRlcnMgZnJvbSAnLi4vdXRpbHMvcHJlcGFyZS1yZXBvcnRlcnMnO1xuaW1wb3J0IGxvYWRDbGllbnRTY3JpcHRzIGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9sb2FkJztcbmltcG9ydCB7IHNldFVuaXF1ZVVybHMgfSBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvdXRpbHMnO1xuaW1wb3J0IFJlcG9ydGVyU3RyZWFtQ29udHJvbGxlciBmcm9tICcuL3JlcG9ydGVyLXN0cmVhbS1jb250cm9sbGVyJztcbmltcG9ydCBDdXN0b21pemFibGVDb21waWxlcnMgZnJvbSAnLi4vY29uZmlndXJhdGlvbi9jdXN0b21pemFibGUtY29tcGlsZXJzJztcbmltcG9ydCB7IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZywgZ2V0UGx1cmFsU3VmZml4IH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCBpc0xvY2FsaG9zdCBmcm9tICcuLi91dGlscy9pcy1sb2NhbGhvc3QnO1xuaW1wb3J0IFdhcm5pbmdMb2cgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLWxvZyc7XG5pbXBvcnQgYXV0aGVudGljYXRpb25IZWxwZXIgZnJvbSAnLi4vY2xpL2F1dGhlbnRpY2F0aW9uLWhlbHBlcic7XG5pbXBvcnQgeyBlcnJvcnMsIGZpbmRXaW5kb3cgfSBmcm9tICd0ZXN0Y2FmZS1icm93c2VyLXRvb2xzJztcbmltcG9ydCBpc0NJIGZyb20gJ2lzLWNpJztcbmltcG9ydCBSZW1vdGVCcm93c2VyUHJvdmlkZXIgZnJvbSAnLi4vYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9yZW1vdGUnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgT1MgZnJvbSAnb3MtZmFtaWx5JztcbmltcG9ydCBkZXRlY3REaXNwbGF5IGZyb20gJy4uL3V0aWxzL2RldGVjdC1kaXNwbGF5JztcbmltcG9ydCB7IHZhbGlkYXRlUXVhcmFudGluZU9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lJztcbmltcG9ydCBsb2dFbnRyeSBmcm9tICcuLi91dGlscy9sb2ctZW50cnknO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IGdldEVudk9wdGlvbnMgZnJvbSAnLi4vZGFzaGJvYXJkL2dldC1lbnYtb3B0aW9ucyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVNraXBKc0Vycm9yc09wdGlvblZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvZ2V0LW9wdGlvbnMvc2tpcC1qcy1lcnJvcnMnO1xuXG5jb25zdCBERUJVR19MT0dHRVIgICAgICAgICAgICA9IGRlYnVnKCd0ZXN0Y2FmZTpydW5uZXInKTtcbmNvbnN0IERBU0hCT0FSRF9SRVBPUlRFUl9OQU1FID0gJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJ1bm5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IgKHsgcHJveHksIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29uZmlndXJhdGlvbiwgY29tcGlsZXJTZXJ2aWNlIH0pIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzICAgICAgICAgPSBuZXcgTWVzc2FnZUJ1cygpO1xuICAgICAgICB0aGlzLnByb3h5ICAgICAgICAgICAgICAgPSBwcm94eTtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIgICAgICAgID0gdGhpcy5fY3JlYXRlQm9vdHN0cmFwcGVyKGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29tcGlsZXJTZXJ2aWNlLCB0aGlzLl9tZXNzYWdlQnVzLCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nVGFza1Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiAgICAgICA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIHRoaXMuaXNDbGkgICAgICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb24uX29wdGlvbnMgJiYgY29uZmlndXJhdGlvbi5fb3B0aW9ucy5pc0NsaTtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgID0gbmV3IFdhcm5pbmdMb2cobnVsbCwgV2FybmluZ0xvZy5jcmVhdGVBZGRXYXJuaW5nQ2FsbGJhY2sodGhpcy5fbWVzc2FnZUJ1cykpO1xuICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZSAgICAgPSBjb21waWxlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgICAgICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLl9oYXNUYXNrRXJyb3JzICAgICAgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZCA9IG5ldyBGbGFnTGlzdChbXG4gICAgICAgICAgICBPUFRJT05fTkFNRVMuc3JjLFxuICAgICAgICAgICAgT1BUSU9OX05BTUVTLmJyb3dzZXJzLFxuICAgICAgICAgICAgT1BUSU9OX05BTUVTLnJlcG9ydGVyLFxuICAgICAgICAgICAgT1BUSU9OX05BTUVTLmNsaWVudFNjcmlwdHMsXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVCb290c3RyYXBwZXIgKGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29tcGlsZXJTZXJ2aWNlLCBtZXNzYWdlQnVzLCBjb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQm9vdHN0cmFwcGVyKHsgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBjb21waWxlclNlcnZpY2UsIG1lc3NhZ2VCdXMsIGNvbmZpZ3VyYXRpb24gfSk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VCcm93c2VyU2V0IChicm93c2VyU2V0KSB7XG4gICAgICAgIHJldHVybiBicm93c2VyU2V0LmRpc3Bvc2UoKS5jYXRjaChlID0+IERFQlVHX0xPR0dFUihlKSk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VSZXBvcnRlcnMgKHJlcG9ydGVycykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVwb3J0ZXJzLm1hcChyZXBvcnRlciA9PiByZXBvcnRlci5kaXNwb3NlKCkuY2F0Y2goZSA9PiBERUJVR19MT0dHRVIoZSkpKSk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VUZXN0ZWRBcHAgKHRlc3RlZEFwcCkge1xuICAgICAgICByZXR1cm4gdGVzdGVkQXBwID8gdGVzdGVkQXBwLmtpbGwoKS5jYXRjaChlID0+IERFQlVHX0xPR0dFUihlKSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZGlzcG9zZVRhc2tBbmRSZWxhdGVkQXNzZXRzICh0YXNrLCBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCwgcnVubmFibGVDb25maWd1cmF0aW9uSWQpIHtcbiAgICAgICAgdGFzay5hYm9ydCgpO1xuICAgICAgICB0YXNrLnVuUmVnaXN0ZXJDbGllbnRTY3JpcHRSb3V0aW5nKCk7XG4gICAgICAgIHRhc2suY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5hYm9ydCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmFsaXplQ29tcGlsZXJTZXJ2aWNlU3RhdGUodGFzaywgcnVubmFibGVDb25maWd1cmF0aW9uSWQpO1xuICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlQXNzZXRzKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKTtcbiAgICB9XG5cbiAgICBfZGlzcG9zZUFzc2V0cyAoYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VCcm93c2VyU2V0KGJyb3dzZXJTZXQpLFxuICAgICAgICAgICAgdGhpcy5fZGlzcG9zZVJlcG9ydGVycyhyZXBvcnRlcnMpLFxuICAgICAgICAgICAgdGhpcy5fZGlzcG9zZVRlc3RlZEFwcCh0ZXN0ZWRBcHApLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBfcHJlcGFyZUFycmF5UGFyYW1ldGVyIChhcnJheSkge1xuICAgICAgICBhcnJheSA9IGZsYXR0ZW4oYXJyYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ2xpKVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA9PT0gMCA/IHZvaWQgMCA6IGFycmF5O1xuXG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2FuY2VsYWJsZVByb21pc2UgKHRhc2tQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgICAgICAgICAgID0gdGFza1Byb21pc2UudGhlbigoeyBjb21wbGV0aW9uUHJvbWlzZSB9KSA9PiBjb21wbGV0aW9uUHJvbWlzZSk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUZyb21QZW5kaW5nID0gKCkgPT4gcmVtb3ZlKHRoaXMucGVuZGluZ1Rhc2tQcm9taXNlcywgcHJvbWlzZSk7XG5cbiAgICAgICAgcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4ocmVtb3ZlRnJvbVBlbmRpbmcpXG4gICAgICAgICAgICAuY2F0Y2gocmVtb3ZlRnJvbVBlbmRpbmcpO1xuXG4gICAgICAgIHByb21pc2UuY2FuY2VsID0gKCkgPT4gdGFza1Byb21pc2VcbiAgICAgICAgICAgIC50aGVuKCh7IGNhbmNlbFRhc2sgfSkgPT4gY2FuY2VsVGFzaygpKVxuICAgICAgICAgICAgLnRoZW4ocmVtb3ZlRnJvbVBlbmRpbmcpO1xuXG4gICAgICAgIHRoaXMucGVuZGluZ1Rhc2tQcm9taXNlcy5wdXNoKHByb21pc2UpO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGFzeW5jIF9maW5hbGl6ZUNvbXBpbGVyU2VydmljZVN0YXRlICh0YXNrLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZXJTZXJ2aWNlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5yZW1vdmVVbml0c0Zyb21TdGF0ZSh7IHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkIH0pO1xuXG4gICAgICAgIC8vIE5PVEU6IEluIHNvbWUgY2FzZXMgKGJyb3dzZXIgcmVzdGFydCwgc3RvcCB0YXNrIG9uIGZpcnN0IGZhaWwsIGV0Yy4pLFxuICAgICAgICAvLyB0aGUgZml4dHVyZSBjb250ZXh0cyBtYXkgbm90IGJlIGRlbGV0ZWQuXG4gICAgICAgIC8vIFdlIHJlbW92ZSBhbGwgZml4dHVyZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGVzdCBleGVjdXRpb24gdG8gY2xlYW4gZm9yZ290dGVuIGNvbnRleHRzLlxuICAgICAgICBjb25zdCBmaXh0dXJlSWRzID0gdW5pcSh0YXNrLnRlc3RzLm1hcCh0ZXN0ID0+IHRlc3QuZml4dHVyZS5pZCkpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnJlbW92ZUZpeHR1cmVDdHhzRnJvbVN0YXRlKHsgZml4dHVyZUlkcyB9KTtcbiAgICB9XG5cbiAgICAvLyBSdW4gdGFza1xuICAgIF9nZXRGYWlsZWRUZXN0Q291bnQgKHRhc2ssIHJlcG9ydGVyKSB7XG4gICAgICAgIGxldCBmYWlsZWRUZXN0Q291bnQgPSByZXBvcnRlci50YXNrSW5mby50ZXN0Q291bnQgLSByZXBvcnRlci50YXNrSW5mby5wYXNzZWQ7XG5cbiAgICAgICAgaWYgKHRhc2sub3B0cy5zdG9wT25GaXJzdEZhaWwgJiYgISFmYWlsZWRUZXN0Q291bnQpXG4gICAgICAgICAgICBmYWlsZWRUZXN0Q291bnQgPSAxO1xuXG4gICAgICAgIHJldHVybiBmYWlsZWRUZXN0Q291bnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgX2dldFRhc2tSZXN1bHQgKHRhc2ssIGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCkge1xuICAgICAgICBpZiAoIXRhc2sub3B0cy5saXZlKSB7XG4gICAgICAgICAgICB0YXNrLm9uKCdicm93c2VyLWpvYi1kb25lJywgYXN5bmMgam9iID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChqb2IuYnJvd3NlckNvbm5lY3Rpb25zLm1hcChhc3luYyBiYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJyb3dzZXJTZXQucmVsZWFzZUNvbm5lY3Rpb24oYmMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5jbGVhckxpc3RlbmVycygnZXJyb3InKTtcblxuICAgICAgICBjb25zdCBicm93c2VyU2V0RXJyb3JQcm9taXNlID0gcHJvbWlzaWZ5RXZlbnQoYnJvd3NlclNldCwgJ2Vycm9yJyk7XG4gICAgICAgIGNvbnN0IHRhc2tFcnJvclByb21pc2UgICAgICAgPSBwcm9taXNpZnlFdmVudCh0YXNrLCAnZXJyb3InKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUJ1c0Vycm9yUHJvbWlzZSA9IHByb21pc2lmeUV2ZW50KHRoaXMuX21lc3NhZ2VCdXMsICdlcnJvcicpO1xuICAgICAgICBjb25zdCBzdHJlYW1Db250cm9sbGVyICAgICAgID0gbmV3IFJlcG9ydGVyU3RyZWFtQ29udHJvbGxlcih0aGlzLl9tZXNzYWdlQnVzLCByZXBvcnRlcnMpO1xuXG4gICAgICAgIGNvbnN0IHRhc2tEb25lUHJvbWlzZSA9IHRoaXMuX21lc3NhZ2VCdXMub25jZSgnZG9uZScpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBicm93c2VyU2V0RXJyb3JQcm9taXNlLmNhbmNlbCgpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXBvcnRlcnMubWFwKHJlcG9ydGVyID0+IHJlcG9ydGVyLnRhc2tJbmZvLnBlbmRpbmdUYXNrRG9uZVByb21pc2UpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgICAgICAgdGFza0RvbmVQcm9taXNlLFxuICAgICAgICAgICAgYnJvd3NlclNldEVycm9yUHJvbWlzZSxcbiAgICAgICAgICAgIHRhc2tFcnJvclByb21pc2UsXG4gICAgICAgICAgICBtZXNzYWdlQnVzRXJyb3JQcm9taXNlLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0ZXN0ZWRBcHApXG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRlc3RlZEFwcC5lcnJvclByb21pc2UpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VUYXNrQW5kUmVsYXRlZEFzc2V0cyh0YXNrLCBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCwgcnVubmFibGVDb25maWd1cmF0aW9uSWQpO1xuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlQXNzZXRzKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZmluYWxpemVDb21waWxlclNlcnZpY2VTdGF0ZSh0YXNrLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCk7XG5cbiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIubXVsdGlwbGVTdHJlYW1FcnJvcilcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUNvbnRyb2xsZXIubXVsdGlwbGVTdHJlYW1FcnJvcjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RmFpbGVkVGVzdENvdW50KHRhc2ssIHJlcG9ydGVyc1swXSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVRhc2sgKHRlc3RzLCBicm93c2VyQ29ubmVjdGlvbkdyb3VwcywgcHJveHksIG9wdHMsIHdhcm5pbmdMb2cpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYXNrKHtcbiAgICAgICAgICAgIHRlc3RzLFxuICAgICAgICAgICAgYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMsXG4gICAgICAgICAgICBwcm94eSxcbiAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICBydW5uZXJXYXJuaW5nTG9nOiB3YXJuaW5nTG9nLFxuICAgICAgICAgICAgY29tcGlsZXJTZXJ2aWNlOiAgdGhpcy5jb21waWxlclNlcnZpY2UsXG4gICAgICAgICAgICBtZXNzYWdlQnVzOiAgICAgICB0aGlzLl9tZXNzYWdlQnVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcnVuVGFzayAoeyByZXBvcnRlcnMsIGJyb3dzZXJTZXQsIHRlc3RzLCB0ZXN0ZWRBcHAsIG9wdGlvbnMsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkIH0pIHtcbiAgICAgICAgY29uc3QgdGFzayAgICAgICAgICAgICAgPSB0aGlzLl9jcmVhdGVUYXNrKHRlc3RzLCBicm93c2VyU2V0LmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLCB0aGlzLnByb3h5LCBvcHRpb25zLCB0aGlzLndhcm5pbmdMb2cpO1xuICAgICAgICBjb25zdCBjb21wbGV0aW9uUHJvbWlzZSA9IHRoaXMuX2dldFRhc2tSZXN1bHQodGFzaywgYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHAsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkKTtcbiAgICAgICAgbGV0IGNvbXBsZXRlZCAgICAgICAgICAgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzLm9uKCdzdGFydCcsIHN0YXJ0SGFuZGxpbmdUZXN0RXJyb3JzKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnNraXBVbmNhdWdodEVycm9ycykpIHtcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VCdXMub24oJ3Rlc3QtcnVuLXN0YXJ0JywgYWRkUnVubmluZ1Rlc3QpO1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5vbigndGVzdC1ydW4tZG9uZScsICh7IGVycnMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0Vycm9ycyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICByZW1vdmVSdW5uaW5nVGVzdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzLm9uKCdkb25lJywgc3RvcEhhbmRsaW5nVGVzdEVycm9ycyk7XG5cbiAgICAgICAgdGFzay5vbignZXJyb3InLCBzdG9wSGFuZGxpbmdUZXN0RXJyb3JzKTtcblxuICAgICAgICBjb25zdCBvblRhc2tDb21wbGV0ZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0YXNrLnVuUmVnaXN0ZXJDbGllbnRTY3JpcHRSb3V0aW5nKCk7XG5cbiAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcGxldGlvblByb21pc2VcbiAgICAgICAgICAgIC50aGVuKG9uVGFza0NvbXBsZXRlZClcbiAgICAgICAgICAgIC5jYXRjaChvblRhc2tDb21wbGV0ZWQpO1xuXG4gICAgICAgIGNvbnN0IGNhbmNlbFRhc2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbXBsZXRlZClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlVGFza0FuZFJlbGF0ZWRBc3NldHModGFzaywgYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHAsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4geyBjb21wbGV0aW9uUHJvbWlzZSwgY2FuY2VsVGFzayB9O1xuICAgIH1cblxuICAgIF9yZWdpc3RlckFzc2V0cyAoYXNzZXRzKSB7XG4gICAgICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHRoaXMucHJveHkuR0VUKGFzc2V0LnBhdGgsIGFzc2V0LmluZm8pKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVEZWJ1Z0xvZ2dlciAoKSB7XG4gICAgICAgIGNvbnN0IGRlYnVnTG9nZ2VyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGVidWdMb2dnZXIpO1xuXG4gICAgICAgIGNvbnN0IGRlYnVnTG9nZ2VyRGVmaW5lZENvcnJlY3RseSA9IGRlYnVnTG9nZ2VyID09PSBudWxsIHx8ICEhZGVidWdMb2dnZXIgJiZcbiAgICAgICAgICAgIFsnc2hvd0JyZWFrcG9pbnQnLCAnaGlkZUJyZWFrcG9pbnQnXS5ldmVyeShtZXRob2QgPT4gbWV0aG9kIGluIGRlYnVnTG9nZ2VyICYmIGlzRnVuY3Rpb24oZGVidWdMb2dnZXJbbWV0aG9kXSkpO1xuXG4gICAgICAgIGlmICghZGVidWdMb2dnZXJEZWZpbmVkQ29ycmVjdGx5KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBbT1BUSU9OX05BTUVTLmRlYnVnTG9nZ2VyXTogZGVmYXVsdERlYnVnTG9nZ2VyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsaWRhdGVTcGVlZE9wdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNwZWVkID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc3BlZWQpO1xuXG4gICAgICAgIGlmIChzcGVlZCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc3BlZWQgIT09ICdudW1iZXInIHx8IGlzTmFOKHNwZWVkKSB8fCBzcGVlZCA8IDAuMDEgfHwgc3BlZWQgPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkU3BlZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQ29uY3VycmVuY3lPcHRpb24gKCkge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmNvbmN1cnJlbmN5KTtcblxuICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmN1cnJlbmN5ICE9PSAnbnVtYmVyJyB8fCBpc05hTihjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPCAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkQ29uY3VycmVuY3lGYWN0b3IpO1xuXG4gICAgICAgIGlmIChjb25jdXJyZW5jeSA+IDEgJiYgdGhpcy5ib290c3RyYXBwZXIuYnJvd3NlcnMuc29tZShicm93c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyIGluc3RhbmNlb2YgQnJvd3NlckNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICA/IGJyb3dzZXIuYnJvd3NlckluZm8uYnJvd3Nlck9wdGlvbi5jZHBQb3J0XG4gICAgICAgICAgICAgICAgOiBicm93c2VyLmJyb3dzZXJPcHRpb24uY2RwUG9ydDtcbiAgICAgICAgfSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdFNldENvbmN1cnJlbmN5V2l0aENEUFBvcnQpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVNraXBKc0Vycm9yc09wdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNraXBKc0Vycm9yc09wdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5za2lwSnNFcnJvcnMpO1xuXG4gICAgICAgIGlmICghc2tpcEpzRXJyb3JzT3B0aW9ucylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB2YWxpZGF0ZVNraXBKc0Vycm9yc09wdGlvblZhbHVlKHNraXBKc0Vycm9yc09wdGlvbnMsIEdlbmVyYWxFcnJvcik7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQ3VzdG9tQWN0aW9uc09wdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUFjdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5jdXN0b21BY3Rpb25zKTtcblxuICAgICAgICBpZiAoIWN1c3RvbUFjdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21BY3Rpb25zICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuaW52YWxpZEN1c3RvbUFjdGlvbnNPcHRpb25UeXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3VzdG9tQWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21BY3Rpb25zW25hbWVdICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuaW52YWxpZEN1c3RvbUFjdGlvblR5cGUsIG5hbWUsIHR5cGVvZiBjdXN0b21BY3Rpb25zW25hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIF92YWxpZGF0ZUJyb3dzZXJzICgpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5icm93c2Vycyk7XG5cbiAgICAgICAgaWYgKCFicm93c2VycyB8fCBBcnJheS5pc0FycmF5KGJyb3dzZXJzKSAmJiAhYnJvd3NlcnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5icm93c2VyTm90U2V0KTtcblxuICAgICAgICBpZiAoT1MubWFjKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2hlY2tSZXF1aXJlZFBlcm1pc3Npb25zKGJyb3dzZXJzKTtcblxuICAgICAgICBpZiAoT1MubGludXggJiYgIWRldGVjdERpc3BsYXkoKSlcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NoZWNrVGhhdFRlc3RzQ2FuUnVuV2l0aG91dERpc3BsYXkoYnJvd3NlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVJlcXVlc3RUaW1lb3V0T3B0aW9uIChvcHRpb25OYW1lKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RUaW1lb3V0ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihvcHRpb25OYW1lKTtcblxuICAgICAgICBpZiAocmVxdWVzdFRpbWVvdXQgPT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyLCBudWxsLCBgXCIke29wdGlvbk5hbWV9XCIgb3B0aW9uYCwgcmVxdWVzdFRpbWVvdXQpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVByb3h5QnlwYXNzT3B0aW9uICgpIHtcbiAgICAgICAgbGV0IHByb3h5QnlwYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucHJveHlCeXBhc3MpO1xuXG4gICAgICAgIGlmIChwcm94eUJ5cGFzcyA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoWyBpcy5zdHJpbmcsIGlzLmFycmF5IF0sIG51bGwsICdUaGUgXCJwcm94eUJ5cGFzc1wiIGFyZ3VtZW50JywgcHJveHlCeXBhc3MpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcHJveHlCeXBhc3MgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcHJveHlCeXBhc3MgPSBbcHJveHlCeXBhc3NdO1xuXG4gICAgICAgIHByb3h5QnlwYXNzID0gcHJveHlCeXBhc3MucmVkdWNlKChhcnIsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLnN0cmluZywgbnVsbCwgJ1RoZSBcInByb3h5QnlwYXNzXCIgYXJndW1lbnQnLCBydWxlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBhcnIuY29uY2F0KHJ1bGVzLnNwbGl0KCcsJykpO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IHByb3h5QnlwYXNzIH0pO1xuICAgIH1cblxuICAgIF9nZXRTY3JlZW5zaG90T3B0aW9ucyAoKSB7XG4gICAgICAgIGxldCB7IHBhdGgsIHBhdGhQYXR0ZXJuLCB0YWtlT25GYWlscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc2NyZWVuc2hvdHMpIHx8IHt9O1xuXG4gICAgICAgIGlmICghcGF0aClcbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5zY3JlZW5zaG90UGF0aCk7XG5cbiAgICAgICAgaWYgKCFwYXRoUGF0dGVybilcbiAgICAgICAgICAgIHBhdGhQYXR0ZXJuID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc2NyZWVuc2hvdFBhdGhQYXR0ZXJuKTtcblxuICAgICAgICBpZiAoIXRha2VPbkZhaWxzKVxuICAgICAgICAgICAgdGFrZU9uRmFpbHMgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4geyBwYXRoLCBwYXRoUGF0dGVybiwgdGFrZU9uRmFpbHMgfTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVTY3JlZW5zaG90T3B0aW9ucyAoKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCwgcGF0aFBhdHRlcm4gfSA9IHRoaXMuX2dldFNjcmVlbnNob3RPcHRpb25zKCk7XG5cbiAgICAgICAgY29uc3QgZGlzYWJsZVNjcmVlbnNob3RzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGlzYWJsZVNjcmVlbnNob3RzKSB8fCAhcGF0aDtcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy5kaXNhYmxlU2NyZWVuc2hvdHNdOiBkaXNhYmxlU2NyZWVuc2hvdHMgfSk7XG5cbiAgICAgICAgaWYgKGRpc2FibGVTY3JlZW5zaG90cylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVTY3JlZW5zaG90UGF0aChwYXRoLCAnc2NyZWVuc2hvdHMgYmFzZSBkaXJlY3RvcnkgcGF0aCcpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy5zY3JlZW5zaG90c106IHsgcGF0aDogcmVzb2x2ZVBhdGgocGF0aCkgfSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoUGF0dGVybikge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVTY3JlZW5zaG90UGF0aChwYXRoUGF0dGVybiwgJ3NjcmVlbnNob3RzIHBhdGggcGF0dGVybicpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy5zY3JlZW5zaG90c106IHsgcGF0aFBhdHRlcm4gfSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIF92YWxpZGF0ZVZpZGVvT3B0aW9ucyAoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvUGF0aCAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMudmlkZW9QYXRoKTtcbiAgICAgICAgY29uc3QgdmlkZW9FbmNvZGluZ09wdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy52aWRlb0VuY29kaW5nT3B0aW9ucyk7XG5cbiAgICAgICAgbGV0IHZpZGVvT3B0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnZpZGVvT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCF2aWRlb1BhdGgpIHtcbiAgICAgICAgICAgIGlmICh2aWRlb09wdGlvbnMgfHwgdmlkZW9FbmNvZGluZ09wdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RTZXRWaWRlb09wdGlvbnNXaXRob3V0QmFzZVZpZGVvUGF0aFNwZWNpZmllZCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLnZpZGVvUGF0aF06IHJlc29sdmVQYXRoKHZpZGVvUGF0aCkgfSk7XG5cbiAgICAgICAgaWYgKCF2aWRlb09wdGlvbnMpIHtcbiAgICAgICAgICAgIHZpZGVvT3B0aW9ucyA9IHt9O1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy52aWRlb09wdGlvbnNdOiB2aWRlb09wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlkZW9PcHRpb25zLmZmbXBlZ1BhdGgpXG4gICAgICAgICAgICB2aWRlb09wdGlvbnMuZmZtcGVnUGF0aCA9IHJlc29sdmVQYXRoKHZpZGVvT3B0aW9ucy5mZm1wZWdQYXRoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdmlkZW9PcHRpb25zLmZmbXBlZ1BhdGggPSBhd2FpdCBkZXRlY3RGRk1QRUcoKTtcblxuICAgICAgICBpZiAoIXZpZGVvT3B0aW9ucy5mZm1wZWdQYXRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kRkZNUEVHKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVDb21waWxlck9wdGlvbnMgKCkge1xuICAgICAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghY29tcGlsZXJPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNwZWNpZmllZENvbXBpbGVycyAgPSBPYmplY3Qua2V5cyhjb21waWxlck9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjdXN0b21pemVkQ29tcGlsZXJzID0gT2JqZWN0LmtleXMoQ3VzdG9taXphYmxlQ29tcGlsZXJzKTtcbiAgICAgICAgY29uc3Qgd3JvbmdDb21waWxlcnMgICAgICA9IHNwZWNpZmllZENvbXBpbGVycy5maWx0ZXIoY29tcGlsZXIgPT4gIWN1c3RvbWl6ZWRDb21waWxlcnMuaW5jbHVkZXMoY29tcGlsZXIpKTtcblxuICAgICAgICBpZiAoIXdyb25nQ29tcGlsZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBjb21waWxlckxpc3RTdHIgPSBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcod3JvbmdDb21waWxlcnMsIHZvaWQgMCwgXCInXCIpO1xuICAgICAgICBjb25zdCBwbHVyYWxTdWZmaXggICAgPSBnZXRQbHVyYWxTdWZmaXgod3JvbmdDb21waWxlcnMpO1xuXG4gICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90Q3VzdG9taXplU3BlY2lmaWVkQ29tcGlsZXJzLCBjb21waWxlckxpc3RTdHIsIHBsdXJhbFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUmV0cnlUZXN0UGFnZXNPcHRpb24gKCkge1xuICAgICAgICBjb25zdCByZXRyeVRlc3RQYWdlc09wdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJldHJ5VGVzdFBhZ2VzKTtcblxuICAgICAgICBpZiAoIXJldHJ5VGVzdFBhZ2VzT3B0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNzbCA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnNzbCk7XG5cbiAgICAgICAgaWYgKHNzbClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmhvc3RuYW1lKTtcblxuICAgICAgICBpZiAoaXNMb2NhbGhvc3QoaG9zdG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90RW5hYmxlUmV0cnlUZXN0UGFnZXNPcHRpb24pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVF1YXJhbnRpbmVPcHRpb25zICgpIHtcbiAgICAgICAgY29uc3QgcXVhcmFudGluZU1vZGUgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5xdWFyYW50aW5lTW9kZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBxdWFyYW50aW5lTW9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICB2YWxpZGF0ZVF1YXJhbnRpbmVPcHRpb25zKHF1YXJhbnRpbmVNb2RlKTtcbiAgICB9XG5cbiAgICBhc3luYyBfdmFsaWRhdGVSdW5PcHRpb25zICgpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVEZWJ1Z0xvZ2dlcigpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZVNjcmVlbnNob3RPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhbGlkYXRlVmlkZW9PcHRpb25zKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlU3BlZWRPcHRpb24oKTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVQcm94eUJ5cGFzc09wdGlvbigpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUNvbXBpbGVyT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZVJldHJ5VGVzdFBhZ2VzT3B0aW9uKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlUmVxdWVzdFRpbWVvdXRPcHRpb24oT1BUSU9OX05BTUVTLnBhZ2VSZXF1ZXN0VGltZW91dCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlUmVxdWVzdFRpbWVvdXRPcHRpb24oT1BUSU9OX05BTUVTLmFqYXhSZXF1ZXN0VGltZW91dCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlUXVhcmFudGluZU9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVDb25jdXJyZW5jeU9wdGlvbigpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZVNraXBKc0Vycm9yc09wdGlvbigpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUN1c3RvbUFjdGlvbnNPcHRpb24oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFsaWRhdGVCcm93c2VycygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBwZXJcbiAgICAgICAgICAgIC5jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oKVxuICAgICAgICAgICAgLnRoZW4ocnVubmFibGVDb25maWd1cmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RvbmUtYm9vdHN0cmFwcGluZycpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5hYmxlQ29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVNjcmVlbnNob3RQYXRoIChzY3JlZW5zaG90UGF0aCwgcGF0aFR5cGUpIHtcbiAgICAgICAgY29uc3QgZm9yYmlkZGVuQ2hhcnNMaXN0ID0gY2hlY2tGaWxlUGF0aChzY3JlZW5zaG90UGF0aCk7XG5cbiAgICAgICAgaWYgKGZvcmJpZGRlbkNoYXJzTGlzdC5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmZvcmJpZGRlbkNoYXJhdGVyc0luU2NyZWVuc2hvdFBhdGgsIHNjcmVlbnNob3RQYXRoLCBwYXRoVHlwZSwgcmVuZGVyRm9yYmlkZGVuQ2hhcnNMaXN0KGZvcmJpZGRlbkNoYXJzTGlzdCkpO1xuICAgIH1cblxuICAgIF9zZXRCb290c3RyYXBwZXJPcHRpb25zICgpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnByZXBhcmUoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm5vdGlmeUFib3V0T3ZlcnJpZGRlbk9wdGlvbnModGhpcy53YXJuaW5nTG9nKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm5vdGlmeUFib3V0RGVwcmVjYXRlZE9wdGlvbnModGhpcy53YXJuaW5nTG9nKTtcblxuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5zb3VyY2VzICAgICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc3JjKSB8fCB0aGlzLmJvb3RzdHJhcHBlci5zb3VyY2VzO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5icm93c2VycyAgICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuYnJvd3NlcnMpIHx8IHRoaXMuYm9vdHN0cmFwcGVyLmJyb3dzZXJzO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5jb25jdXJyZW5jeSAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuY29uY3VycmVuY3kpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5hcHBDb21tYW5kICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuYXBwQ29tbWFuZCkgfHwgdGhpcy5ib290c3RyYXBwZXIuYXBwQ29tbWFuZDtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIuYXBwSW5pdERlbGF5ICAgICAgICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmFwcEluaXREZWxheSk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmZpbHRlciAgICAgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5maWx0ZXIpIHx8IHRoaXMuYm9vdHN0cmFwcGVyLmZpbHRlcjtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIucmVwb3J0ZXJzICAgICAgICAgICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJlcG9ydGVyKSB8fCB0aGlzLmJvb3RzdHJhcHBlci5yZXBvcnRlcnM7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLnRzQ29uZmlnUGF0aCAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy50c0NvbmZpZ1BhdGgpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5jbGllbnRTY3JpcHRzICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuY2xpZW50U2NyaXB0cykgfHwgdGhpcy5ib290c3RyYXBwZXIuY2xpZW50U2NyaXB0cztcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIuZGlzYWJsZU11bHRpcGxlV2luZG93cyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5wcm94eWxlc3MgICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZXhwZXJpbWVudGFsUHJveHlsZXNzKTtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIuY29tcGlsZXJPcHRpb25zICAgICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmJyb3dzZXJJbml0VGltZW91dCAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5icm93c2VySW5pdFRpbWVvdXQpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5ob29rcyAgICAgICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuaG9va3MpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5jb25maWd1cmF0aW9uICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIGFzeW5jIF9hZGREYXNoYm9hcmRSZXBvcnRlcklmTmVlZGVkICgpIHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkT3B0aW9ucyA9IGF3YWl0IHRoaXMuX2dldERhc2hib2FyZE9wdGlvbnMoKTtcbiAgICAgICAgbGV0IHJlcG9ydGVyT3B0aW9ucyAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJlcG9ydGVyKTtcblxuICAgICAgICAvLyBOT1RFOiB3ZSBzaG91bGQgc2VuZCByZXBvcnRzIHdoZW4gc2VuZFJlcG9ydCBpcyB1bmRlZmluZWRcbiAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIG9wdGlvbiBiaW5hcnkgaW5zdGVhZCBvZiB0cmktc3RhdGVcbiAgICAgICAgaWYgKCFkYXNoYm9hcmRPcHRpb25zLnRva2VuIHx8IGRhc2hib2FyZE9wdGlvbnMuc2VuZFJlcG9ydCA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKCFyZXBvcnRlck9wdGlvbnMpXG4gICAgICAgICAgICByZXBvcnRlck9wdGlvbnMgPSBbXTtcblxuICAgICAgICBjb25zdCBkYXNoYm9hcmRSZXBvcnRlciA9IHJlcG9ydGVyT3B0aW9ucy5maW5kKHJlcG9ydGVyID0+IHJlcG9ydGVyLm5hbWUgPT09IERBU0hCT0FSRF9SRVBPUlRFUl9OQU1FKTtcblxuICAgICAgICBpZiAoIWRhc2hib2FyZFJlcG9ydGVyKVxuICAgICAgICAgICAgcmVwb3J0ZXJPcHRpb25zLnB1c2goeyBuYW1lOiBEQVNIQk9BUkRfUkVQT1JURVJfTkFNRSwgb3B0aW9uczogZGFzaGJvYXJkT3B0aW9ucyB9KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGFzaGJvYXJkUmVwb3J0ZXIub3B0aW9ucyA9IGRhc2hib2FyZE9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IFtPUFRJT05fTkFNRVMucmVwb3J0ZXJdOiByZXBvcnRlck9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgX3R1cm5PblNjcmVlbnNob3RzSWZOZWVkZWQgKCkge1xuICAgICAgICBjb25zdCB7IHRha2VPbkZhaWxzIH0gPSB0aGlzLl9nZXRTY3JlZW5zaG90T3B0aW9ucygpO1xuICAgICAgICBjb25zdCByZXBvcnRlck9wdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5yZXBvcnRlcik7XG5cbiAgICAgICAgaWYgKCF0YWtlT25GYWlscyAmJiByZXBvcnRlck9wdGlvbnMgJiYgY2FzdEFycmF5KHJlcG9ydGVyT3B0aW9ucykuc29tZShyZXBvcnRlciA9PiByZXBvcnRlci5uYW1lID09PSBEQVNIQk9BUkRfUkVQT1JURVJfTkFNRSkpXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy5zY3JlZW5zaG90c106IHsgdGFrZU9uRmFpbHM6IHRydWUsIGF1dG9UYWtlT25GYWlsczogdHJ1ZSB9IH0pO1xuICAgIH1cblxuICAgIGFzeW5jIF9nZXREYXNoYm9hcmRPcHRpb25zICgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZU9wdGlvbnMgPSBhd2FpdCB0aGlzLl9sb2FkRGFzaGJvYXJkT3B0aW9uc0Zyb21TdG9yYWdlKCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ09wdGlvbnMgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGFzaGJvYXJkKTtcbiAgICAgICAgY29uc3QgZW52T3B0aW9ucyAgICAgPSBnZXRFbnZPcHRpb25zKCk7XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlKHt9LCBzdG9yYWdlT3B0aW9ucywgY29uZmlnT3B0aW9ucywgZW52T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2xvYWREYXNoYm9hcmRPcHRpb25zRnJvbVN0b3JhZ2UgKCkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gbmV3IERhc2hib2FyZENvbmZpZ1N0b3JhZ2UoKTtcblxuICAgICAgICBhd2FpdCBzdG9yYWdlLmxvYWQoKTtcblxuICAgICAgICByZXR1cm4gc3RvcmFnZS5vcHRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIF9wcmVwYXJlQ2xpZW50U2NyaXB0cyAodGVzdHMsIGNsaWVudFNjcmlwdHMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRlc3RzLm1hcChhc3luYyB0ZXN0ID0+IHtcbiAgICAgICAgICAgIGlmICh0ZXN0LmlzTGVnYWN5KVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IGxvYWRlZFRlc3RDbGllbnRTY3JpcHRzID0gYXdhaXQgbG9hZENsaWVudFNjcmlwdHModGVzdC5jbGllbnRTY3JpcHRzLCBkaXJuYW1lKHRlc3QudGVzdEZpbGUuZmlsZW5hbWUpKTtcblxuICAgICAgICAgICAgbG9hZGVkVGVzdENsaWVudFNjcmlwdHMgPSBjbGllbnRTY3JpcHRzLmNvbmNhdChsb2FkZWRUZXN0Q2xpZW50U2NyaXB0cyk7XG5cbiAgICAgICAgICAgIHRlc3QuY2xpZW50U2NyaXB0cyA9IHNldFVuaXF1ZVVybHMobG9hZGVkVGVzdENsaWVudFNjcmlwdHMpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2hhc0xvY2FsQnJvd3NlcnMgKGJyb3dzZXJJbmZvKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnJvd3NlciBvZiBicm93c2VySW5mbykge1xuICAgICAgICAgICAgaWYgKGJyb3dzZXIgaW5zdGFuY2VvZiBCcm93c2VyQ29ubmVjdGlvbilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKGF3YWl0IGJyb3dzZXIucHJvdmlkZXIuaXNMb2NhbEJyb3dzZXIodm9pZCAwLCBicm93c2VyLmJyb3dzZXJOYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBfY2hlY2tSZXF1aXJlZFBlcm1pc3Npb25zIChicm93c2VySW5mbykge1xuICAgICAgICBjb25zdCBoYXNMb2NhbEJyb3dzZXJzID0gYXdhaXQgdGhpcy5faGFzTG9jYWxCcm93c2Vycyhicm93c2VySW5mbyk7XG5cbiAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgYXV0aGVudGljYXRpb25IZWxwZXIoXG4gICAgICAgICAgICAoKSA9PiBmaW5kV2luZG93KCcnKSxcbiAgICAgICAgICAgIGVycm9ycy5VbmFibGVUb0FjY2Vzc1NjcmVlblJlY29yZGluZ0FQSUVycm9yLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlOiBoYXNMb2NhbEJyb3dzZXJzICYmICFpc0NJLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChoYXNMb2NhbEJyb3dzZXJzKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgUmVtb3RlQnJvd3NlclByb3ZpZGVyLmNhbkRldGVjdExvY2FsQnJvd3NlcnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBfY2hlY2tUaGF0VGVzdHNDYW5SdW5XaXRob3V0RGlzcGxheSAoYnJvd3NlckluZm9Tb3VyY2UpIHtcbiAgICAgICAgZm9yIChsZXQgYnJvd3NlckluZm8gb2YgYnJvd3NlckluZm9Tb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChicm93c2VySW5mbyBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIGJyb3dzZXJJbmZvID0gYnJvd3NlckluZm8uYnJvd3NlckluZm87XG5cbiAgICAgICAgICAgIGNvbnN0IGlzTG9jYWxCcm93c2VyICAgID0gYXdhaXQgYnJvd3NlckluZm8ucHJvdmlkZXIuaXNMb2NhbEJyb3dzZXIodm9pZCAwLCBicm93c2VySW5mby5icm93c2VyTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBpc0hlYWRsZXNzQnJvd3NlciA9IGF3YWl0IGJyb3dzZXJJbmZvLnByb3ZpZGVyLmlzSGVhZGxlc3NCcm93c2VyKHZvaWQgMCwgYnJvd3NlckluZm8uYnJvd3Nlck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoaXNMb2NhbEJyb3dzZXIgJiYgIWlzSGVhZGxlc3NCcm93c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9FUlJPUlMuY2Fubm90UnVuTG9jYWxOb25IZWFkbGVzc0Jyb3dzZXJXaXRob3V0RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlckluZm8uYWxpYXMsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIF9zZXRDb25maWd1cmF0aW9uT3B0aW9ucyAoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hc3luY01lcmdlT3B0aW9ucyh0aGlzLl9vcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBlbWJlZGRpbmdPcHRpb25zIChvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgYXNzZXRzLCBUZXN0UnVuQ3RvciB9ID0gb3B0cztcblxuICAgICAgICB0aGlzLl9yZWdpc3RlckFzc2V0cyhhc3NldHMpO1xuICAgICAgICB0aGlzLl9vcHRpb25zLlRlc3RSdW5DdG9yID0gVGVzdFJ1bkN0b3I7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc3JjICguLi5zb3VyY2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZC5zcmMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm11bHRpcGxlQVBJTWV0aG9kQ2FsbEZvcmJpZGRlbiwgT1BUSU9OX05BTUVTLnNyYyk7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMuc3JjXSA9IHRoaXMuX3ByZXBhcmVBcnJheVBhcmFtZXRlcihzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQuc3JjICAgICA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnJvd3NlcnMgKC4uLmJyb3dzZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZC5icm93c2VycylcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMubXVsdGlwbGVBUElNZXRob2RDYWxsRm9yYmlkZGVuLCBPUFRJT05fTkFNRVMuYnJvd3NlcnMpO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMuYnJvd3NlcnMgICAgICAgICAgID0gdGhpcy5fcHJlcGFyZUFycmF5UGFyYW1ldGVyKGJyb3dzZXJzKTtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQuYnJvd3NlcnMgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbmN1cnJlbmN5IChjb25jdXJyZW5jeSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVwb3J0ZXIgKG5hbWUsIG91dHB1dCkge1xuICAgICAgICBpZiAodGhpcy5hcGlNZXRob2RXYXNDYWxsZWQucmVwb3J0ZXIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm11bHRpcGxlQVBJTWV0aG9kQ2FsbEZvcmJpZGRlbiwgT1BUSU9OX05BTUVTLnJlcG9ydGVyKTtcblxuICAgICAgICB0aGlzLl9vcHRpb25zW09QVElPTl9OQU1FUy5yZXBvcnRlcl0gPSB0aGlzLl9wcmVwYXJlQXJyYXlQYXJhbWV0ZXIocHJlcGFyZVJlcG9ydGVycyhuYW1lLCBvdXRwdXQpKTtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQucmVwb3J0ZXIgICAgID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmaWx0ZXIgKGZpbHRlcikge1xuICAgICAgICB0aGlzLl9vcHRpb25zLmZpbHRlciA9IGZpbHRlcjtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1c2VQcm94eSAocHJveHksIHByb3h5QnlwYXNzKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMucHJveHkgICAgICAgPSBwcm94eTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5wcm94eUJ5cGFzcyA9IHByb3h5QnlwYXNzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNjcmVlbnNob3RzICguLi5vcHRpb25zKSB7XG4gICAgICAgIGxldCBmdWxsUGFnZTtcbiAgICAgICAgbGV0IHRodW1ibmFpbHM7XG4gICAgICAgIGxldCBbcGF0aCwgdGFrZU9uRmFpbHMsIHBhdGhQYXR0ZXJuXSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmIG9wdGlvbnNbMF0gJiYgdHlwZW9mIG9wdGlvbnNbMF0gPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgKHsgcGF0aCwgdGFrZU9uRmFpbHMsIHBhdGhQYXR0ZXJuLCBmdWxsUGFnZSwgdGh1bWJuYWlscyB9ID0gb3B0aW9uc1swXSk7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zY3JlZW5zaG90cyA9IHsgcGF0aCwgdGFrZU9uRmFpbHMsIHBhdGhQYXR0ZXJuLCBmdWxsUGFnZSwgdGh1bWJuYWlscyB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZpZGVvIChwYXRoLCBvcHRpb25zLCBlbmNvZGluZ09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMudmlkZW9QYXRoXSAgICAgICAgICAgID0gcGF0aDtcbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMudmlkZW9PcHRpb25zXSAgICAgICAgID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMudmlkZW9FbmNvZGluZ09wdGlvbnNdID0gZW5jb2RpbmdPcHRpb25zO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN0YXJ0QXBwIChjb21tYW5kLCBpbml0RGVsYXkpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMuYXBwQ29tbWFuZF0gICA9IGNvbW1hbmQ7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLmFwcEluaXREZWxheV0gPSBpbml0RGVsYXk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdHNDb25maWdQYXRoIChwYXRoKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnRzQ29uZmlnUGF0aF0gPSBwYXRoO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNsaWVudFNjcmlwdHMgKC4uLnNjcmlwdHMpIHtcbiAgICAgICAgaWYgKHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLmNsaWVudFNjcmlwdHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm11bHRpcGxlQVBJTWV0aG9kQ2FsbEZvcmJpZGRlbiwgT1BUSU9OX05BTUVTLmNsaWVudFNjcmlwdHMpO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLmNsaWVudFNjcmlwdHNdID0gdGhpcy5fcHJlcGFyZUFycmF5UGFyYW1ldGVyKHNjcmlwdHMpO1xuICAgICAgICB0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZC5jbGllbnRTY3JpcHRzICAgICA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29tcGlsZXJPcHRpb25zIChvcHRzKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLmNvbXBpbGVyT3B0aW9uc10gPSBvcHRzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJ1biAob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCByZXBvcnRlcnM7XG5cbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5jbGVhckxpc3RlbmVycygpO1xuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VCdXNFcnJvclByb21pc2UgPSBwcm9taXNpZnlFdmVudCh0aGlzLl9tZXNzYWdlQnVzLCAnZXJyb3InKTtcblxuICAgICAgICB0aGlzLl9vcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLl9vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBydW5UYXNrUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9zZXRDb25maWd1cmF0aW9uT3B0aW9ucygpKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FkZERhc2hib2FyZFJlcG9ydGVySWZOZWVkZWQoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl90dXJuT25TY3JlZW5zaG90c0lmTmVlZGVkKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gUmVwb3J0ZXIuZ2V0UmVwb3J0ZXJQbHVnaW5zKHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJlcG9ydGVyKSkpXG4gICAgICAgICAgICAudGhlbihyZXBvcnRlclBsdWdpbnMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcG9ydGVycyA9IHJlcG9ydGVyUGx1Z2lucy5tYXAocmVwb3J0ZXIgPT4gbmV3IFJlcG9ydGVyKHJlcG9ydGVyLnBsdWdpbiwgdGhpcy5fbWVzc2FnZUJ1cywgcmVwb3J0ZXIub3V0U3RyZWFtLCByZXBvcnRlci5uYW1lKSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVwb3J0ZXJzLm1hcChyZXBvcnRlciA9PiByZXBvcnRlci5pbml0KCkpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9zZXRCb290c3RyYXBwZXJPcHRpb25zKCkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nRW50cnkoREVCVUdfTE9HR0VSLCB0aGlzLmNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUnVuT3B0aW9ucygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuX2NyZWF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbigpKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKHsgYnJvd3NlclNldCwgdGVzdHMsIHRlc3RlZEFwcCwgY29tbW9uQ2xpZW50U2NyaXB0cywgaWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVDbGllbnRTY3JpcHRzKHRlc3RzLCBjb21tb25DbGllbnRTY3JpcHRzKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhc2hib2FyZFJlcG9ydGVyID0gcmVwb3J0ZXJzLmZpbmQociA9PiByLnBsdWdpbi5uYW1lID09PSAnZGFzaGJvYXJkJyk/LnBsdWdpbjtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXNoYm9hcmRVcmwgICAgICA9IGRhc2hib2FyZFJlcG9ydGVyPy5nZXRSZXBvcnRVcmwgPyBkYXNoYm9hcmRSZXBvcnRlci5nZXRSZXBvcnRVcmwoKSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbnMoKSxcblxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRVcmwsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwcGVyLmNvbXBpbGVyU2VydmljZT8uc2V0T3B0aW9ucyh7IHZhbHVlOiByZXN1bHRPcHRpb25zIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soe1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJTZXQsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RzLFxuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRBcHAsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgICAgICAgICAgICByZXN1bHRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZDogaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgICAgIHJ1blRhc2tQcm9taXNlLFxuICAgICAgICAgICAgbWVzc2FnZUJ1c0Vycm9yUHJvbWlzZSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlQ2FuY2VsYWJsZVByb21pc2UoUHJvbWlzZS5yYWNlKHByb21pc2VzKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RvcCAoKSB7XG4gICAgICAgIC8vIE5PVEU6IFdoZW4gdGFza1Byb21pc2UgaXMgY2FuY2VsbGVkLCBpdCBpcyByZW1vdmVkIGZyb21cbiAgICAgICAgLy8gdGhlIHBlbmRpbmdUYXNrUHJvbWlzZXMgYXJyYXksIHdoaWNoIGxlYWRzIHRvIHNoaWZ0aW5nIGluZGV4ZXNcbiAgICAgICAgLy8gdG93YXJkcyB0aGUgYmVnaW5uaW5nLiBTbywgd2UgbXVzdCBjb3B5IHRoZSBhcnJheSBpbiBvcmRlciB0byBpdGVyYXRlIGl0LFxuICAgICAgICAvLyBvciB3ZSBjYW4gcGVyZm9ybSBpdGVyYXRpb24gZnJvbSB0aGUgZW5kIHRvIHRoZSBiZWdpbm5pbmcuXG4gICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblByb21pc2VzID0gdGhpcy5wZW5kaW5nVGFza1Byb21pc2VzLnJlZHVjZVJpZ2h0KChyZXN1bHQsIHRhc2tQcm9taXNlKSA9PiB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0YXNrUHJvbWlzZS5jYW5jZWwoKSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChjYW5jZWxsYXRpb25Qcm9taXNlcyk7XG4gICAgfVxufVxuIl19
|
|
635
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVubmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQXVEO0FBQ3ZELGtEQUEwQjtBQUMxQixzRUFBNkM7QUFDN0MsbUNBQXNDO0FBQ3RDLGlGQUFpRTtBQUVqRSxtQ0FPZ0I7QUFFaEIsa0VBQTBDO0FBQzFDLDJEQUFtQztBQUNuQyxrREFBMEI7QUFDMUIsaUZBQStEO0FBQy9ELCtDQUFpRDtBQUNqRCwyQ0FBaUQ7QUFDakQsdUVBQW1FO0FBQ25FLG9EQUFvRTtBQUNwRSwyRUFBa0Q7QUFDbEQsK0VBQXFEO0FBQ3JELDBEQUtnQztBQUVoQyxpRkFBeUQ7QUFDekQsbUVBQTBDO0FBQzFDLG1GQUEwRDtBQUMxRCx5RUFBOEQ7QUFDOUQsMERBQStEO0FBQy9ELDhGQUFvRTtBQUNwRSxxR0FBNEU7QUFDNUUsNENBQStFO0FBQy9FLHlFQUFnRDtBQUNoRCwrRUFBc0Q7QUFDdEQseUZBQWdFO0FBQ2hFLG1FQUE0RDtBQUM1RCxrREFBeUI7QUFDekIsaUZBQXdFO0FBQ3hFLHVFQUFzRDtBQUN0RCwwREFBMkI7QUFDM0IsNkVBQW9EO0FBQ3BELGdFQUE0RTtBQUM1RSxtRUFBMEM7QUFDMUMsdUVBQThDO0FBQzlDLG1GQUF5RDtBQUN6RCx3RUFBc0Y7QUFFdEYsTUFBTSxZQUFZLEdBQWMsSUFBQSxlQUFLLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN6RCxNQUFNLHVCQUF1QixHQUFHLFdBQVcsQ0FBQztBQUU1QyxNQUFxQixNQUFPLFNBQVEscUJBQVk7SUFDNUMsWUFBYSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFO1FBQzVFLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFdBQVcsR0FBVyxJQUFJLHFCQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFpQixLQUFLLENBQUM7UUFD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QyxDQUFDO1lBRWxDLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQXB5QkQseUJBb3lCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlc29sdmUgYXMgcmVzb2x2ZVBhdGgsIGRpcm5hbWUgfSBmcm9tICdwYXRoJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgcHJvbWlzaWZ5RXZlbnQgZnJvbSAncHJvbWlzaWZ5LWV2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgRGFzaGJvYXJkQ29uZmlnU3RvcmFnZSBmcm9tICcuLi9kYXNoYm9hcmQvY29uZmlnLXN0b3JhZ2UnO1xuXG5pbXBvcnQge1xuICAgIGZsYXR0ZW5EZWVwIGFzIGZsYXR0ZW4sXG4gICAgcHVsbCBhcyByZW1vdmUsXG4gICAgaXNGdW5jdGlvbixcbiAgICB1bmlxLFxuICAgIGNhc3RBcnJheSxcbiAgICBtZXJnZSxcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IEJvb3RzdHJhcHBlciBmcm9tICcuL2Jvb3RzdHJhcHBlcic7XG5pbXBvcnQgUmVwb3J0ZXIgZnJvbSAnLi4vcmVwb3J0ZXInO1xuaW1wb3J0IFRhc2sgZnJvbSAnLi90YXNrJztcbmltcG9ydCBkZWZhdWx0RGVidWdMb2dnZXIgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9kZWJ1Zy1sb2dnZXInO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuaW1wb3J0IHsgcmVuZGVyRm9yYmlkZGVuQ2hhcnNMaXN0IH0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuL3V0aWxzJztcbmltcG9ydCBkZXRlY3RGRk1QRUcgZnJvbSAnLi4vdXRpbHMvZGV0ZWN0LWZmbXBlZyc7XG5pbXBvcnQgY2hlY2tGaWxlUGF0aCBmcm9tICcuLi91dGlscy9jaGVjay1maWxlLXBhdGgnO1xuaW1wb3J0IHtcbiAgICBhZGRSdW5uaW5nVGVzdCxcbiAgICByZW1vdmVSdW5uaW5nVGVzdCxcbiAgICBzdGFydEhhbmRsaW5nVGVzdEVycm9ycyxcbiAgICBzdG9wSGFuZGxpbmdUZXN0RXJyb3JzLFxufSBmcm9tICcuLi91dGlscy9oYW5kbGUtZXJyb3JzJztcblxuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuLi9jb25maWd1cmF0aW9uL29wdGlvbi1uYW1lcyc7XG5pbXBvcnQgRmxhZ0xpc3QgZnJvbSAnLi4vdXRpbHMvZmxhZy1saXN0JztcbmltcG9ydCBwcmVwYXJlUmVwb3J0ZXJzIGZyb20gJy4uL3V0aWxzL3ByZXBhcmUtcmVwb3J0ZXJzJztcbmltcG9ydCBsb2FkQ2xpZW50U2NyaXB0cyBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvbG9hZCc7XG5pbXBvcnQgeyBzZXRVbmlxdWVVcmxzIH0gZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL3V0aWxzJztcbmltcG9ydCBSZXBvcnRlclN0cmVhbUNvbnRyb2xsZXIgZnJvbSAnLi9yZXBvcnRlci1zdHJlYW0tY29udHJvbGxlcic7XG5pbXBvcnQgQ3VzdG9taXphYmxlQ29tcGlsZXJzIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vY3VzdG9taXphYmxlLWNvbXBpbGVycyc7XG5pbXBvcnQgeyBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcsIGdldFBsdXJhbFN1ZmZpeCB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQgaXNMb2NhbGhvc3QgZnJvbSAnLi4vdXRpbHMvaXMtbG9jYWxob3N0JztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IGF1dGhlbnRpY2F0aW9uSGVscGVyIGZyb20gJy4uL2NsaS9hdXRoZW50aWNhdGlvbi1oZWxwZXInO1xuaW1wb3J0IHsgZXJyb3JzLCBmaW5kV2luZG93IH0gZnJvbSAndGVzdGNhZmUtYnJvd3Nlci10b29scyc7XG5pbXBvcnQgaXNDSSBmcm9tICdpcy1jaSc7XG5pbXBvcnQgUmVtb3RlQnJvd3NlclByb3ZpZGVyIGZyb20gJy4uL2Jyb3dzZXIvcHJvdmlkZXIvYnVpbHQtaW4vcmVtb3RlJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IE9TIGZyb20gJ29zLWZhbWlseSc7XG5pbXBvcnQgZGV0ZWN0RGlzcGxheSBmcm9tICcuLi91dGlscy9kZXRlY3QtZGlzcGxheSc7XG5pbXBvcnQgeyB2YWxpZGF0ZVF1YXJhbnRpbmVPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvZ2V0LW9wdGlvbnMvcXVhcmFudGluZSc7XG5pbXBvcnQgbG9nRW50cnkgZnJvbSAnLi4vdXRpbHMvbG9nLWVudHJ5JztcbmltcG9ydCBNZXNzYWdlQnVzIGZyb20gJy4uL3V0aWxzL21lc3NhZ2UtYnVzJztcbmltcG9ydCBnZXRFbnZPcHRpb25zIGZyb20gJy4uL2Rhc2hib2FyZC9nZXQtZW52LW9wdGlvbnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTa2lwSnNFcnJvcnNPcHRpb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2dldC1vcHRpb25zL3NraXAtanMtZXJyb3JzJztcblxuY29uc3QgREVCVUdfTE9HR0VSICAgICAgICAgICAgPSBkZWJ1ZygndGVzdGNhZmU6cnVubmVyJyk7XG5jb25zdCBEQVNIQk9BUkRfUkVQT1JURVJfTkFNRSA9ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSdW5uZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yICh7IHByb3h5LCBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIGNvbmZpZ3VyYXRpb24sIGNvbXBpbGVyU2VydmljZSB9KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cyAgICAgICAgID0gbmV3IE1lc3NhZ2VCdXMoKTtcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgICAgICAgID0gcHJveHk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyICAgICAgICA9IHRoaXMuX2NyZWF0ZUJvb3RzdHJhcHBlcihicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIGNvbXBpbGVyU2VydmljZSwgdGhpcy5fbWVzc2FnZUJ1cywgY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMucGVuZGluZ1Rhc2tQcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gICAgICAgPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLmlzQ2xpICAgICAgICAgICAgICAgPSBjb25maWd1cmF0aW9uLl9vcHRpb25zICYmIGNvbmZpZ3VyYXRpb24uX29wdGlvbnMuaXNDbGk7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZyAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKG51bGwsIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKHRoaXMuX21lc3NhZ2VCdXMpKTtcbiAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2UgICAgID0gY29tcGlsZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLl9vcHRpb25zICAgICAgICAgICAgPSB7fTtcbiAgICAgICAgdGhpcy5faGFzVGFza0Vycm9ycyAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlcG9ydGVycyAgICAgICAgICA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQgPSBuZXcgRmxhZ0xpc3QoW1xuICAgICAgICAgICAgT1BUSU9OX05BTUVTLnNyYyxcbiAgICAgICAgICAgIE9QVElPTl9OQU1FUy5icm93c2VycyxcbiAgICAgICAgICAgIE9QVElPTl9OQU1FUy5yZXBvcnRlcixcbiAgICAgICAgICAgIE9QVElPTl9OQU1FUy5jbGllbnRTY3JpcHRzLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQm9vdHN0cmFwcGVyIChicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIGNvbXBpbGVyU2VydmljZSwgbWVzc2FnZUJ1cywgY29uZmlndXJhdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IEJvb3RzdHJhcHBlcih7IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29tcGlsZXJTZXJ2aWNlLCBtZXNzYWdlQnVzLCBjb25maWd1cmF0aW9uIH0pO1xuICAgIH1cblxuICAgIF9kaXNwb3NlQnJvd3NlclNldCAoYnJvd3NlclNldCkge1xuICAgICAgICByZXR1cm4gYnJvd3NlclNldC5kaXNwb3NlKCkuY2F0Y2goZSA9PiBERUJVR19MT0dHRVIoZSkpO1xuICAgIH1cblxuICAgIF9kaXNwb3NlUmVwb3J0ZXJzIChyZXBvcnRlcnMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlcG9ydGVycy5tYXAocmVwb3J0ZXIgPT4gcmVwb3J0ZXIuZGlzcG9zZSgpLmNhdGNoKGUgPT4gREVCVUdfTE9HR0VSKGUpKSkpO1xuICAgIH1cblxuICAgIF9kaXNwb3NlVGVzdGVkQXBwICh0ZXN0ZWRBcHApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RlZEFwcCA/IHRlc3RlZEFwcC5raWxsKCkuY2F0Y2goZSA9PiBERUJVR19MT0dHRVIoZSkpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2Rpc3Bvc2VUYXNrQW5kUmVsYXRlZEFzc2V0cyAodGFzaywgYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHAsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkKSB7XG4gICAgICAgIHRhc2suYWJvcnQoKTtcbiAgICAgICAgdGFzay51blJlZ2lzdGVyQ2xpZW50U2NyaXB0Um91dGluZygpO1xuICAgICAgICB0YXNrLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMuYWJvcnQoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9maW5hbGl6ZUNvbXBpbGVyU2VydmljZVN0YXRlKHRhc2ssIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZUFzc2V0cyhicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VBc3NldHMgKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLl9kaXNwb3NlQnJvd3NlclNldChicm93c2VyU2V0KSxcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VSZXBvcnRlcnMocmVwb3J0ZXJzKSxcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VUZXN0ZWRBcHAodGVzdGVkQXBwKSxcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgX3ByZXBhcmVBcnJheVBhcmFtZXRlciAoYXJyYXkpIHtcbiAgICAgICAgYXJyYXkgPSBmbGF0dGVuKGFycmF5KTtcblxuICAgICAgICBpZiAodGhpcy5pc0NsaSlcbiAgICAgICAgICAgIHJldHVybiBhcnJheS5sZW5ndGggPT09IDAgPyB2b2lkIDAgOiBhcnJheTtcblxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNhbmNlbGFibGVQcm9taXNlICh0YXNrUHJvbWlzZSkge1xuICAgICAgICBjb25zdCBwcm9taXNlICAgICAgICAgICA9IHRhc2tQcm9taXNlLnRoZW4oKHsgY29tcGxldGlvblByb21pc2UgfSkgPT4gY29tcGxldGlvblByb21pc2UpO1xuICAgICAgICBjb25zdCByZW1vdmVGcm9tUGVuZGluZyA9ICgpID0+IHJlbW92ZSh0aGlzLnBlbmRpbmdUYXNrUHJvbWlzZXMsIHByb21pc2UpO1xuXG4gICAgICAgIHByb21pc2VcbiAgICAgICAgICAgIC50aGVuKHJlbW92ZUZyb21QZW5kaW5nKVxuICAgICAgICAgICAgLmNhdGNoKHJlbW92ZUZyb21QZW5kaW5nKTtcblxuICAgICAgICBwcm9taXNlLmNhbmNlbCA9ICgpID0+IHRhc2tQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoeyBjYW5jZWxUYXNrIH0pID0+IGNhbmNlbFRhc2soKSlcbiAgICAgICAgICAgIC50aGVuKHJlbW92ZUZyb21QZW5kaW5nKTtcblxuICAgICAgICB0aGlzLnBlbmRpbmdUYXNrUHJvbWlzZXMucHVzaChwcm9taXNlKTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBhc3luYyBfZmluYWxpemVDb21waWxlclNlcnZpY2VTdGF0ZSAodGFzaywgcnVubmFibGVDb25maWd1cmF0aW9uSWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVyU2VydmljZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZT8ucmVtb3ZlVW5pdHNGcm9tU3RhdGUoeyBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9KTtcblxuICAgICAgICAvLyBOT1RFOiBJbiBzb21lIGNhc2VzIChicm93c2VyIHJlc3RhcnQsIHN0b3AgdGFzayBvbiBmaXJzdCBmYWlsLCBldGMuKSxcbiAgICAgICAgLy8gdGhlIGZpeHR1cmUgY29udGV4dHMgbWF5IG5vdCBiZSBkZWxldGVkLlxuICAgICAgICAvLyBXZSByZW1vdmUgYWxsIGZpeHR1cmUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRlc3QgZXhlY3V0aW9uIHRvIGNsZWFuIGZvcmdvdHRlbiBjb250ZXh0cy5cbiAgICAgICAgY29uc3QgZml4dHVyZUlkcyA9IHVuaXEodGFzay50ZXN0cy5tYXAodGVzdCA9PiB0ZXN0LmZpeHR1cmUuaWQpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5yZW1vdmVGaXh0dXJlQ3R4c0Zyb21TdGF0ZSh7IGZpeHR1cmVJZHMgfSk7XG4gICAgfVxuXG4gICAgLy8gUnVuIHRhc2tcbiAgICBfZ2V0RmFpbGVkVGVzdENvdW50ICh0YXNrLCByZXBvcnRlcikge1xuICAgICAgICBsZXQgZmFpbGVkVGVzdENvdW50ID0gcmVwb3J0ZXIudGFza0luZm8udGVzdENvdW50IC0gcmVwb3J0ZXIudGFza0luZm8ucGFzc2VkO1xuXG4gICAgICAgIGlmICh0YXNrLm9wdHMuc3RvcE9uRmlyc3RGYWlsICYmICEhZmFpbGVkVGVzdENvdW50KVxuICAgICAgICAgICAgZmFpbGVkVGVzdENvdW50ID0gMTtcblxuICAgICAgICByZXR1cm4gZmFpbGVkVGVzdENvdW50O1xuICAgIH1cblxuICAgIGFzeW5jIF9nZXRUYXNrUmVzdWx0ICh0YXNrLCBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCwgcnVubmFibGVDb25maWd1cmF0aW9uSWQpIHtcbiAgICAgICAgaWYgKCF0YXNrLm9wdHMubGl2ZSkge1xuICAgICAgICAgICAgdGFzay5vbignYnJvd3Nlci1qb2ItZG9uZScsIGFzeW5jIGpvYiA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoam9iLmJyb3dzZXJDb25uZWN0aW9ucy5tYXAoYXN5bmMgYmMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBicm93c2VyU2V0LnJlbGVhc2VDb25uZWN0aW9uKGJjKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMuY2xlYXJMaXN0ZW5lcnMoJ2Vycm9yJyk7XG5cbiAgICAgICAgY29uc3QgYnJvd3NlclNldEVycm9yUHJvbWlzZSA9IHByb21pc2lmeUV2ZW50KGJyb3dzZXJTZXQsICdlcnJvcicpO1xuICAgICAgICBjb25zdCB0YXNrRXJyb3JQcm9taXNlICAgICAgID0gcHJvbWlzaWZ5RXZlbnQodGFzaywgJ2Vycm9yJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VCdXNFcnJvclByb21pc2UgPSBwcm9taXNpZnlFdmVudCh0aGlzLl9tZXNzYWdlQnVzLCAnZXJyb3InKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciAgICAgICA9IG5ldyBSZXBvcnRlclN0cmVhbUNvbnRyb2xsZXIodGhpcy5fbWVzc2FnZUJ1cywgcmVwb3J0ZXJzKTtcblxuICAgICAgICBjb25zdCB0YXNrRG9uZVByb21pc2UgPSB0aGlzLl9tZXNzYWdlQnVzLm9uY2UoJ2RvbmUnKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gYnJvd3NlclNldEVycm9yUHJvbWlzZS5jYW5jZWwoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVwb3J0ZXJzLm1hcChyZXBvcnRlciA9PiByZXBvcnRlci50YXNrSW5mby5wZW5kaW5nVGFza0RvbmVQcm9taXNlKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgICAgIHRhc2tEb25lUHJvbWlzZSxcbiAgICAgICAgICAgIGJyb3dzZXJTZXRFcnJvclByb21pc2UsXG4gICAgICAgICAgICB0YXNrRXJyb3JQcm9taXNlLFxuICAgICAgICAgICAgbWVzc2FnZUJ1c0Vycm9yUHJvbWlzZSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGVzdGVkQXBwKVxuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0ZXN0ZWRBcHAuZXJyb3JQcm9taXNlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoJ3VuaGFuZGxlZC1yZWplY3Rpb24nKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlcG9ydGVycy5tYXAocmVwb3J0ZXIgPT4gcmVwb3J0ZXIudGFza0luZm8ucGVuZGluZ1Rhc2tEb25lUHJvbWlzZSkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZVRhc2tBbmRSZWxhdGVkQXNzZXRzKHRhc2ssIGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCk7XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VBc3NldHMoYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHApO1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5hbGl6ZUNvbXBpbGVyU2VydmljZVN0YXRlKHRhc2ssIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkKTtcblxuICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5tdWx0aXBsZVN0cmVhbUVycm9yKVxuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQ29udHJvbGxlci5tdWx0aXBsZVN0cmVhbUVycm9yO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGYWlsZWRUZXN0Q291bnQodGFzaywgcmVwb3J0ZXJzWzBdKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVGFzayAodGVzdHMsIGJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLCBwcm94eSwgb3B0cywgd2FybmluZ0xvZykge1xuICAgICAgICByZXR1cm4gbmV3IFRhc2soe1xuICAgICAgICAgICAgdGVzdHMsXG4gICAgICAgICAgICBicm93c2VyQ29ubmVjdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIHByb3h5LFxuICAgICAgICAgICAgb3B0cyxcbiAgICAgICAgICAgIHJ1bm5lcldhcm5pbmdMb2c6IHdhcm5pbmdMb2csXG4gICAgICAgICAgICBjb21waWxlclNlcnZpY2U6ICB0aGlzLmNvbXBpbGVyU2VydmljZSxcbiAgICAgICAgICAgIG1lc3NhZ2VCdXM6ICAgICAgIHRoaXMuX21lc3NhZ2VCdXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9ydW5UYXNrICh7IHJlcG9ydGVycywgYnJvd3NlclNldCwgdGVzdHMsIHRlc3RlZEFwcCwgb3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfSkge1xuICAgICAgICBjb25zdCB0YXNrICAgICAgICAgICAgICA9IHRoaXMuX2NyZWF0ZVRhc2sodGVzdHMsIGJyb3dzZXJTZXQuYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMsIHRoaXMucHJveHksIG9wdGlvbnMsIHRoaXMud2FybmluZ0xvZyk7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25Qcm9taXNlID0gdGhpcy5fZ2V0VGFza1Jlc3VsdCh0YXNrLCBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCwgcnVubmFibGVDb25maWd1cmF0aW9uSWQpO1xuICAgICAgICBsZXQgY29tcGxldGVkICAgICAgICAgICA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMub24oJ3N0YXJ0Jywgc3RhcnRIYW5kbGluZ1Rlc3RFcnJvcnMpO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc2tpcFVuY2F1Z2h0RXJyb3JzKSkge1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5vbigndGVzdC1ydW4tc3RhcnQnLCBhZGRSdW5uaW5nVGVzdCk7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlQnVzLm9uKCd0ZXN0LXJ1bi1kb25lJywgKHsgZXJycyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRXJyb3JzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHJlbW92ZVJ1bm5pbmdUZXN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMub24oJ2RvbmUnLCBzdG9wSGFuZGxpbmdUZXN0RXJyb3JzKTtcblxuICAgICAgICB0YXNrLm9uKCdlcnJvcicsIHN0b3BIYW5kbGluZ1Rlc3RFcnJvcnMpO1xuXG4gICAgICAgIGNvbnN0IG9uVGFza0NvbXBsZXRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRhc2sudW5SZWdpc3RlckNsaWVudFNjcmlwdFJvdXRpbmcoKTtcblxuICAgICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wbGV0aW9uUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4ob25UYXNrQ29tcGxldGVkKVxuICAgICAgICAgICAgLmNhdGNoKG9uVGFza0NvbXBsZXRlZCk7XG5cbiAgICAgICAgY29uc3QgY2FuY2VsVGFzayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghY29tcGxldGVkKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VUYXNrQW5kUmVsYXRlZEFzc2V0cyh0YXNrLCBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCwgcnVubmFibGVDb25maWd1cmF0aW9uSWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7IGNvbXBsZXRpb25Qcm9taXNlLCBjYW5jZWxUYXNrIH07XG4gICAgfVxuXG4gICAgX3JlZ2lzdGVyQXNzZXRzIChhc3NldHMpIHtcbiAgICAgICAgYXNzZXRzLmZvckVhY2goYXNzZXQgPT4gdGhpcy5wcm94eS5HRVQoYXNzZXQucGF0aCwgYXNzZXQuaW5mbykpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZURlYnVnTG9nZ2VyICgpIHtcbiAgICAgICAgY29uc3QgZGVidWdMb2dnZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kZWJ1Z0xvZ2dlcik7XG5cbiAgICAgICAgY29uc3QgZGVidWdMb2dnZXJEZWZpbmVkQ29ycmVjdGx5ID0gZGVidWdMb2dnZXIgPT09IG51bGwgfHwgISFkZWJ1Z0xvZ2dlciAmJlxuICAgICAgICAgICAgWydzaG93QnJlYWtwb2ludCcsICdoaWRlQnJlYWtwb2ludCddLmV2ZXJ5KG1ldGhvZCA9PiBtZXRob2QgaW4gZGVidWdMb2dnZXIgJiYgaXNGdW5jdGlvbihkZWJ1Z0xvZ2dlclttZXRob2RdKSk7XG5cbiAgICAgICAgaWYgKCFkZWJ1Z0xvZ2dlckRlZmluZWRDb3JyZWN0bHkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIFtPUFRJT05fTkFNRVMuZGVidWdMb2dnZXJdOiBkZWZhdWx0RGVidWdMb2dnZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWxpZGF0ZVNwZWVkT3B0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3BlZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5zcGVlZCk7XG5cbiAgICAgICAgaWYgKHNwZWVkID09PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzcGVlZCAhPT0gJ251bWJlcicgfHwgaXNOYU4oc3BlZWQpIHx8IHNwZWVkIDwgMC4wMSB8fCBzcGVlZCA+IDEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmludmFsaWRTcGVlZFZhbHVlKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVDb25jdXJyZW5jeU9wdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuY29uY3VycmVuY3kpO1xuXG4gICAgICAgIGlmIChjb25jdXJyZW5jeSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uY3VycmVuY3kgIT09ICdudW1iZXInIHx8IGlzTmFOKGNvbmN1cnJlbmN5KSB8fCBjb25jdXJyZW5jeSA8IDEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmludmFsaWRDb25jdXJyZW5jeUZhY3Rvcik7XG5cbiAgICAgICAgaWYgKGNvbmN1cnJlbmN5ID4gMSAmJiB0aGlzLmJvb3RzdHJhcHBlci5icm93c2Vycy5zb21lKGJyb3dzZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIgaW5zdGFuY2VvZiBCcm93c2VyQ29ubmVjdGlvblxuICAgICAgICAgICAgICAgID8gYnJvd3Nlci5icm93c2VySW5mby5icm93c2VyT3B0aW9uLmNkcFBvcnRcbiAgICAgICAgICAgICAgICA6IGJyb3dzZXIuYnJvd3Nlck9wdGlvbi5jZHBQb3J0O1xuICAgICAgICB9KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90U2V0Q29uY3VycmVuY3lXaXRoQ0RQUG9ydCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlU2tpcEpzRXJyb3JzT3B0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2tpcEpzRXJyb3JzT3B0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnNraXBKc0Vycm9ycyk7XG5cbiAgICAgICAgaWYgKCFza2lwSnNFcnJvcnNPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHZhbGlkYXRlU2tpcEpzRXJyb3JzT3B0aW9uVmFsdWUoc2tpcEpzRXJyb3JzT3B0aW9ucywgR2VuZXJhbEVycm9yKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVDdXN0b21BY3Rpb25zT3B0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tQWN0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmN1c3RvbUFjdGlvbnMpO1xuXG4gICAgICAgIGlmICghY3VzdG9tQWN0aW9ucylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbUFjdGlvbnMgIT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkQ3VzdG9tQWN0aW9uc09wdGlvblR5cGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBjdXN0b21BY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1c3RvbUFjdGlvbnNbbmFtZV0gIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkQ3VzdG9tQWN0aW9uVHlwZSwgbmFtZSwgdHlwZW9mIGN1c3RvbUFjdGlvbnNbbmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3ZhbGlkYXRlQnJvd3NlcnMgKCkge1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmJyb3dzZXJzKTtcblxuICAgICAgICBpZiAoIWJyb3dzZXJzIHx8IEFycmF5LmlzQXJyYXkoYnJvd3NlcnMpICYmICFicm93c2Vycy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmJyb3dzZXJOb3RTZXQpO1xuXG4gICAgICAgIGlmIChPUy5tYWMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jaGVja1JlcXVpcmVkUGVybWlzc2lvbnMoYnJvd3NlcnMpO1xuXG4gICAgICAgIGlmIChPUy5saW51eCAmJiAhZGV0ZWN0RGlzcGxheSgpKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2hlY2tUaGF0VGVzdHNDYW5SdW5XaXRob3V0RGlzcGxheShicm93c2Vycyk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUmVxdWVzdFRpbWVvdXRPcHRpb24gKG9wdGlvbk5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFRpbWVvdXQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKG9wdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0VGltZW91dCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXIsIG51bGwsIGBcIiR7b3B0aW9uTmFtZX1cIiBvcHRpb25gLCByZXF1ZXN0VGltZW91dCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUHJveHlCeXBhc3NPcHRpb24gKCkge1xuICAgICAgICBsZXQgcHJveHlCeXBhc3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5wcm94eUJ5cGFzcyk7XG5cbiAgICAgICAgaWYgKHByb3h5QnlwYXNzID09PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShbIGlzLnN0cmluZywgaXMuYXJyYXkgXSwgbnVsbCwgJ1RoZSBcInByb3h5QnlwYXNzXCIgYXJndW1lbnQnLCBwcm94eUJ5cGFzcyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcm94eUJ5cGFzcyA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBwcm94eUJ5cGFzcyA9IFtwcm94eUJ5cGFzc107XG5cbiAgICAgICAgcHJveHlCeXBhc3MgPSBwcm94eUJ5cGFzcy5yZWR1Y2UoKGFyciwgcnVsZXMpID0+IHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuc3RyaW5nLCBudWxsLCAnVGhlIFwicHJveHlCeXBhc3NcIiBhcmd1bWVudCcsIHJ1bGVzKTtcblxuICAgICAgICAgICAgcmV0dXJuIGFyci5jb25jYXQocnVsZXMuc3BsaXQoJywnKSk7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgcHJveHlCeXBhc3MgfSk7XG4gICAgfVxuXG4gICAgX2dldFNjcmVlbnNob3RPcHRpb25zICgpIHtcbiAgICAgICAgbGV0IHsgcGF0aCwgcGF0aFBhdHRlcm4sIHRha2VPbkZhaWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5zY3JlZW5zaG90cykgfHwge307XG5cbiAgICAgICAgaWYgKCFwYXRoKVxuICAgICAgICAgICAgcGF0aCA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnNjcmVlbnNob3RQYXRoKTtcblxuICAgICAgICBpZiAoIXBhdGhQYXR0ZXJuKVxuICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5zY3JlZW5zaG90UGF0aFBhdHRlcm4pO1xuXG4gICAgICAgIGlmICghdGFrZU9uRmFpbHMpXG4gICAgICAgICAgICB0YWtlT25GYWlscyA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB7IHBhdGgsIHBhdGhQYXR0ZXJuLCB0YWtlT25GYWlscyB9O1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVNjcmVlbnNob3RPcHRpb25zICgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBwYXRoUGF0dGVybiB9ID0gdGhpcy5fZ2V0U2NyZWVuc2hvdE9wdGlvbnMoKTtcblxuICAgICAgICBjb25zdCBkaXNhYmxlU2NyZWVuc2hvdHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kaXNhYmxlU2NyZWVuc2hvdHMpIHx8ICFwYXRoO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLmRpc2FibGVTY3JlZW5zaG90c106IGRpc2FibGVTY3JlZW5zaG90cyB9KTtcblxuICAgICAgICBpZiAoZGlzYWJsZVNjcmVlbnNob3RzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVNjcmVlbnNob3RQYXRoKHBhdGgsICdzY3JlZW5zaG90cyBiYXNlIGRpcmVjdG9yeSBwYXRoJyk7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLnNjcmVlbnNob3RzXTogeyBwYXRoOiByZXNvbHZlUGF0aChwYXRoKSB9IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGhQYXR0ZXJuKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVNjcmVlbnNob3RQYXRoKHBhdGhQYXR0ZXJuLCAnc2NyZWVuc2hvdHMgcGF0aCBwYXR0ZXJuJyk7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLnNjcmVlbnNob3RzXTogeyBwYXRoUGF0dGVybiB9IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3ZhbGlkYXRlVmlkZW9PcHRpb25zICgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9QYXRoICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy52aWRlb1BhdGgpO1xuICAgICAgICBjb25zdCB2aWRlb0VuY29kaW5nT3B0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnZpZGVvRW5jb2RpbmdPcHRpb25zKTtcblxuICAgICAgICBsZXQgdmlkZW9PcHRpb25zID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMudmlkZW9PcHRpb25zKTtcblxuICAgICAgICBpZiAoIXZpZGVvUGF0aCkge1xuICAgICAgICAgICAgaWYgKHZpZGVvT3B0aW9ucyB8fCB2aWRlb0VuY29kaW5nT3B0aW9ucylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdFNldFZpZGVvT3B0aW9uc1dpdGhvdXRCYXNlVmlkZW9QYXRoU3BlY2lmaWVkKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IFtPUFRJT05fTkFNRVMudmlkZW9QYXRoXTogcmVzb2x2ZVBhdGgodmlkZW9QYXRoKSB9KTtcblxuICAgICAgICBpZiAoIXZpZGVvT3B0aW9ucykge1xuICAgICAgICAgICAgdmlkZW9PcHRpb25zID0ge307XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLnZpZGVvT3B0aW9uc106IHZpZGVvT3B0aW9ucyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWRlb09wdGlvbnMuZmZtcGVnUGF0aClcbiAgICAgICAgICAgIHZpZGVvT3B0aW9ucy5mZm1wZWdQYXRoID0gcmVzb2x2ZVBhdGgodmlkZW9PcHRpb25zLmZmbXBlZ1BhdGgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2aWRlb09wdGlvbnMuZmZtcGVnUGF0aCA9IGF3YWl0IGRldGVjdEZGTVBFRygpO1xuXG4gICAgICAgIGlmICghdmlkZW9PcHRpb25zLmZmbXBlZ1BhdGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdEZpbmRGRk1QRUcpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUNvbXBpbGVyT3B0aW9ucyAoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFjb21waWxlck9wdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWVkQ29tcGlsZXJzICA9IE9iamVjdC5rZXlzKGNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6ZWRDb21waWxlcnMgPSBPYmplY3Qua2V5cyhDdXN0b21pemFibGVDb21waWxlcnMpO1xuICAgICAgICBjb25zdCB3cm9uZ0NvbXBpbGVycyAgICAgID0gc3BlY2lmaWVkQ29tcGlsZXJzLmZpbHRlcihjb21waWxlciA9PiAhY3VzdG9taXplZENvbXBpbGVycy5pbmNsdWRlcyhjb21waWxlcikpO1xuXG4gICAgICAgIGlmICghd3JvbmdDb21waWxlcnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbXBpbGVyTGlzdFN0ciA9IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyh3cm9uZ0NvbXBpbGVycywgdm9pZCAwLCBcIidcIik7XG4gICAgICAgIGNvbnN0IHBsdXJhbFN1ZmZpeCAgICA9IGdldFBsdXJhbFN1ZmZpeCh3cm9uZ0NvbXBpbGVycyk7XG5cbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RDdXN0b21pemVTcGVjaWZpZWRDb21waWxlcnMsIGNvbXBpbGVyTGlzdFN0ciwgcGx1cmFsU3VmZml4KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVSZXRyeVRlc3RQYWdlc09wdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5VGVzdFBhZ2VzT3B0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucmV0cnlUZXN0UGFnZXMpO1xuXG4gICAgICAgIGlmICghcmV0cnlUZXN0UGFnZXNPcHRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc3NsID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuc3NsKTtcblxuICAgICAgICBpZiAoc3NsKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuaG9zdG5hbWUpO1xuXG4gICAgICAgIGlmIChpc0xvY2FsaG9zdChob3N0bmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RFbmFibGVSZXRyeVRlc3RQYWdlc09wdGlvbik7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUXVhcmFudGluZU9wdGlvbnMgKCkge1xuICAgICAgICBjb25zdCBxdWFyYW50aW5lTW9kZSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnF1YXJhbnRpbmVNb2RlKTtcblxuICAgICAgICBpZiAodHlwZW9mIHF1YXJhbnRpbmVNb2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIHZhbGlkYXRlUXVhcmFudGluZU9wdGlvbnMocXVhcmFudGluZU1vZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIF92YWxpZGF0ZVJ1bk9wdGlvbnMgKCkge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZURlYnVnTG9nZ2VyKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlU2NyZWVuc2hvdE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFsaWRhdGVWaWRlb09wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVTcGVlZE9wdGlvbigpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZVByb3h5QnlwYXNzT3B0aW9uKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlQ29tcGlsZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlUmV0cnlUZXN0UGFnZXNPcHRpb24oKTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVSZXF1ZXN0VGltZW91dE9wdGlvbihPUFRJT05fTkFNRVMucGFnZVJlcXVlc3RUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVSZXF1ZXN0VGltZW91dE9wdGlvbihPUFRJT05fTkFNRVMuYWpheFJlcXVlc3RUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVRdWFyYW50aW5lT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUNvbmN1cnJlbmN5T3B0aW9uKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlU2tpcEpzRXJyb3JzT3B0aW9uKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlQ3VzdG9tQWN0aW9uc09wdGlvbigpO1xuICAgICAgICBhd2FpdCB0aGlzLl92YWxpZGF0ZUJyb3dzZXJzKCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvb3RzdHJhcHBlclxuICAgICAgICAgICAgLmNyZWF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbigpXG4gICAgICAgICAgICAudGhlbihydW5uYWJsZUNvbmZpZ3VyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZG9uZS1ib290c3RyYXBwaW5nJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVubmFibGVDb25maWd1cmF0aW9uO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlU2NyZWVuc2hvdFBhdGggKHNjcmVlbnNob3RQYXRoLCBwYXRoVHlwZSkge1xuICAgICAgICBjb25zdCBmb3JiaWRkZW5DaGFyc0xpc3QgPSBjaGVja0ZpbGVQYXRoKHNjcmVlbnNob3RQYXRoKTtcblxuICAgICAgICBpZiAoZm9yYmlkZGVuQ2hhcnNMaXN0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuZm9yYmlkZGVuQ2hhcmF0ZXJzSW5TY3JlZW5zaG90UGF0aCwgc2NyZWVuc2hvdFBhdGgsIHBhdGhUeXBlLCByZW5kZXJGb3JiaWRkZW5DaGFyc0xpc3QoZm9yYmlkZGVuQ2hhcnNMaXN0KSk7XG4gICAgfVxuXG4gICAgX3NldEJvb3RzdHJhcHBlck9wdGlvbnMgKCkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucHJlcGFyZSgpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubm90aWZ5QWJvdXRPdmVycmlkZGVuT3B0aW9ucyh0aGlzLndhcm5pbmdMb2cpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubm90aWZ5QWJvdXREZXByZWNhdGVkT3B0aW9ucyh0aGlzLndhcm5pbmdMb2cpO1xuXG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5zcmMpIHx8IHRoaXMuYm9vdHN0cmFwcGVyLnNvdXJjZXM7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmJyb3dzZXJzICAgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5icm93c2VycykgfHwgdGhpcy5ib290c3RyYXBwZXIuYnJvd3NlcnM7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmNvbmN1cnJlbmN5ICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5jb25jdXJyZW5jeSk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmFwcENvbW1hbmQgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5hcHBDb21tYW5kKSB8fCB0aGlzLmJvb3RzdHJhcHBlci5hcHBDb21tYW5kO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5hcHBJbml0RGVsYXkgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuYXBwSW5pdERlbGF5KTtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIuZmlsdGVyICAgICAgICAgICAgICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmZpbHRlcikgfHwgdGhpcy5ib290c3RyYXBwZXIuZmlsdGVyO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5yZXBvcnRlcnMgICAgICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucmVwb3J0ZXIpIHx8IHRoaXMuYm9vdHN0cmFwcGVyLnJlcG9ydGVycztcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIudHNDb25maWdQYXRoICAgICAgICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnRzQ29uZmlnUGF0aCk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmNsaWVudFNjcmlwdHMgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5jbGllbnRTY3JpcHRzKSB8fCB0aGlzLmJvb3RzdHJhcHBlci5jbGllbnRTY3JpcHRzO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGlzYWJsZU11bHRpcGxlV2luZG93cyk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLnByb3h5bGVzcyAgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5leHBlcmltZW50YWxQcm94eWxlc3MpO1xuICAgICAgICB0aGlzLmJvb3RzdHJhcHBlci5jb21waWxlck9wdGlvbnMgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwZXIuYnJvd3NlckluaXRUaW1lb3V0ICAgICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmJyb3dzZXJJbml0VGltZW91dCk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmhvb2tzICAgICAgICAgICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5ob29rcyk7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGVyLmNvbmZpZ3VyYXRpb24gICAgICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgYXN5bmMgX2FkZERhc2hib2FyZFJlcG9ydGVySWZOZWVkZWQgKCkge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPcHRpb25zID0gYXdhaXQgdGhpcy5fZ2V0RGFzaGJvYXJkT3B0aW9ucygpO1xuICAgICAgICBsZXQgcmVwb3J0ZXJPcHRpb25zICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucmVwb3J0ZXIpO1xuXG4gICAgICAgIC8vIE5PVEU6IHdlIHNob3VsZCBzZW5kIHJlcG9ydHMgd2hlbiBzZW5kUmVwb3J0IGlzIHVuZGVmaW5lZFxuICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgb3B0aW9uIGJpbmFyeSBpbnN0ZWFkIG9mIHRyaS1zdGF0ZVxuICAgICAgICBpZiAoIWRhc2hib2FyZE9wdGlvbnMudG9rZW4gfHwgZGFzaGJvYXJkT3B0aW9ucy5zZW5kUmVwb3J0ID09PSBmYWxzZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoIXJlcG9ydGVyT3B0aW9ucylcbiAgICAgICAgICAgIHJlcG9ydGVyT3B0aW9ucyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRhc2hib2FyZFJlcG9ydGVyID0gcmVwb3J0ZXJPcHRpb25zLmZpbmQocmVwb3J0ZXIgPT4gcmVwb3J0ZXIubmFtZSA9PT0gREFTSEJPQVJEX1JFUE9SVEVSX05BTUUpO1xuXG4gICAgICAgIGlmICghZGFzaGJvYXJkUmVwb3J0ZXIpXG4gICAgICAgICAgICByZXBvcnRlck9wdGlvbnMucHVzaCh7IG5hbWU6IERBU0hCT0FSRF9SRVBPUlRFUl9OQU1FLCBvcHRpb25zOiBkYXNoYm9hcmRPcHRpb25zIH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkYXNoYm9hcmRSZXBvcnRlci5vcHRpb25zID0gZGFzaGJvYXJkT3B0aW9ucztcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWVyZ2VPcHRpb25zKHsgW09QVElPTl9OQU1FUy5yZXBvcnRlcl06IHJlcG9ydGVyT3B0aW9ucyB9KTtcbiAgICB9XG5cbiAgICBfdHVybk9uU2NyZWVuc2hvdHNJZk5lZWRlZCAoKSB7XG4gICAgICAgIGNvbnN0IHsgdGFrZU9uRmFpbHMgfSA9IHRoaXMuX2dldFNjcmVlbnNob3RPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVyT3B0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJlcG9ydGVyKTtcblxuICAgICAgICBpZiAoIXRha2VPbkZhaWxzICYmIHJlcG9ydGVyT3B0aW9ucyAmJiBjYXN0QXJyYXkocmVwb3J0ZXJPcHRpb25zKS5zb21lKHJlcG9ydGVyID0+IHJlcG9ydGVyLm5hbWUgPT09IERBU0hCT0FSRF9SRVBPUlRFUl9OQU1FKSlcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBbT1BUSU9OX05BTUVTLnNjcmVlbnNob3RzXTogeyB0YWtlT25GYWlsczogdHJ1ZSwgYXV0b1Rha2VPbkZhaWxzOiB0cnVlIH0gfSk7XG4gICAgfVxuXG4gICAgX3Jlc2V0QmVmb3JlUnVuICgpIHtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5jbGVhckxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIF9nZXREYXNoYm9hcmRVcmwgKCkge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRSZXBvcnRlciA9IHRoaXMuX3JlcG9ydGVycy5maW5kKHIgPT4gci5wbHVnaW4ubmFtZSA9PT0gJ2Rhc2hib2FyZCcpPy5wbHVnaW47XG5cbiAgICAgICAgcmV0dXJuIGRhc2hib2FyZFJlcG9ydGVyPy5nZXRSZXBvcnRVcmwgPyBkYXNoYm9hcmRSZXBvcnRlci5nZXRSZXBvcnRVcmwoKSA6ICcnO1xuICAgIH1cblxuICAgIF9wcmVwYXJlQW5kUnVuVGFzayAob3B0aW9ucykge1xuICAgICAgICBjb25zdCBtZXNzYWdlQnVzRXJyb3JQcm9taXNlID0gcHJvbWlzaWZ5RXZlbnQodGhpcy5fbWVzc2FnZUJ1cywgJ2Vycm9yJyk7XG4gICAgICAgIGNvbnN0IHRhc2tPcHRpb25zUHJvbWlzZSAgICAgPSB0aGlzLl9nZXRSdW5UYXNrT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYmluZGVkVGFza1J1bm5lciAgICAgICA9IHRoaXMuX3J1blRhc2suYmluZCh0aGlzKTtcbiAgICAgICAgY29uc3QgcnVuVGFza1Byb21pc2UgICAgICAgICA9IHRhc2tPcHRpb25zUHJvbWlzZS50aGVuKGJpbmRlZFRhc2tSdW5uZXIpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgcnVuVGFza1Byb21pc2UsXG4gICAgICAgICAgICBtZXNzYWdlQnVzRXJyb3JQcm9taXNlLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlQ2FuY2VsYWJsZVByb21pc2UocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX3ByZXBhcmVSZXBvcnRlcnMgKCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9hZGREYXNoYm9hcmRSZXBvcnRlcklmTmVlZGVkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3R1cm5PblNjcmVlbnNob3RzSWZOZWVkZWQoKTtcblxuICAgICAgICBjb25zdCByZXBvcnRlclBsdWdpbnMgPSBhd2FpdCBSZXBvcnRlci5nZXRSZXBvcnRlclBsdWdpbnModGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucmVwb3J0ZXIpKTtcblxuICAgICAgICB0aGlzLl9yZXBvcnRlcnMgPSByZXBvcnRlclBsdWdpbnMubWFwKHJlcG9ydGVyID0+IG5ldyBSZXBvcnRlcihyZXBvcnRlci5wbHVnaW4sIHRoaXMuX21lc3NhZ2VCdXMsIHJlcG9ydGVyLm91dFN0cmVhbSwgcmVwb3J0ZXIubmFtZSkpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX3JlcG9ydGVycy5tYXAocmVwb3J0ZXIgPT4gcmVwb3J0ZXIuaW5pdCgpKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX3ByZXBhcmVPcHRpb25zIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3NldENvbmZpZ3VyYXRpb25PcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBvcnRlcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0Qm9vdHN0cmFwcGVyT3B0aW9ucygpO1xuXG4gICAgICAgIGxvZ0VudHJ5KERFQlVHX0xPR0dFUiwgdGhpcy5jb25maWd1cmF0aW9uKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl92YWxpZGF0ZVJ1bk9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0UnVuVGFza09wdGlvbnMgKG9wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgeyBicm93c2VyU2V0LCB0ZXN0cywgdGVzdGVkQXBwLCBjb21tb25DbGllbnRTY3JpcHRzLCBpZCB9ID0gYXdhaXQgdGhpcy5fY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNsaWVudFNjcmlwdHModGVzdHMsIGNvbW1vbkNsaWVudFNjcmlwdHMpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9ucygpLFxuXG4gICAgICAgICAgICBkYXNoYm9hcmRVcmw6IHRoaXMuX2dldERhc2hib2FyZFVybCgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwcGVyLmNvbXBpbGVyU2VydmljZT8uc2V0T3B0aW9ucyh7IHZhbHVlOiByZXN1bHRPcHRpb25zIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicm93c2VyU2V0LFxuICAgICAgICAgICAgdGVzdHMsXG4gICAgICAgICAgICB0ZXN0ZWRBcHAsXG5cbiAgICAgICAgICAgIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkOiBpZCxcbiAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgICAgICAgICAgICByZXN1bHRPcHRpb25zLFxuICAgICAgICAgICAgcmVwb3J0ZXJzOiAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVycyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0RGFzaGJvYXJkT3B0aW9ucyAoKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VPcHRpb25zID0gYXdhaXQgdGhpcy5fbG9hZERhc2hib2FyZE9wdGlvbnNGcm9tU3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBjb25maWdPcHRpb25zICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmRhc2hib2FyZCk7XG4gICAgICAgIGNvbnN0IGVudk9wdGlvbnMgICAgID0gZ2V0RW52T3B0aW9ucygpO1xuXG4gICAgICAgIHJldHVybiBtZXJnZSh7fSwgc3RvcmFnZU9wdGlvbnMsIGNvbmZpZ09wdGlvbnMsIGVudk9wdGlvbnMpO1xuICAgIH1cblxuICAgIGFzeW5jIF9sb2FkRGFzaGJvYXJkT3B0aW9uc0Zyb21TdG9yYWdlICgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBEYXNoYm9hcmRDb25maWdTdG9yYWdlKCk7XG5cbiAgICAgICAgYXdhaXQgc3RvcmFnZS5sb2FkKCk7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JhZ2Uub3B0aW9ucztcbiAgICB9XG5cbiAgICBhc3luYyBfcHJlcGFyZUNsaWVudFNjcmlwdHMgKHRlc3RzLCBjbGllbnRTY3JpcHRzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0ZXN0cy5tYXAoYXN5bmMgdGVzdCA9PiB7XG4gICAgICAgICAgICBpZiAodGVzdC5pc0xlZ2FjeSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCBsb2FkZWRUZXN0Q2xpZW50U2NyaXB0cyA9IGF3YWl0IGxvYWRDbGllbnRTY3JpcHRzKHRlc3QuY2xpZW50U2NyaXB0cywgZGlybmFtZSh0ZXN0LnRlc3RGaWxlLmZpbGVuYW1lKSk7XG5cbiAgICAgICAgICAgIGxvYWRlZFRlc3RDbGllbnRTY3JpcHRzID0gY2xpZW50U2NyaXB0cy5jb25jYXQobG9hZGVkVGVzdENsaWVudFNjcmlwdHMpO1xuXG4gICAgICAgICAgICB0ZXN0LmNsaWVudFNjcmlwdHMgPSBzZXRVbmlxdWVVcmxzKGxvYWRlZFRlc3RDbGllbnRTY3JpcHRzKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIF9oYXNMb2NhbEJyb3dzZXJzIChicm93c2VySW5mbykge1xuICAgICAgICBmb3IgKGNvbnN0IGJyb3dzZXIgb2YgYnJvd3NlckluZm8pIHtcbiAgICAgICAgICAgIGlmIChicm93c2VyIGluc3RhbmNlb2YgQnJvd3NlckNvbm5lY3Rpb24pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChhd2FpdCBicm93c2VyLnByb3ZpZGVyLmlzTG9jYWxCcm93c2VyKHZvaWQgMCwgYnJvd3Nlci5icm93c2VyTmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgX2NoZWNrUmVxdWlyZWRQZXJtaXNzaW9ucyAoYnJvd3NlckluZm8pIHtcbiAgICAgICAgY29uc3QgaGFzTG9jYWxCcm93c2VycyA9IGF3YWl0IHRoaXMuX2hhc0xvY2FsQnJvd3NlcnMoYnJvd3NlckluZm8pO1xuXG4gICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IGF1dGhlbnRpY2F0aW9uSGVscGVyKFxuICAgICAgICAgICAgKCkgPT4gZmluZFdpbmRvdygnJyksXG4gICAgICAgICAgICBlcnJvcnMuVW5hYmxlVG9BY2Nlc3NTY3JlZW5SZWNvcmRpbmdBUElFcnJvcixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZTogaGFzTG9jYWxCcm93c2VycyAmJiAhaXNDSSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFlcnJvcilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoaGFzTG9jYWxCcm93c2VycylcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuXG4gICAgICAgIFJlbW90ZUJyb3dzZXJQcm92aWRlci5jYW5EZXRlY3RMb2NhbEJyb3dzZXJzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgX2NoZWNrVGhhdFRlc3RzQ2FuUnVuV2l0aG91dERpc3BsYXkgKGJyb3dzZXJJbmZvU291cmNlKSB7XG4gICAgICAgIGZvciAobGV0IGJyb3dzZXJJbmZvIG9mIGJyb3dzZXJJbmZvU291cmNlKSB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlckluZm8gaW5zdGFuY2VvZiBCcm93c2VyQ29ubmVjdGlvbilcbiAgICAgICAgICAgICAgICBicm93c2VySW5mbyA9IGJyb3dzZXJJbmZvLmJyb3dzZXJJbmZvO1xuXG4gICAgICAgICAgICBjb25zdCBpc0xvY2FsQnJvd3NlciAgICA9IGF3YWl0IGJyb3dzZXJJbmZvLnByb3ZpZGVyLmlzTG9jYWxCcm93c2VyKHZvaWQgMCwgYnJvd3NlckluZm8uYnJvd3Nlck5hbWUpO1xuICAgICAgICAgICAgY29uc3QgaXNIZWFkbGVzc0Jyb3dzZXIgPSBhd2FpdCBicm93c2VySW5mby5wcm92aWRlci5pc0hlYWRsZXNzQnJvd3Nlcih2b2lkIDAsIGJyb3dzZXJJbmZvLmJyb3dzZXJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGlzTG9jYWxCcm93c2VyICYmICFpc0hlYWRsZXNzQnJvd3Nlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfRVJST1JTLmNhbm5vdFJ1bkxvY2FsTm9uSGVhZGxlc3NCcm93c2VyV2l0aG91dERpc3BsYXksXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJJbmZvLmFsaWFzLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfc2V0Q29uZmlndXJhdGlvbk9wdGlvbnMgKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uYXN5bmNNZXJnZU9wdGlvbnModGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgZW1iZWRkaW5nT3B0aW9ucyAob3B0cykge1xuICAgICAgICBjb25zdCB7IGFzc2V0cywgVGVzdFJ1bkN0b3IgfSA9IG9wdHM7XG5cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJBc3NldHMoYXNzZXRzKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5UZXN0UnVuQ3RvciA9IFRlc3RSdW5DdG9yO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNyYyAoLi4uc291cmNlcykge1xuICAgICAgICBpZiAodGhpcy5hcGlNZXRob2RXYXNDYWxsZWQuc3JjKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5tdWx0aXBsZUFQSU1ldGhvZENhbGxGb3JiaWRkZW4sIE9QVElPTl9OQU1FUy5zcmMpO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnNyY10gPSB0aGlzLl9wcmVwYXJlQXJyYXlQYXJhbWV0ZXIoc291cmNlcyk7XG4gICAgICAgIHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLnNyYyAgICAgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJyb3dzZXJzICguLi5icm93c2Vycykge1xuICAgICAgICBpZiAodGhpcy5hcGlNZXRob2RXYXNDYWxsZWQuYnJvd3NlcnMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm11bHRpcGxlQVBJTWV0aG9kQ2FsbEZvcmJpZGRlbiwgT1BUSU9OX05BTUVTLmJyb3dzZXJzKTtcblxuICAgICAgICB0aGlzLl9vcHRpb25zLmJyb3dzZXJzICAgICAgICAgICA9IHRoaXMuX3ByZXBhcmVBcnJheVBhcmFtZXRlcihicm93c2Vycyk7XG4gICAgICAgIHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLmJyb3dzZXJzID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25jdXJyZW5jeSAoY29uY3VycmVuY3kpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5O1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJlcG9ydGVyIChuYW1lLCBvdXRwdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLnJlcG9ydGVyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5tdWx0aXBsZUFQSU1ldGhvZENhbGxGb3JiaWRkZW4sIE9QVElPTl9OQU1FUy5yZXBvcnRlcik7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMucmVwb3J0ZXJdID0gdGhpcy5fcHJlcGFyZUFycmF5UGFyYW1ldGVyKHByZXBhcmVSZXBvcnRlcnMobmFtZSwgb3V0cHV0KSk7XG4gICAgICAgIHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLnJlcG9ydGVyICAgICA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmlsdGVyIChmaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5maWx0ZXIgPSBmaWx0ZXI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdXNlUHJveHkgKHByb3h5LCBwcm94eUJ5cGFzcykge1xuICAgICAgICB0aGlzLl9vcHRpb25zLnByb3h5ICAgICAgID0gcHJveHk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMucHJveHlCeXBhc3MgPSBwcm94eUJ5cGFzcztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzY3JlZW5zaG90cyAoLi4ub3B0aW9ucykge1xuICAgICAgICBsZXQgZnVsbFBhZ2U7XG4gICAgICAgIGxldCB0aHVtYm5haWxzO1xuICAgICAgICBsZXQgW3BhdGgsIHRha2VPbkZhaWxzLCBwYXRoUGF0dGVybl0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBvcHRpb25zWzBdICYmIHR5cGVvZiBvcHRpb25zWzBdID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICh7IHBhdGgsIHRha2VPbkZhaWxzLCBwYXRoUGF0dGVybiwgZnVsbFBhZ2UsIHRodW1ibmFpbHMgfSA9IG9wdGlvbnNbMF0pO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMuc2NyZWVuc2hvdHMgPSB7IHBhdGgsIHRha2VPbkZhaWxzLCBwYXRoUGF0dGVybiwgZnVsbFBhZ2UsIHRodW1ibmFpbHMgfTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2aWRlbyAocGF0aCwgb3B0aW9ucywgZW5jb2RpbmdPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnZpZGVvUGF0aF0gICAgICAgICAgICA9IHBhdGg7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnZpZGVvT3B0aW9uc10gICAgICAgICA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnZpZGVvRW5jb2RpbmdPcHRpb25zXSA9IGVuY29kaW5nT3B0aW9ucztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGFydEFwcCAoY29tbWFuZCwgaW5pdERlbGF5KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLmFwcENvbW1hbmRdICAgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLl9vcHRpb25zW09QVElPTl9OQU1FUy5hcHBJbml0RGVsYXldID0gaW5pdERlbGF5O1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRzQ29uZmlnUGF0aCAocGF0aCkge1xuICAgICAgICB0aGlzLl9vcHRpb25zW09QVElPTl9OQU1FUy50c0NvbmZpZ1BhdGhdID0gcGF0aDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjbGllbnRTY3JpcHRzICguLi5zY3JpcHRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZC5jbGllbnRTY3JpcHRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5tdWx0aXBsZUFQSU1ldGhvZENhbGxGb3JiaWRkZW4sIE9QVElPTl9OQU1FUy5jbGllbnRTY3JpcHRzKTtcblxuICAgICAgICB0aGlzLl9vcHRpb25zW09QVElPTl9OQU1FUy5jbGllbnRTY3JpcHRzXSA9IHRoaXMuX3ByZXBhcmVBcnJheVBhcmFtZXRlcihzY3JpcHRzKTtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQuY2xpZW50U2NyaXB0cyAgICAgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbXBpbGVyT3B0aW9ucyAob3B0cykge1xuICAgICAgICB0aGlzLl9vcHRpb25zW09QVElPTl9OQU1FUy5jb21waWxlck9wdGlvbnNdID0gb3B0cztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBydW4gKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9yZXNldEJlZm9yZVJ1bigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlQW5kUnVuVGFzayhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdG9wICgpIHtcbiAgICAgICAgLy8gTk9URTogV2hlbiB0YXNrUHJvbWlzZSBpcyBjYW5jZWxsZWQsIGl0IGlzIHJlbW92ZWQgZnJvbVxuICAgICAgICAvLyB0aGUgcGVuZGluZ1Rhc2tQcm9taXNlcyBhcnJheSwgd2hpY2ggbGVhZHMgdG8gc2hpZnRpbmcgaW5kZXhlc1xuICAgICAgICAvLyB0b3dhcmRzIHRoZSBiZWdpbm5pbmcuIFNvLCB3ZSBtdXN0IGNvcHkgdGhlIGFycmF5IGluIG9yZGVyIHRvIGl0ZXJhdGUgaXQsXG4gICAgICAgIC8vIG9yIHdlIGNhbiBwZXJmb3JtIGl0ZXJhdGlvbiBmcm9tIHRoZSBlbmQgdG8gdGhlIGJlZ2lubmluZy5cbiAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uUHJvbWlzZXMgPSB0aGlzLnBlbmRpbmdUYXNrUHJvbWlzZXMucmVkdWNlUmlnaHQoKHJlc3VsdCwgdGFza1Byb21pc2UpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRhc2tQcm9taXNlLmNhbmNlbCgpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNhbmNlbGxhdGlvblByb21pc2VzKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const FILE_PROTOCOL = 'file
|
|
3
|
+
const FILE_PROTOCOL = 'file://';
|
|
4
4
|
function isFileProtocol(url = '') {
|
|
5
5
|
return url.indexOf(FILE_PROTOCOL) === 0;
|
|
6
6
|
}
|
|
7
7
|
exports.default = isFileProtocol;
|
|
8
8
|
module.exports = exports.default;
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtZmlsZS1wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvaXMtZmlsZS1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUVoQyxTQUFTLGNBQWMsQ0FBRSxHQUFHLEdBQUcsRUFBRTtJQUM3QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxrQkFBZSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBGSUxFX1BST1RPQ09MID0gJ2ZpbGU6Ly8nO1xuXG5mdW5jdGlvbiBpc0ZpbGVQcm90b2NvbCAodXJsID0gJycpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoRklMRV9QUk9UT0NPTCkgPT09IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRmlsZVByb3RvY29sO1xuIl19
|