oxygen-cli 1.40.2 → 1.42.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 +13 -0
- package/build/core/OxygenCore.js +41 -274
- package/build/core/OxygenEvents.js +2 -12
- package/build/core/OxygenModule.js +1 -16
- package/build/core/OxygenService.js +1 -12
- package/build/core/OxygenSubModule.js +1 -10
- package/build/core/WebDriverModule.js +2 -32
- package/build/core/utils.js +2 -21
- package/build/errors/HookError.js +2 -8
- package/build/errors/ModuleError.js +2 -8
- package/build/errors/ModuleUnavailableError.js +1 -3
- package/build/errors/OxygenError.js +3 -36
- package/build/errors/ScriptNotFound.js +2 -8
- package/build/errors/helper.js +51 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +39 -105
- package/build/lib/cli.js +3 -30
- package/build/lib/debugger.js +2 -145
- package/build/lib/img-merge.js +2 -16
- package/build/lib/launcher.js +3 -31
- package/build/lib/moduleRequire.js +1 -4
- package/build/lib/parallel-launcher.js +44 -84
- package/build/lib/param-manager.js +2 -29
- package/build/lib/param-reader-csv.js +1 -15
- package/build/lib/param-reader-excel.js +1 -14
- package/build/lib/param-reader-json.js +1 -10
- package/build/lib/text-to-image.js +5 -26
- package/build/lib/util.js +4 -75
- package/build/model/case-result.js +1 -2
- package/build/model/failure.js +1 -2
- package/build/model/status.js +1 -2
- package/build/model/step-result.js +1 -2
- package/build/model/suite-result.js +1 -2
- package/build/model/test-result.js +1 -2
- package/build/model/testcase.js +1 -2
- package/build/model/testsuite.js +1 -2
- package/build/ox_modules/index.js +21 -34
- package/build/ox_modules/module-assert.js +9 -28
- package/build/ox_modules/module-date.js +3 -8
- package/build/ox_modules/module-db.js +8 -29
- package/build/ox_modules/module-email.js +14 -45
- package/build/ox_modules/module-eyes.js +6 -47
- package/build/ox_modules/module-http/ntlm-util.js +3 -7
- package/build/ox_modules/module-http/ntlm.js +9 -78
- package/build/ox_modules/module-http.js +69 -172
- package/build/ox_modules/module-log.js +10 -23
- package/build/ox_modules/module-mailinator.js +11 -33
- package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-mob/commands/assertText.js +1 -4
- package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
- package/build/ox_modules/module-mob/commands/back.js +1 -3
- package/build/ox_modules/module-mob/commands/clear.js +1 -5
- package/build/ox_modules/module-mob/commands/click.js +3 -5
- package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
- package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/debug.js +2 -3
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
- package/build/ox_modules/module-mob/commands/execute.js +1 -3
- package/build/ox_modules/module-mob/commands/findElement.js +1 -4
- package/build/ox_modules/module-mob/commands/findElements.js +1 -5
- package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
- package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
- package/build/ox_modules/module-mob/commands/getSource.js +1 -3
- package/build/ox_modules/module-mob/commands/getText.js +1 -5
- package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
- package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
- package/build/ox_modules/module-mob/commands/getValue.js +5 -10
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
- package/build/ox_modules/module-mob/commands/index.js +1 -148
- package/build/ox_modules/module-mob/commands/installApp.js +1 -3
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
- package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
- package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
- package/build/ox_modules/module-mob/commands/isExist.js +1 -4
- package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
- package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
- package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
- package/build/ox_modules/module-mob/commands/open.js +1 -4
- package/build/ox_modules/module-mob/commands/pause.js +1 -3
- package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
- package/build/ox_modules/module-mob/commands/select.js +1 -5
- package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
- package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
- package/build/ox_modules/module-mob/commands/setContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
- package/build/ox_modules/module-mob/commands/shake.js +1 -3
- package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
- package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
- package/build/ox_modules/module-mob/commands/swipe.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-mob/commands/tap.js +1 -3
- package/build/ox_modules/module-mob/commands/type.js +3 -8
- package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
- package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
- package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-mob.js +74 -216
- package/build/ox_modules/module-mongo.js +265 -0
- package/build/ox_modules/module-pdf.js +24 -65
- package/build/ox_modules/module-proxy.js +9 -69
- package/build/ox_modules/module-serial.js +8 -33
- package/build/ox_modules/module-shell.js +10 -30
- package/build/ox_modules/module-soap.js +17 -52
- package/build/ox_modules/module-twilio.js +11 -54
- package/build/ox_modules/module-utils.js +22 -58
- package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-web/commands/assertExist.js +1 -3
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/assertText.js +1 -4
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-web/commands/assertValue.js +1 -4
- package/build/ox_modules/module-web/commands/back.js +1 -3
- package/build/ox_modules/module-web/commands/clear.js +1 -6
- package/build/ox_modules/module-web/commands/click.js +4 -15
- package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
- package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/debug.js +2 -3
- package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
- package/build/ox_modules/module-web/commands/deselect.js +1 -3
- package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
- package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-web/commands/execute.js +1 -3
- package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
- package/build/ox_modules/module-web/commands/findElement.js +1 -4
- package/build/ox_modules/module-web/commands/findElements.js +1 -5
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
- package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
- package/build/ox_modules/module-web/commands/getCookies.js +1 -3
- package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
- package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
- package/build/ox_modules/module-web/commands/getHTML.js +1 -3
- package/build/ox_modules/module-web/commands/getSource.js +1 -3
- package/build/ox_modules/module-web/commands/getText.js +1 -5
- package/build/ox_modules/module-web/commands/getTitle.js +1 -3
- package/build/ox_modules/module-web/commands/getUrl.js +1 -3
- package/build/ox_modules/module-web/commands/getValue.js +1 -6
- package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
- package/build/ox_modules/module-web/commands/index.js +1 -184
- package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
- package/build/ox_modules/module-web/commands/isChecked.js +1 -3
- package/build/ox_modules/module-web/commands/isExist.js +1 -4
- package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/isSelected.js +1 -3
- package/build/ox_modules/module-web/commands/isVisible.js +1 -4
- package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
- package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/mock.js +1 -3
- package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
- package/build/ox_modules/module-web/commands/newWindow.js +1 -3
- package/build/ox_modules/module-web/commands/open.js +1 -5
- package/build/ox_modules/module-web/commands/pause.js +1 -3
- package/build/ox_modules/module-web/commands/point.js +1 -3
- package/build/ox_modules/module-web/commands/pointJS.js +2 -9
- package/build/ox_modules/module-web/commands/refresh.js +1 -3
- package/build/ox_modules/module-web/commands/rightClick.js +3 -9
- package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
- package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
- package/build/ox_modules/module-web/commands/select.js +1 -6
- package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
- package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
- package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
- package/build/ox_modules/module-web/commands/type.js +1 -6
- package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
- package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/verifyText.js +1 -4
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
- package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
- package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
- package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
- package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
- package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
- package/build/ox_modules/module-web.js +112 -232
- package/build/ox_modules/module-win/commands/assertText.js +1 -4
- package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-win/commands/assertValue.js +9 -17
- package/build/ox_modules/module-win/commands/back.js +1 -3
- package/build/ox_modules/module-win/commands/clear.js +1 -5
- package/build/ox_modules/module-win/commands/click.js +1 -3
- package/build/ox_modules/module-win/commands/clickLong.js +1 -3
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-win/commands/findElement.js +1 -4
- package/build/ox_modules/module-win/commands/findElements.js +1 -5
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
- package/build/ox_modules/module-win/commands/getLocation.js +1 -3
- package/build/ox_modules/module-win/commands/getSource.js +1 -3
- package/build/ox_modules/module-win/commands/getText.js +1 -5
- package/build/ox_modules/module-win/commands/getValue.js +5 -10
- package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-win/commands/index.js +1 -74
- package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-win/commands/isChecked.js +1 -3
- package/build/ox_modules/module-win/commands/isClickable.js +1 -3
- package/build/ox_modules/module-win/commands/isExist.js +1 -4
- package/build/ox_modules/module-win/commands/isSelected.js +1 -3
- package/build/ox_modules/module-win/commands/isVisible.js +1 -4
- package/build/ox_modules/module-win/commands/open.js +1 -3
- package/build/ox_modules/module-win/commands/pause.js +1 -3
- package/build/ox_modules/module-win/commands/rightClick.js +1 -3
- package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
- package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
- package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-win/commands/tap.js +1 -3
- package/build/ox_modules/module-win/commands/type.js +1 -5
- package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
- package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-win.js +54 -95
- package/build/ox_modules/utils.js +91 -79
- package/build/ox_reporters/reporter-excel.js +2 -59
- package/build/ox_reporters/reporter-html.js +2 -29
- package/build/ox_reporters/reporter-json.js +2 -15
- package/build/ox_reporters/reporter-junit.js +2 -25
- package/build/ox_reporters/reporter-pdf.js +2 -20
- package/build/ox_reporters/reporter-rp.js +2 -91
- package/build/ox_reporters/reporter-xml.js +2 -18
- package/build/ox_services/service-devtools/submodule-network.js +4 -86
- package/build/ox_services/service-devtools.js +2 -24
- package/build/reporter/FileReporterBase.js +6 -45
- package/build/reporter/ReportAggregator.js +14 -120
- package/build/reporter/ReporterBase.js +1 -6
- package/build/reporter/WebSocketReporter.js +1 -39
- package/build/runners/WorkerProcess.js +2 -107
- package/build/runners/cucumber/CucumberEventListener.js +4 -29
- package/build/runners/cucumber/CucumberReporter.js +2 -57
- package/build/runners/cucumber/CucumberWorker.js +3 -69
- package/build/runners/cucumber/index.js +2 -31
- package/build/runners/cucumber/worker.js +2 -19
- package/build/runners/index.js +4 -11
- package/build/runners/oxygen/OxygenWorker.js +3 -61
- package/build/runners/oxygen/index.js +18 -179
- package/build/runners/oxygen/worker.js +3 -27
- package/package.json +5 -1
package/build/lib/cli-util.js
CHANGED
|
@@ -3,60 +3,45 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = exports.DEFAULT_REPORTER = void 0;
|
|
6
7
|
exports.generateTestOptions = generateTestOptions;
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
8
|
+
exports.getCommandLineOptions = getCommandLineOptions;
|
|
9
|
+
exports.getConfigurations = getConfigurations;
|
|
10
|
+
exports.getEnvironments = getEnvironments;
|
|
9
11
|
exports.getPageObjectFilePath = getPageObjectFilePath;
|
|
10
12
|
exports.loadEnvironmentVariables = loadEnvironmentVariables;
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
exports.getCommandLineOptions = getCommandLineOptions;
|
|
13
|
+
exports.loadSuiteDefinitionsFromFolder = loadSuiteDefinitionsFromFolder;
|
|
14
|
+
exports.loadSuites = loadSuites;
|
|
14
15
|
exports.processTargetPath = processTargetPath;
|
|
15
|
-
exports.DEFAULT_REPORTER = exports.OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = void 0;
|
|
16
|
-
|
|
17
16
|
require("source-map-support/register");
|
|
18
|
-
|
|
19
17
|
var _path = _interopRequireDefault(require("path"));
|
|
20
|
-
|
|
21
18
|
var _fs = _interopRequireDefault(require("fs"));
|
|
22
|
-
|
|
23
19
|
var _util = _interopRequireDefault(require("./util"));
|
|
24
|
-
|
|
25
20
|
var _async = require("async");
|
|
26
|
-
|
|
27
21
|
var _moduleRequire = _interopRequireDefault(require("./moduleRequire"));
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
exports.
|
|
33
|
-
const OXYGEN_ENV_FILE_NAME = 'oxygen.env';
|
|
34
|
-
exports.OXYGEN_ENV_FILE_NAME = OXYGEN_ENV_FILE_NAME;
|
|
35
|
-
const OXYGEN_PAGE_OBJECT_FILE_NAME = 'oxygen.po';
|
|
36
|
-
exports.OXYGEN_PAGE_OBJECT_FILE_NAME = OXYGEN_PAGE_OBJECT_FILE_NAME;
|
|
37
|
-
const DEFAULT_REPORTER = 'html';
|
|
38
|
-
exports.DEFAULT_REPORTER = DEFAULT_REPORTER;
|
|
39
|
-
|
|
22
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
|
+
const OXYGEN_CONFIG_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = 'oxygen.conf';
|
|
24
|
+
const OXYGEN_ENV_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = 'oxygen.env';
|
|
25
|
+
const OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_PAGE_OBJECT_FILE_NAME = 'oxygen.po';
|
|
26
|
+
const DEFAULT_REPORTER = exports.DEFAULT_REPORTER = 'html';
|
|
40
27
|
async function generateTestOptions(config, argv) {
|
|
41
|
-
const options = {
|
|
28
|
+
const options = {
|
|
29
|
+
...config
|
|
42
30
|
};
|
|
43
31
|
options.env = loadEnvironmentVariables(config, argv);
|
|
44
32
|
options.po = getPageObjectFilePath(config, argv);
|
|
45
33
|
options.suites = await loadSuites(config, argv);
|
|
46
34
|
return options;
|
|
47
35
|
}
|
|
48
|
-
|
|
49
36
|
async function loadSuites(config, argv) {
|
|
50
37
|
if (config.framework && typeof config.framework === 'string' && config.framework.toLowerCase() !== 'oxygen') {
|
|
51
38
|
return;
|
|
52
39
|
}
|
|
53
|
-
|
|
54
40
|
const {
|
|
55
41
|
target
|
|
56
42
|
} = config;
|
|
57
43
|
const isConfigFile = target && (target.name && target.name.indexOf(OXYGEN_CONFIG_FILE_NAME) === 0 || target.extension === '' && target.configPath && target.configPath.indexOf(OXYGEN_CONFIG_FILE_NAME) > -1);
|
|
58
44
|
let suites = [];
|
|
59
|
-
|
|
60
45
|
if (!isConfigFile) {
|
|
61
46
|
if (target && target.extension === '.js') {
|
|
62
47
|
suites.push(await _util.default.generateTestSuiteFromJSFile(target.path, config.parameters.file, config.parameters.mode, false, config.iterations || 1));
|
|
@@ -64,52 +49,39 @@ async function loadSuites(config, argv) {
|
|
|
64
49
|
suites.push(await _util.default.generateTestSuiteFromJsonFile(target.path, config.parameters.file, config.parameters.mode, config));
|
|
65
50
|
}
|
|
66
51
|
} else {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
suiteDefs = config.suites;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const suitesFolder = _path.default.join(target.cwd, 'suites');
|
|
74
|
-
|
|
75
|
-
if (_fs.default.existsSync(suitesFolder)) {
|
|
76
|
-
suiteDefs = [...suiteDefs, ...loadSuiteDefinitionsFromFolder(suitesFolder)];
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
suites = await Promise.all(suiteDefs.map(async suiteDef => await _util.default.generateTestSuiteFromJson(suiteDef, config)));
|
|
52
|
+
let suiteDefs = [];
|
|
53
|
+
if (config.suites && Array.isArray(config.suites)) {
|
|
54
|
+
suiteDefs = config.suites;
|
|
80
55
|
}
|
|
81
|
-
|
|
56
|
+
const suitesFolder = _path.default.join(target.cwd, 'suites');
|
|
57
|
+
if (_fs.default.existsSync(suitesFolder)) {
|
|
58
|
+
suiteDefs = [...suiteDefs, ...loadSuiteDefinitionsFromFolder(suitesFolder)];
|
|
59
|
+
}
|
|
60
|
+
suites = await Promise.all(suiteDefs.map(async suiteDef => await _util.default.generateTestSuiteFromJson(suiteDef, config)));
|
|
61
|
+
}
|
|
82
62
|
if (argv.suites && typeof argv.suites === 'string') {
|
|
83
63
|
const selectedSuiteNames = argv.suites.split(',');
|
|
84
64
|
suites = suites.filter(x => selectedSuiteNames.includes(x.name));
|
|
85
65
|
}
|
|
86
|
-
|
|
87
66
|
return suites;
|
|
88
67
|
}
|
|
89
|
-
|
|
90
68
|
function loadSuiteDefinitionsFromFolder(folderPath) {
|
|
91
69
|
const files = _fs.default.readdirSync(folderPath);
|
|
92
|
-
|
|
93
70
|
let suiteDefs = [];
|
|
94
71
|
(0, _async.forEach)(files, file => {
|
|
95
72
|
if (_path.default.extname(file) === '.json') {
|
|
96
73
|
const fullPath = _path.default.join(folderPath, file);
|
|
97
|
-
|
|
98
74
|
suiteDefs.push((0, _moduleRequire.default)(fullPath));
|
|
99
75
|
}
|
|
100
76
|
});
|
|
101
77
|
return suiteDefs;
|
|
102
78
|
}
|
|
103
|
-
|
|
104
79
|
function getPageObjectFilePath(config, argv = {}) {
|
|
105
80
|
const target = config.target || {};
|
|
106
81
|
const poFileName = argv.po || `${OXYGEN_PAGE_OBJECT_FILE_NAME}.js`;
|
|
107
82
|
const cwd = target.cwd || process.cwd();
|
|
108
|
-
|
|
109
83
|
let poFilePath = _path.default.resolve(cwd, poFileName);
|
|
110
|
-
|
|
111
84
|
poFilePath = _fs.default.existsSync(poFilePath) ? poFilePath : null;
|
|
112
|
-
|
|
113
85
|
if (poFilePath) {
|
|
114
86
|
try {
|
|
115
87
|
(0, _moduleRequire.default)(poFilePath);
|
|
@@ -122,46 +94,33 @@ function getPageObjectFilePath(config, argv = {}) {
|
|
|
122
94
|
return null;
|
|
123
95
|
}
|
|
124
96
|
}
|
|
125
|
-
|
|
126
97
|
function loadEnvironmentVariables(config, argv) {
|
|
127
98
|
const target = config.target || {};
|
|
128
99
|
const envName = argv.env || config.environment || 'default';
|
|
129
100
|
const cwd = target.cwd || process.cwd();
|
|
130
|
-
|
|
131
101
|
const defaultEnvFile = _path.default.join(cwd, `${OXYGEN_ENV_FILE_NAME}.js`);
|
|
132
|
-
|
|
133
102
|
if (_fs.default.existsSync(defaultEnvFile)) {
|
|
134
103
|
const env = (0, _moduleRequire.default)(defaultEnvFile);
|
|
135
|
-
|
|
136
104
|
if (env && typeof env === 'object' && Object.prototype.hasOwnProperty.call(env, envName)) {
|
|
137
105
|
return env[envName];
|
|
138
106
|
}
|
|
139
107
|
}
|
|
140
|
-
|
|
141
108
|
const dedicatedEnvFileJs = _path.default.join(cwd, 'env', `${envName}.js`);
|
|
142
|
-
|
|
143
109
|
const dedicatedEnvFileJson = _path.default.join(cwd, 'env', `${envName}.json`);
|
|
144
|
-
|
|
145
110
|
if (_fs.default.existsSync(dedicatedEnvFileJs)) {
|
|
146
111
|
return (0, _moduleRequire.default)(dedicatedEnvFileJs);
|
|
147
112
|
} else if (_fs.default.existsSync(dedicatedEnvFileJson)) {
|
|
148
113
|
return (0, _moduleRequire.default)(dedicatedEnvFileJson);
|
|
149
114
|
}
|
|
150
|
-
|
|
151
115
|
return {};
|
|
152
116
|
}
|
|
153
|
-
|
|
154
117
|
function getEnvironments(target) {
|
|
155
118
|
let targetCwd = null;
|
|
156
|
-
|
|
157
119
|
if (target && target.cwd) {
|
|
158
120
|
targetCwd = target.cwd;
|
|
159
121
|
}
|
|
160
|
-
|
|
161
122
|
const cwd = targetCwd || process.cwd();
|
|
162
|
-
|
|
163
123
|
const defaultEnvFile = _path.default.join(cwd, `${OXYGEN_ENV_FILE_NAME}.js`);
|
|
164
|
-
|
|
165
124
|
if (_fs.default.existsSync(defaultEnvFile)) {
|
|
166
125
|
try {
|
|
167
126
|
return (0, _moduleRequire.default)(defaultEnvFile);
|
|
@@ -170,17 +129,13 @@ function getEnvironments(target) {
|
|
|
170
129
|
throw err;
|
|
171
130
|
}
|
|
172
131
|
}
|
|
173
|
-
|
|
174
132
|
return {};
|
|
175
133
|
}
|
|
176
|
-
|
|
177
134
|
function getConfigurations(target, argv) {
|
|
178
135
|
let targetCwd = null;
|
|
179
|
-
|
|
180
136
|
if (target && target.cwd) {
|
|
181
137
|
targetCwd = target.cwd;
|
|
182
138
|
}
|
|
183
|
-
|
|
184
139
|
const DEFAULT_OPTS = {
|
|
185
140
|
cwd: target ? targetCwd || process.cwd() : process.cwd(),
|
|
186
141
|
target: target,
|
|
@@ -205,7 +160,6 @@ function getConfigurations(target, argv) {
|
|
|
205
160
|
};
|
|
206
161
|
const cmdOpts = getCommandLineOptions(argv);
|
|
207
162
|
let projConfigOpts = {};
|
|
208
|
-
|
|
209
163
|
if (target && target.name === OXYGEN_CONFIG_FILE_NAME && (target.extension === '.js' || target.extension === '.json')) {
|
|
210
164
|
try {
|
|
211
165
|
projConfigOpts = (0, _moduleRequire.default)(target.path);
|
|
@@ -221,43 +175,37 @@ function getConfigurations(target, argv) {
|
|
|
221
175
|
throw err;
|
|
222
176
|
}
|
|
223
177
|
}
|
|
224
|
-
|
|
225
178
|
const envs = getEnvironments(target);
|
|
226
|
-
|
|
227
179
|
if (projConfigOpts.envs) {
|
|
228
|
-
projConfigOpts.envs = {
|
|
180
|
+
projConfigOpts.envs = {
|
|
181
|
+
...projConfigOpts.envs,
|
|
229
182
|
...envs
|
|
230
183
|
};
|
|
231
184
|
} else {
|
|
232
|
-
projConfigOpts = {
|
|
185
|
+
projConfigOpts = {
|
|
186
|
+
...projConfigOpts,
|
|
233
187
|
envs: envs
|
|
234
188
|
};
|
|
235
189
|
}
|
|
236
|
-
|
|
237
190
|
const isCmdOptsReportFormat = cmdOpts.reporting && cmdOpts.reporting.reporters;
|
|
238
191
|
const isConfigReportFormat = projConfigOpts.reporting && projConfigOpts.reporting.reporters;
|
|
239
|
-
|
|
240
192
|
if (!isCmdOptsReportFormat && !isConfigReportFormat) {
|
|
241
193
|
if (!projConfigOpts.reporting) {
|
|
242
194
|
projConfigOpts.reporting = {};
|
|
243
195
|
}
|
|
244
|
-
|
|
245
196
|
projConfigOpts.reporting.reporters = [DEFAULT_REPORTER];
|
|
246
197
|
}
|
|
247
|
-
|
|
248
198
|
let name = cmdOpts.name || projConfigOpts.name || null;
|
|
249
|
-
|
|
250
199
|
if (!name && target) {
|
|
251
200
|
name = target.name !== OXYGEN_CONFIG_FILE_NAME ? target.name : target.baseName;
|
|
252
201
|
}
|
|
253
|
-
|
|
254
|
-
|
|
202
|
+
return {
|
|
203
|
+
...DEFAULT_OPTS,
|
|
255
204
|
...projConfigOpts,
|
|
256
205
|
...cmdOpts,
|
|
257
206
|
name: name
|
|
258
207
|
};
|
|
259
208
|
}
|
|
260
|
-
|
|
261
209
|
function getCommandLineOptions(argv) {
|
|
262
210
|
const opts = {
|
|
263
211
|
name: argv.name || null,
|
|
@@ -268,46 +216,40 @@ function getCommandLineOptions(argv) {
|
|
|
268
216
|
iterations: argv.i ? parseInt(argv.i) : argv.iter ? parseInt(argv.iter) : null,
|
|
269
217
|
debugPort: argv.dbgport || null,
|
|
270
218
|
wsPort: argv.wsport || null,
|
|
271
|
-
delay: argv.d || argv.delay || null
|
|
219
|
+
delay: argv.d || argv.delay || null,
|
|
220
|
+
autoStartWebDriver: argv.autowd && argv.autowd === 'true' || false
|
|
272
221
|
};
|
|
273
|
-
|
|
274
222
|
if (argv.rf && typeof argv.rf === 'string' && argv.rf.length > 0) {
|
|
275
223
|
const reportFormats = argv.rf.split(',');
|
|
276
224
|
opts.reporting = {
|
|
277
225
|
reporters: reportFormats
|
|
278
226
|
};
|
|
279
|
-
|
|
280
227
|
if (argv.ro && typeof argv.ro === 'string' && argv.ro.length > 0) {
|
|
281
228
|
opts.reporting.outputDir = argv.ro;
|
|
282
229
|
}
|
|
283
230
|
}
|
|
284
|
-
|
|
285
231
|
if (argv.p || argv.param) {
|
|
286
232
|
opts.parameters = {
|
|
287
233
|
file: argv.p || argv.param || null,
|
|
288
234
|
mode: argv.pm || 'seq'
|
|
289
235
|
};
|
|
290
236
|
}
|
|
291
|
-
|
|
292
237
|
if (argv.specs && typeof argv.specs === 'string' && argv.specs.length > 0) {
|
|
293
238
|
const specs = argv.specs.split(',');
|
|
294
239
|
opts.specs = specs;
|
|
295
240
|
}
|
|
296
|
-
|
|
297
241
|
if (argv.modules && typeof argv.modules === 'string' && argv.modules.length > 0) {
|
|
298
242
|
const modules = argv.modules.split(',');
|
|
299
243
|
opts.modules = modules;
|
|
300
244
|
}
|
|
301
|
-
|
|
302
245
|
return deleteNullProperties(opts);
|
|
303
246
|
}
|
|
304
|
-
|
|
305
247
|
function deleteNullProperties(obj) {
|
|
306
248
|
if (typeof obj !== 'object') {
|
|
307
249
|
return obj;
|
|
308
250
|
}
|
|
309
|
-
|
|
310
|
-
|
|
251
|
+
const clone = {
|
|
252
|
+
...obj
|
|
311
253
|
};
|
|
312
254
|
const keys = Object.keys(obj);
|
|
313
255
|
(0, _async.forEach)(keys, key => {
|
|
@@ -317,52 +259,44 @@ function deleteNullProperties(obj) {
|
|
|
317
259
|
});
|
|
318
260
|
return clone;
|
|
319
261
|
}
|
|
320
|
-
|
|
321
262
|
function processTargetPath(targetPath, userCwd) {
|
|
322
263
|
let cwd = userCwd || process.cwd();
|
|
323
|
-
|
|
324
264
|
if (typeof targetPath === 'undefined') {
|
|
325
265
|
targetPath = cwd;
|
|
326
266
|
} else {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
267
|
+
targetPath = _util.default.resolvePath(targetPath, cwd);
|
|
268
|
+
}
|
|
330
269
|
if (!_fs.default.existsSync(targetPath)) {
|
|
331
270
|
return null;
|
|
332
271
|
}
|
|
333
|
-
|
|
334
272
|
const stats = _fs.default.lstatSync(targetPath);
|
|
335
|
-
|
|
336
273
|
const isDirector = stats.isDirectory();
|
|
337
274
|
let configFilePath;
|
|
338
|
-
|
|
339
275
|
if (isDirector) {
|
|
340
276
|
cwd = userCwd || targetPath;
|
|
341
277
|
configFilePath = _path.default.join(targetPath, OXYGEN_CONFIG_FILE_NAME + '.js');
|
|
342
|
-
|
|
343
278
|
if (!_fs.default.existsSync(configFilePath)) {
|
|
344
279
|
configFilePath = _path.default.join(targetPath, OXYGEN_CONFIG_FILE_NAME + '.json');
|
|
345
|
-
|
|
346
280
|
if (!_fs.default.existsSync(configFilePath)) {
|
|
347
281
|
return null;
|
|
348
282
|
}
|
|
349
283
|
}
|
|
284
|
+
} else if (targetPath.endsWith(OXYGEN_CONFIG_FILE_NAME + '.js') || targetPath.endsWith(OXYGEN_CONFIG_FILE_NAME + '.json')) {
|
|
285
|
+
configFilePath = targetPath;
|
|
286
|
+
cwd = targetPath = _path.default.dirname(targetPath);
|
|
350
287
|
} else {
|
|
288
|
+
cwd = userCwd || _path.default.dirname(targetPath);
|
|
351
289
|
configFilePath = _path.default.join(cwd, OXYGEN_CONFIG_FILE_NAME + '.js');
|
|
352
|
-
|
|
353
290
|
if (!_fs.default.existsSync(configFilePath)) {
|
|
354
291
|
configFilePath = _path.default.join(cwd, OXYGEN_CONFIG_FILE_NAME + '.json');
|
|
355
|
-
|
|
356
292
|
if (!_fs.default.existsSync(configFilePath)) {
|
|
357
293
|
configFilePath = undefined;
|
|
358
294
|
}
|
|
359
295
|
}
|
|
360
296
|
}
|
|
361
|
-
|
|
362
297
|
if (!targetPath) {
|
|
363
298
|
return null;
|
|
364
299
|
}
|
|
365
|
-
|
|
366
300
|
return {
|
|
367
301
|
path: targetPath,
|
|
368
302
|
configPath: configFilePath,
|
|
@@ -373,4 +307,4 @@ function processTargetPath(targetPath, userCwd) {
|
|
|
373
307
|
extension: _path.default.extname(targetPath)
|
|
374
308
|
};
|
|
375
309
|
}
|
|
376
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwibmFtZXMiOlsiT1hZR0VOX0NPTkZJR19GSUxFX05BTUUiLCJPWFlHRU5fRU5WX0ZJTEVfTkFNRSIsIk9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUiLCJERUZBVUxUX1JFUE9SVEVSIiwiZ2VuZXJhdGVUZXN0T3B0aW9ucyIsImNvbmZpZyIsImFyZ3YiLCJvcHRpb25zIiwiZW52IiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzIiwicG8iLCJnZXRQYWdlT2JqZWN0RmlsZVBhdGgiLCJzdWl0ZXMiLCJsb2FkU3VpdGVzIiwiZnJhbWV3b3JrIiwidG9Mb3dlckNhc2UiLCJ0YXJnZXQiLCJpc0NvbmZpZ0ZpbGUiLCJuYW1lIiwiaW5kZXhPZiIsImV4dGVuc2lvbiIsImNvbmZpZ1BhdGgiLCJwdXNoIiwib3h1dGlsIiwiZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSlNGaWxlIiwicGF0aCIsInBhcmFtZXRlcnMiLCJmaWxlIiwibW9kZSIsIml0ZXJhdGlvbnMiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uRmlsZSIsInN1aXRlRGVmcyIsIkFycmF5IiwiaXNBcnJheSIsInN1aXRlc0ZvbGRlciIsImpvaW4iLCJjd2QiLCJmcyIsImV4aXN0c1N5bmMiLCJsb2FkU3VpdGVEZWZpbml0aW9uc0Zyb21Gb2xkZXIiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwic3VpdGVEZWYiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uIiwic2VsZWN0ZWRTdWl0ZU5hbWVzIiwic3BsaXQiLCJmaWx0ZXIiLCJ4IiwiaW5jbHVkZXMiLCJmb2xkZXJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImV4dG5hbWUiLCJmdWxsUGF0aCIsInBvRmlsZU5hbWUiLCJwcm9jZXNzIiwicG9GaWxlUGF0aCIsInJlc29sdmUiLCJlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZGlybmFtZSIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsImZ1bGxOYW1lIiwiYmFzZW5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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LENBQUNxQyxZQUFHQyxVQUFILENBQWMrRixjQUFkLENBQUwsRUFBb0M7QUFDaENBLE1BQUFBLGNBQWMsR0FBRzVHLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFlcEMsdUJBQXVCLEdBQUcsT0FBekMsQ0FBakI7O0FBQ0EsVUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDQSxRQUFBQSxjQUFjLEdBQUdULFNBQWpCO0FBQ0g7QUFDSjtBQUNKOztBQUNELE1BQUksQ0FBQ0UsVUFBTCxFQUFpQjtBQUNiLFdBQU8sSUFBUDtBQUNIOztBQUNELFNBQU87QUFFSHJHLElBQUFBLElBQUksRUFBRXFHLFVBRkg7QUFHSHpHLElBQUFBLFVBQVUsRUFBRWdILGNBSFQ7QUFLSGpHLElBQUFBLEdBQUcsRUFBRUEsR0FBRyxJQUFJWCxjQUFLNkcsT0FBTCxDQUFhUixVQUFiLENBTFQ7QUFPSDVHLElBQUFBLElBQUksRUFBRUssY0FBT2dILHFCQUFQLENBQTZCVCxVQUE3QixDQVBIO0FBU0hVLElBQUFBLFFBQVEsRUFBRS9HLGNBQUtnSCxRQUFMLENBQWNYLFVBQWQsQ0FUUDtBQVdIL0IsSUFBQUEsUUFBUSxFQUFFdEUsY0FBS2dILFFBQUwsQ0FBY2hILGNBQUs2RyxPQUFMLENBQWFSLFVBQWIsQ0FBZCxDQVhQO0FBYUgxRyxJQUFBQSxTQUFTLEVBQUVLLGNBQUs0QixPQUFMLENBQWF5RSxVQUFiO0FBYlIsR0FBUDtBQWVIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcclxuaW1wb3J0IG1vZHVsZVJlcXVpcmUgZnJvbSAnLi9tb2R1bGVSZXF1aXJlJztcclxuXHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fRU5WX0ZJTEVfTkFNRSA9ICdveHlnZW4uZW52JztcclxuZXhwb3J0IGNvbnN0IE9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUgPSAnb3h5Z2VuLnBvJztcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0T3B0aW9ucyhjb25maWcsIGFyZ3YpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xyXG4gICAgb3B0aW9ucy5lbnYgPSBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMucG8gPSBnZXRQYWdlT2JqZWN0RmlsZVBhdGgoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3VpdGVzKGNvbmZpZywgYXJndikge1xyXG4gICAgaWYgKGNvbmZpZy5mcmFtZXdvcmsgJiYgdHlwZW9mIGNvbmZpZy5mcmFtZXdvcmsgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5mcmFtZXdvcmsudG9Mb3dlckNhc2UoKSAhPT0gJ294eWdlbicpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gY29uZmlnO1xyXG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcclxuICAgICAgICAodGFyZ2V0Lm5hbWUgJiYgdGFyZ2V0Lm5hbWUuaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPT09IDApXHJcbiAgICAgICAgfHwgKHRhcmdldC5leHRlbnNpb24gPT09ICcnICYmIHRhcmdldC5jb25maWdQYXRoICYmIHRhcmdldC5jb25maWdQYXRoLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID4gLTEpXHJcbiAgICApO1xyXG4gICAgbGV0IHN1aXRlcyA9IFtdO1xyXG4gICAgLy8gaWYgYW4gaW5kaXZpZHVhbCBzY3JpcHQgb3Igc3VpdGUgZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpTRmlsZSh0YXJnZXQucGF0aCwgY29uZmlnLnBhcmFtZXRlcnMuZmlsZSwgY29uZmlnLnBhcmFtZXRlcnMubW9kZSwgZmFsc2UsIGNvbmZpZy5pdGVyYXRpb25zIHx8IDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanNvbicpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBjb25maWcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3VpdGVEZWZzID0gW107XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zdWl0ZXMgJiYgQXJyYXkuaXNBcnJheShjb25maWcuc3VpdGVzKSkge1xyXG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBtb3JlIHN1aXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgJ3N1aXRlcycgZm9sZGVyXHJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzdWl0ZXNGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHN1aXRlRGVmcyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcclxuICAgICAgICAgICAgICAgIC4uLmxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihzdWl0ZXNGb2xkZXIpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1lcmdlIHN1aXRlcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGNvbmZpZyBmaWxlIGFuZCB0aG9zZSBmb3VuZCBpbiAnc3VpdGVzJyBmb2xkZXJcclxuICAgICAgICBzdWl0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdWl0ZURlZnMubWFwKGFzeW5jIChzdWl0ZURlZikgPT4gYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24oc3VpdGVEZWYsIGNvbmZpZykpKTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBvdXQgc3VpdGVzIGlmICctLXN1aXRlcycgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWRcclxuICAgIGlmIChhcmd2LnN1aXRlcyAmJiB0eXBlb2YgYXJndi5zdWl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBzdWl0ZXMgPSBzdWl0ZXMuZmlsdGVyKHggPT4gc2VsZWN0ZWRTdWl0ZU5hbWVzLmluY2x1ZGVzKHgubmFtZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1aXRlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGZvbGRlclBhdGgpO1xyXG4gICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xyXG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XHJcbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qc29uJykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcclxuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1aXRlRGVmcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCB7fTtcclxuICAgIGNvbnN0IHBvRmlsZU5hbWUgPSBhcmd2LnBvIHx8IGAke09YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUV9LmpzYDtcclxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGxldCBwb0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcG9GaWxlTmFtZSk7XHJcbiAgICBwb0ZpbGVQYXRoID0gZnMuZXhpc3RzU3luYyhwb0ZpbGVQYXRoKSA/IHBvRmlsZVBhdGggOiBudWxsO1xyXG5cclxuICAgIGlmIChwb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvRmlsZVBhdGg7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xyXG4gICAgY29uc3QgZW52TmFtZSA9IGFyZ3YuZW52IHx8IGNvbmZpZy5lbnZpcm9ubWVudCB8fCAnZGVmYXVsdCc7XHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXQuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRyeSB0byByZXNvbHZlIGEgZGVkaWNhdGVkIGVudmlyb25tZW50IGZpbGUgaW4gJ2Vudicgc3ViIGZvbGRlclxyXG4gICAgY29uc3QgZGVkaWNhdGVkRW52RmlsZUpzID0gcGF0aC5qb2luKGN3ZCwgJ2VudicsIGAke2Vudk5hbWV9LmpzYCk7XHJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWRpY2F0ZWRFbnZGaWxlSnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCkge1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW52RmlsZSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7ZGVmYXVsdEVudkZpbGV9LiBSZWFzb246ICR7ZS5tZXNzYWdlfSAke2Uuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcclxuICAgIC8vIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuICAgIGNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgICAgICBjd2Q6IHRhcmdldCA/ICh0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKSkgOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnY2hyb21lJyxcclxuICAgICAgICBzZWxlbml1bVVybCA6ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJyxcclxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXHJcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgcmVSdW5PbkZhaWxlZDogZmFsc2UsXHJcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXHJcbiAgICAgICAgZGVidWdQb3J0OiBudWxsLFxyXG4gICAgICAgIGRlbGF5OiBudWxsLFxyXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogZmFsc2UsXHJcbiAgICAgICAgY29sbGVjdEJyb3dzZXJMb2dzOiBmYWxzZSxcclxuICAgICAgICByZXBvcnRpbmc6IHtcclxuICAgICAgICAgICAgcmVwb3J0ZXJzOiBbREVGQVVMVF9SRVBPUlRFUl1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6ICdzZXEnXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyByZXRyaWV2ZSBvcHRpb25zIHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXHJcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xyXG4gICAgLy8gaWYgdGhlIHRhcmdldCBpcyBveHlnZW4gY29uZmlnIGZpbGUsIG1lcmdlIGl0cyBjb250ZW50IHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgbGV0IHByb2pDb25maWdPcHRzID0ge307XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IG1vZHVsZVJlcXVpcmUodGFyZ2V0LnBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmaWxlOiAke3RhcmdldC5wYXRofS4gUmVhc29uOiAke2UubWVzc2FnZX0gJHtlLnN0YWNrfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jb25maWdQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvakNvbmZpZ09wdHMgPSBtb2R1bGVSZXF1aXJlKHRhcmdldC5jb25maWdQYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGVudnMgPSBnZXRFbnZpcm9ubWVudHModGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xyXG4gICAgICAgIC8vIG1lcmdlIGV4dGVybmFsIGVudmlyb25tZW50cyBkZWZpbml0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGVcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5lbnZzID0geyAuLi5wcm9qQ29uZmlnT3B0cy5lbnZzLCAuLi5lbnZzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IHsgLi4ucHJvakNvbmZpZ09wdHMsIGVudnM6IGVudnMgfTtcclxuICAgIH1cclxuICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgZGVmYXVsdCBIVE1MIHJlcG9ydGVyIGlmIHJlcG9ydGluZyBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQgaW4gb3h5Z2VuLmNvbmYgZmlsZSBhbmQgdmlhIGNvbW1hbmQgbGluZVxyXG4gICAgY29uc3QgaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ID0gY21kT3B0cy5yZXBvcnRpbmcgJiYgY21kT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzO1xyXG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcclxuICAgIGlmICghaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ICYmICFpc0NvbmZpZ1JlcG9ydEZvcm1hdCkge1xyXG4gICAgICAgIGlmICghcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzID0gW0RFRkFVTFRfUkVQT1JURVJdO1xyXG4gICAgfVxyXG4gICAgLy8gZGV0ZXJtaW5lIHRlc3QgbmFtZVxyXG4gICAgbGV0IG5hbWUgPSBjbWRPcHRzLm5hbWUgfHwgcHJvakNvbmZpZ09wdHMubmFtZSB8fCBudWxsO1xyXG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xyXG4gICAgICAgIG5hbWUgPSB0YXJnZXQubmFtZSAhPT0gT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5iYXNlTmFtZTtcclxuICAgIH1cclxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XHJcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnMsIHByb2plY3QgY29uZmlnIGZpbGUsIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcclxuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfT1BUUywgLi4ucHJvakNvbmZpZ09wdHMsIC4uLmNtZE9wdHMsIG5hbWU6IG5hbWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lT3B0aW9ucyhhcmd2KSB7XHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1uYW1lIFxyXG4gICAgICAgIG5hbWU6IGFyZ3YubmFtZSB8fCBudWxsLFxyXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXHJcbiAgICAgICAgYnJvd3Nlck5hbWUgOiBhcmd2LmIgfHwgYXJndi5icm93c2VyIHx8IG51bGwsXHJcbiAgICAgICAgc2VsZW5pdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICByZW9wZW5TZXNzaW9uOiBhcmd2LnJlb3BlbiA/IGFyZ3YucmVvcGVuID09PSAndHJ1ZScgOiBudWxsLFxyXG4gICAgICAgIGl0ZXJhdGlvbnMgOiBhcmd2LmkgPyBwYXJzZUludChhcmd2LmkpIDogKGFyZ3YuaXRlciA/IHBhcnNlSW50KGFyZ3YuaXRlcikgOiBudWxsKSxcclxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxyXG4gICAgICAgIHdzUG9ydDogYXJndi53c3BvcnQgfHwgbnVsbCxcclxuICAgICAgICBkZWxheTogYXJndi5kIHx8IGFyZ3YuZGVsYXkgfHwgbnVsbCxcclxuICAgIH07XHJcbiAgICAvLyBzd2l0Y2g6IC0tcmYgZmxhZ1xyXG4gICAgaWYgKGFyZ3YucmYgJiYgdHlwZW9mIGFyZ3YucmYgPT09ICdzdHJpbmcnICYmIGFyZ3YucmYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlcG9ydEZvcm1hdHMgPSBhcmd2LnJmLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5yZXBvcnRpbmcgPSB7XHJcbiAgICAgICAgICAgIHJlcG9ydGVyczogcmVwb3J0Rm9ybWF0c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc3dpdGNoOiAtLXJvIC0gc2V0IHJlcG9ydGVyIG91dHB1dCBkaXJlY3RvcnkgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgICAgICAvLyBOT1RFOiAtLXJvIHN3aXRjaCBtdXN0IGJlIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIC0tcmZcclxuICAgICAgICBpZiAoYXJndi5ybyAmJiB0eXBlb2YgYXJndi5ybyA9PT0gJ3N0cmluZycgJiYgYXJndi5yby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdHMucmVwb3J0aW5nLm91dHB1dERpciA9IGFyZ3Yucm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gb3B0aW9uOiAtcCBvciAtLXBhcmFtIGFuZCAtLXBtXHJcbiAgICBpZiAoYXJndi5wIHx8IGFyZ3YucGFyYW0pIHtcclxuICAgICAgICBvcHRzLnBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgIGZpbGU6IGFyZ3YucCB8fCBhcmd2LnBhcmFtIHx8IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6IGFyZ3YucG0gfHwgJ3NlcSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN3aXRjaDogLS1zcGVjcyAtIHNldCBzcGVjcyBpZiBzZXQgYnkgdXNlciB0aHJvdWdoIGNvbW5hbmQgbGluZVxyXG4gICAgaWYgKGFyZ3Yuc3BlY3MgJiYgdHlwZW9mIGFyZ3Yuc3BlY3MgPT09ICdzdHJpbmcnICYmIGFyZ3Yuc3BlY3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHNwZWNzID0gYXJndi5zcGVjcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMuc3BlY3MgPSBzcGVjcztcclxuICAgIH1cclxuICAgIC8vIHN3aXRjaDogLS1tb2R1bGVzIC0gc2V0IGEgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIGxvYWRlZCwgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgIGlmIChhcmd2Lm1vZHVsZXMgJiYgdHlwZW9mIGFyZ3YubW9kdWxlcyA9PT0gJ3N0cmluZycgJiYgYXJndi5tb2R1bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBtb2R1bGVzID0gYXJndi5tb2R1bGVzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5tb2R1bGVzID0gbW9kdWxlcztcclxuICAgIH1cclxuICAgIC8vIHJlbW92ZSBhbnkgcHJvcGVydHkgd2l0aCBudWxsIHZhbHVlIChzbyBpdCB3b24ndCBvdmVycmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBpdCdzIG51bGwpXHJcbiAgICByZXR1cm4gZGVsZXRlTnVsbFByb3BlcnRpZXMob3B0cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlbGV0ZU51bGxQcm9wZXJ0aWVzKG9iaikge1xyXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xyXG4gICAgZm9yRWFjaCAoa2V5cywga2V5ID0+IHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSAmJiAob2JqW2tleV0gPT0gbnVsbCB8fCBvYmpba2V5XSA9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1RhcmdldFBhdGgodGFyZ2V0UGF0aCwgdXNlckN3ZCkge1xyXG4gICAgbGV0IGN3ZCA9IHVzZXJDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIC8vIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBwYXRoXHJcbiAgICBpZiAodHlwZW9mKHRhcmdldFBhdGgpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBjd2Q7XHJcbiAgICB9XHJcbiAgICAvLyB1c2VyJ3MgcGF0aCBtaWdodCBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIG1ha2Ugc3VyZSB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIHdvcmtcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBveHV0aWwucmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgY3dkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0YXJnZXRQYXRoKTtcclxuICAgIGNvbnN0IGlzRGlyZWN0b3IgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xyXG4gICAgbGV0IGNvbmZpZ0ZpbGVQYXRoO1xyXG4gICAgaWYgKGlzRGlyZWN0b3IpIHtcclxuICAgICAgICAvLyBpZiBcInRhcmdldFwiIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGlzIGEgZGlyZWN0b3J5LFxyXG4gICAgICAgIC8vIHRoZW4gdW5sZXNzIFwiY3dkXCIgaXMgcHJvdmlkZWQgZXhwbGljaXRseSBieSB0aGUgdXNlclxyXG4gICAgICAgIC8vIHVzZSB0YXJnZXQgZGlyZWN0b3J5IGFzIGN3ZFxyXG4gICAgICAgIGN3ZCA9IHVzZXJDd2QgfHwgdGFyZ2V0UGF0aDtcclxuICAgICAgICAvLyBhcHBlbmQgb3h5Z2VuIGNvbmZpZyBmaWxlIG5hbWUgdG8gdGhlIGRpcmVjdG9yeSwgaWYgbm8gdGVzdCBjYXNlIGZpbGUgd2FzIHByb3ZpZGVkXHJcbiAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbih0YXJnZXRQYXRoLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanNvbicpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKGN3ZCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjd2QsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qc29uJyk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0YXJnZXRQYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIC8vIHBhdGggdG8gdGhlIGNvbmZpZyBvciAuanMgZmlsZVxyXG4gICAgICAgIHBhdGg6IHRhcmdldFBhdGgsXHJcbiAgICAgICAgY29uZmlnUGF0aDogY29uZmlnRmlsZVBhdGgsXHJcbiAgICAgICAgLy8gd29ya2luZyBkaXJlY3RvcnlcclxuICAgICAgICBjd2Q6IGN3ZCB8fCBwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgd2l0aG91dCBleHRlbnNpb25cclxuICAgICAgICBuYW1lOiBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIG5hbWUgaW5jbHVkaW5nIGV4dGVuc2lvblxyXG4gICAgICAgIGZ1bGxOYW1lOiBwYXRoLmJhc2VuYW1lKHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIHBhcmVudCBmb2xkZXIncyBuYW1lXHJcbiAgICAgICAgYmFzZU5hbWU6IHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKHRhcmdldFBhdGgpKSxcclxuICAgICAgICAvLyB0YXJnZXQgZmlsZSBleHRlbnNpb25cclxuICAgICAgICBleHRlbnNpb246IHBhdGguZXh0bmFtZSh0YXJnZXRQYXRoKVxyXG4gICAgfTtcclxufSJdfQ==
|
|
310
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX3V0aWwiLCJfYXN5bmMiLCJfbW9kdWxlUmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk9YWUdFTl9DT05GSUdfRklMRV9OQU1FIiwiZXhwb3J0cyIsIk9YWUdFTl9FTlZfRklMRV9OQU1FIiwiT1hZR0VOX1BBR0VfT0JKRUNUX0ZJTEVfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVIiLCJnZW5lcmF0ZVRlc3RPcHRpb25zIiwiY29uZmlnIiwiYXJndiIsIm9wdGlvbnMiLCJlbnYiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwbyIsImdldFBhZ2VPYmplY3RGaWxlUGF0aCIsInN1aXRlcyIsImxvYWRTdWl0ZXMiLCJmcmFtZXdvcmsiLCJ0b0xvd2VyQ2FzZSIsInRhcmdldCIsImlzQ29uZmlnRmlsZSIsIm5hbWUiLCJpbmRleE9mIiwiZXh0ZW5zaW9uIiwiY29uZmlnUGF0aCIsInB1c2giLCJveHV0aWwiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21KU0ZpbGUiLCJwYXRoIiwicGFyYW1ldGVycyIsImZpbGUiLCJtb2RlIiwiaXRlcmF0aW9ucyIsImdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlIiwic3VpdGVEZWZzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3VpdGVzRm9sZGVyIiwiam9pbiIsImN3ZCIsImZzIiwiZXhpc3RzU3luYyIsImxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlciIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJzdWl0ZURlZiIsImdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24iLCJzZWxlY3RlZFN1aXRlTmFtZXMiLCJzcGxpdCIsImZpbHRlciIsIngiLCJpbmNsdWRlcyIsImZvbGRlclBhdGgiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwiZm9yRWFjaCIsImV4dG5hbWUiLCJmdWxsUGF0aCIsIm1vZHVsZVJlcXVpcmUiLCJwb0ZpbGVOYW1lIiwicHJvY2VzcyIsInBvRmlsZVBhdGgiLCJyZXNvbHZlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJhdXRvU3RhcnRXZWJEcml2ZXIiLCJhdXRvd2QiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZW5kc1dpdGgiLCJkaXJuYW1lIiwiZ2V0RmlsZU5hbWVXaXRob3V0RXh0IiwiZnVsbE5hbWUiLCJiYXNlbmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcclxuaW1wb3J0IG1vZHVsZVJlcXVpcmUgZnJvbSAnLi9tb2R1bGVSZXF1aXJlJztcclxuXHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fRU5WX0ZJTEVfTkFNRSA9ICdveHlnZW4uZW52JztcclxuZXhwb3J0IGNvbnN0IE9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUgPSAnb3h5Z2VuLnBvJztcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0T3B0aW9ucyhjb25maWcsIGFyZ3YpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xyXG4gICAgb3B0aW9ucy5lbnYgPSBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMucG8gPSBnZXRQYWdlT2JqZWN0RmlsZVBhdGgoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3VpdGVzKGNvbmZpZywgYXJndikge1xyXG4gICAgaWYgKGNvbmZpZy5mcmFtZXdvcmsgJiYgdHlwZW9mIGNvbmZpZy5mcmFtZXdvcmsgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5mcmFtZXdvcmsudG9Mb3dlckNhc2UoKSAhPT0gJ294eWdlbicpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gY29uZmlnO1xyXG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcclxuICAgICAgICAodGFyZ2V0Lm5hbWUgJiYgdGFyZ2V0Lm5hbWUuaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPT09IDApXHJcbiAgICAgICAgfHwgKHRhcmdldC5leHRlbnNpb24gPT09ICcnICYmIHRhcmdldC5jb25maWdQYXRoICYmIHRhcmdldC5jb25maWdQYXRoLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID4gLTEpXHJcbiAgICApO1xyXG4gICAgbGV0IHN1aXRlcyA9IFtdO1xyXG4gICAgLy8gaWYgYW4gaW5kaXZpZHVhbCBzY3JpcHQgb3Igc3VpdGUgZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpTRmlsZSh0YXJnZXQucGF0aCwgY29uZmlnLnBhcmFtZXRlcnMuZmlsZSwgY29uZmlnLnBhcmFtZXRlcnMubW9kZSwgZmFsc2UsIGNvbmZpZy5pdGVyYXRpb25zIHx8IDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanNvbicpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBjb25maWcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3VpdGVEZWZzID0gW107XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zdWl0ZXMgJiYgQXJyYXkuaXNBcnJheShjb25maWcuc3VpdGVzKSkge1xyXG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBtb3JlIHN1aXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgJ3N1aXRlcycgZm9sZGVyXHJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzdWl0ZXNGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHN1aXRlRGVmcyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcclxuICAgICAgICAgICAgICAgIC4uLmxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihzdWl0ZXNGb2xkZXIpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1lcmdlIHN1aXRlcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGNvbmZpZyBmaWxlIGFuZCB0aG9zZSBmb3VuZCBpbiAnc3VpdGVzJyBmb2xkZXJcclxuICAgICAgICBzdWl0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdWl0ZURlZnMubWFwKGFzeW5jIChzdWl0ZURlZikgPT4gYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24oc3VpdGVEZWYsIGNvbmZpZykpKTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBvdXQgc3VpdGVzIGlmICctLXN1aXRlcycgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWRcclxuICAgIGlmIChhcmd2LnN1aXRlcyAmJiB0eXBlb2YgYXJndi5zdWl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBzdWl0ZXMgPSBzdWl0ZXMuZmlsdGVyKHggPT4gc2VsZWN0ZWRTdWl0ZU5hbWVzLmluY2x1ZGVzKHgubmFtZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1aXRlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGZvbGRlclBhdGgpO1xyXG4gICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xyXG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XHJcbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qc29uJykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcclxuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1aXRlRGVmcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCB7fTtcclxuICAgIGNvbnN0IHBvRmlsZU5hbWUgPSBhcmd2LnBvIHx8IGAke09YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUV9LmpzYDtcclxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGxldCBwb0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcG9GaWxlTmFtZSk7XHJcbiAgICBwb0ZpbGVQYXRoID0gZnMuZXhpc3RzU3luYyhwb0ZpbGVQYXRoKSA/IHBvRmlsZVBhdGggOiBudWxsO1xyXG5cclxuICAgIGlmIChwb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvRmlsZVBhdGg7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xyXG4gICAgY29uc3QgZW52TmFtZSA9IGFyZ3YuZW52IHx8IGNvbmZpZy5lbnZpcm9ubWVudCB8fCAnZGVmYXVsdCc7XHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXQuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRyeSB0byByZXNvbHZlIGEgZGVkaWNhdGVkIGVudmlyb25tZW50IGZpbGUgaW4gJ2Vudicgc3ViIGZvbGRlclxyXG4gICAgY29uc3QgZGVkaWNhdGVkRW52RmlsZUpzID0gcGF0aC5qb2luKGN3ZCwgJ2VudicsIGAke2Vudk5hbWV9LmpzYCk7XHJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWRpY2F0ZWRFbnZGaWxlSnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCkge1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW52RmlsZSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7ZGVmYXVsdEVudkZpbGV9LiBSZWFzb246ICR7ZS5tZXNzYWdlfSAke2Uuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcclxuICAgIC8vIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuICAgIGNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgICAgICBjd2Q6IHRhcmdldCA/ICh0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKSkgOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnY2hyb21lJyxcclxuICAgICAgICBzZWxlbml1bVVybCA6ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJyxcclxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXHJcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgcmVSdW5PbkZhaWxlZDogZmFsc2UsXHJcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXHJcbiAgICAgICAgZGVidWdQb3J0OiBudWxsLFxyXG4gICAgICAgIGRlbGF5OiBudWxsLFxyXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogZmFsc2UsXHJcbiAgICAgICAgY29sbGVjdEJyb3dzZXJMb2dzOiBmYWxzZSxcclxuICAgICAgICByZXBvcnRpbmc6IHtcclxuICAgICAgICAgICAgcmVwb3J0ZXJzOiBbREVGQVVMVF9SRVBPUlRFUl1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6ICdzZXEnXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyByZXRyaWV2ZSBvcHRpb25zIHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXHJcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xyXG4gICAgLy8gaWYgdGhlIHRhcmdldCBpcyBveHlnZW4gY29uZmlnIGZpbGUsIG1lcmdlIGl0cyBjb250ZW50IHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgbGV0IHByb2pDb25maWdPcHRzID0ge307XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IG1vZHVsZVJlcXVpcmUodGFyZ2V0LnBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmaWxlOiAke3RhcmdldC5wYXRofS4gUmVhc29uOiAke2UubWVzc2FnZX0gJHtlLnN0YWNrfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jb25maWdQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvakNvbmZpZ09wdHMgPSBtb2R1bGVSZXF1aXJlKHRhcmdldC5jb25maWdQYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGVudnMgPSBnZXRFbnZpcm9ubWVudHModGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xyXG4gICAgICAgIC8vIG1lcmdlIGV4dGVybmFsIGVudmlyb25tZW50cyBkZWZpbml0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGVcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5lbnZzID0geyAuLi5wcm9qQ29uZmlnT3B0cy5lbnZzLCAuLi5lbnZzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IHsgLi4ucHJvakNvbmZpZ09wdHMsIGVudnM6IGVudnMgfTtcclxuICAgIH1cclxuICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgZGVmYXVsdCBIVE1MIHJlcG9ydGVyIGlmIHJlcG9ydGluZyBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQgaW4gb3h5Z2VuLmNvbmYgZmlsZSBhbmQgdmlhIGNvbW1hbmQgbGluZVxyXG4gICAgY29uc3QgaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ID0gY21kT3B0cy5yZXBvcnRpbmcgJiYgY21kT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzO1xyXG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcclxuICAgIGlmICghaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ICYmICFpc0NvbmZpZ1JlcG9ydEZvcm1hdCkge1xyXG4gICAgICAgIGlmICghcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzID0gW0RFRkFVTFRfUkVQT1JURVJdO1xyXG4gICAgfVxyXG4gICAgLy8gZGV0ZXJtaW5lIHRlc3QgbmFtZVxyXG4gICAgbGV0IG5hbWUgPSBjbWRPcHRzLm5hbWUgfHwgcHJvakNvbmZpZ09wdHMubmFtZSB8fCBudWxsO1xyXG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xyXG4gICAgICAgIG5hbWUgPSB0YXJnZXQubmFtZSAhPT0gT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5iYXNlTmFtZTtcclxuICAgIH1cclxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XHJcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnMsIHByb2plY3QgY29uZmlnIGZpbGUsIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcclxuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfT1BUUywgLi4ucHJvakNvbmZpZ09wdHMsIC4uLmNtZE9wdHMsIG5hbWU6IG5hbWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lT3B0aW9ucyhhcmd2KSB7XHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1uYW1lIFxyXG4gICAgICAgIG5hbWU6IGFyZ3YubmFtZSB8fCBudWxsLFxyXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXHJcbiAgICAgICAgYnJvd3Nlck5hbWUgOiBhcmd2LmIgfHwgYXJndi5icm93c2VyIHx8IG51bGwsXHJcbiAgICAgICAgc2VsZW5pdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICByZW9wZW5TZXNzaW9uOiBhcmd2LnJlb3BlbiA/IGFyZ3YucmVvcGVuID09PSAndHJ1ZScgOiBudWxsLFxyXG4gICAgICAgIGl0ZXJhdGlvbnMgOiBhcmd2LmkgPyBwYXJzZUludChhcmd2LmkpIDogKGFyZ3YuaXRlciA/IHBhcnNlSW50KGFyZ3YuaXRlcikgOiBudWxsKSxcclxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxyXG4gICAgICAgIHdzUG9ydDogYXJndi53c3BvcnQgfHwgbnVsbCxcclxuICAgICAgICBkZWxheTogYXJndi5kIHx8IGFyZ3YuZGVsYXkgfHwgbnVsbCxcclxuICAgICAgICBhdXRvU3RhcnRXZWJEcml2ZXI6IGFyZ3YuYXV0b3dkICYmIGFyZ3YuYXV0b3dkID09PSAndHJ1ZScgfHwgZmFsc2UsXHJcbiAgICB9O1xyXG4gICAgLy8gc3dpdGNoOiAtLXJmIGZsYWdcclxuICAgIGlmIChhcmd2LnJmICYmIHR5cGVvZiBhcmd2LnJmID09PSAnc3RyaW5nJyAmJiBhcmd2LnJmLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZXBvcnRGb3JtYXRzID0gYXJndi5yZi5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMucmVwb3J0aW5nID0ge1xyXG4gICAgICAgICAgICByZXBvcnRlcnM6IHJlcG9ydEZvcm1hdHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1ybyAtIHNldCByZXBvcnRlciBvdXRwdXQgZGlyZWN0b3J5IGlmIHNldCBieSB1c2VyIHRocm91Z2ggY29tbmFuZCBsaW5lXHJcbiAgICAgICAgLy8gTk9URTogLS1ybyBzd2l0Y2ggbXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCAtLXJmXHJcbiAgICAgICAgaWYgKGFyZ3Yucm8gJiYgdHlwZW9mIGFyZ3Yucm8gPT09ICdzdHJpbmcnICYmIGFyZ3Yucm8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvcHRzLnJlcG9ydGluZy5vdXRwdXREaXIgPSBhcmd2LnJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIG9wdGlvbjogLXAgb3IgLS1wYXJhbSBhbmQgLS1wbVxyXG4gICAgaWYgKGFyZ3YucCB8fCBhcmd2LnBhcmFtKSB7XHJcbiAgICAgICAgb3B0cy5wYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICBmaWxlOiBhcmd2LnAgfHwgYXJndi5wYXJhbSB8fCBudWxsLFxyXG4gICAgICAgICAgICBtb2RlOiBhcmd2LnBtIHx8ICdzZXEnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzd2l0Y2g6IC0tc3BlY3MgLSBzZXQgc3BlY3MgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgIGlmIChhcmd2LnNwZWNzICYmIHR5cGVvZiBhcmd2LnNwZWNzID09PSAnc3RyaW5nJyAmJiBhcmd2LnNwZWNzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBzcGVjcyA9IGFyZ3Yuc3BlY3Muc3BsaXQoJywnKTtcclxuICAgICAgICBvcHRzLnNwZWNzID0gc3BlY3M7XHJcbiAgICB9XHJcbiAgICAvLyBzd2l0Y2g6IC0tbW9kdWxlcyAtIHNldCBhIGxpc3Qgb2YgbW9kdWxlcyB0byBiZSBsb2FkZWQsIGlmIHNldCBieSB1c2VyIHRocm91Z2ggY29tbmFuZCBsaW5lXHJcbiAgICBpZiAoYXJndi5tb2R1bGVzICYmIHR5cGVvZiBhcmd2Lm1vZHVsZXMgPT09ICdzdHJpbmcnICYmIGFyZ3YubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlcyA9IGFyZ3YubW9kdWxlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMubW9kdWxlcyA9IG1vZHVsZXM7XHJcbiAgICB9XHJcbiAgICAvLyByZW1vdmUgYW55IHByb3BlcnR5IHdpdGggbnVsbCB2YWx1ZSAoc28gaXQgd29uJ3Qgb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMgaWYgaXQncyBudWxsKVxyXG4gICAgcmV0dXJuIGRlbGV0ZU51bGxQcm9wZXJ0aWVzKG9wdHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWxldGVOdWxsUHJvcGVydGllcyhvYmopIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbG9uZSA9IHsgLi4ub2JqIH07XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICAgIGZvckVhY2ggKGtleXMsIGtleSA9PiB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgKG9ialtrZXldID09IG51bGwgfHwgb2JqW2tleV0gPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICBkZWxldGUgY2xvbmVba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUYXJnZXRQYXRoKHRhcmdldFBhdGgsIHVzZXJDd2QpIHtcclxuICAgIGxldCBjd2QgPSB1c2VyQ3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAvLyBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiB1c2VyIGhhcyBub3QgcHJvdmlkZWQgcGF0aFxyXG4gICAgaWYgKHR5cGVvZih0YXJnZXRQYXRoKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0YXJnZXRQYXRoID0gY3dkO1xyXG4gICAgfVxyXG4gICAgLy8gdXNlcidzIHBhdGggbWlnaHQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgLSBtYWtlIHN1cmUgdGhlIHJlbGF0aXZlIHBhdGggd2lsbCB3b3JrXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0YXJnZXRQYXRoID0gb3h1dGlsLnJlc29sdmVQYXRoKHRhcmdldFBhdGgsIGN3ZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmModGFyZ2V0UGF0aCk7XHJcbiAgICBjb25zdCBpc0RpcmVjdG9yID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcclxuICAgIGxldCBjb25maWdGaWxlUGF0aDtcclxuICAgIGlmIChpc0RpcmVjdG9yKSB7XHJcbiAgICAgICAgLy8gaWYgXCJ0YXJnZXRcIiBwcm92aWRlZCBieSB0aGUgdXNlciBpcyBhIGRpcmVjdG9yeSxcclxuICAgICAgICAvLyB0aGVuIHVubGVzcyBcImN3ZFwiIGlzIHByb3ZpZGVkIGV4cGxpY2l0bHkgYnkgdGhlIHVzZXJcclxuICAgICAgICAvLyB1c2UgdGFyZ2V0IGRpcmVjdG9yeSBhcyBjd2RcclxuICAgICAgICBjd2QgPSB1c2VyQ3dkIHx8IHRhcmdldFBhdGg7XHJcbiAgICAgICAgLy8gYXBwZW5kIG94eWdlbiBjb25maWcgZmlsZSBuYW1lIHRvIHRoZSBkaXJlY3RvcnksIGlmIG5vIHRlc3QgY2FzZSBmaWxlIHdhcyBwcm92aWRlZFxyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHRhcmdldFBhdGgsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0YXJnZXRQYXRoLmVuZHNXaXRoKE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpIHx8IHRhcmdldFBhdGguZW5kc1dpdGgoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKSkge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gdGFyZ2V0UGF0aDtcclxuICAgICAgICBjd2QgPSB0YXJnZXRQYXRoID0gcGF0aC5kaXJuYW1lKHRhcmdldFBhdGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY3dkID0gdXNlckN3ZCB8fCBwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCk7XHJcbiAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4oY3dkLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanMnKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKGN3ZCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRhcmdldFBhdGgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gcGF0aCB0byB0aGUgY29uZmlnIG9yIC5qcyBmaWxlXHJcbiAgICAgICAgcGF0aDogdGFyZ2V0UGF0aCxcclxuICAgICAgICBjb25maWdQYXRoOiBjb25maWdGaWxlUGF0aCxcclxuICAgICAgICAvLyB3b3JraW5nIGRpcmVjdG9yeVxyXG4gICAgICAgIGN3ZDogY3dkIHx8IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKSxcclxuICAgICAgICAvLyBuYW1lIG9mIHRoZSB0YXJnZXQgZmlsZSB3aXRob3V0IGV4dGVuc2lvblxyXG4gICAgICAgIG5hbWU6IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gbmFtZSBpbmNsdWRpbmcgZXh0ZW5zaW9uXHJcbiAgICAgICAgZnVsbE5hbWU6IHBhdGguYmFzZW5hbWUodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gcGFyZW50IGZvbGRlcidzIG5hbWVcclxuICAgICAgICBiYXNlTmFtZTogcGF0aC5iYXNlbmFtZShwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCkpLFxyXG4gICAgICAgIC8vIHRhcmdldCBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgIGV4dGVuc2lvbjogcGF0aC5leHRuYW1lKHRhcmdldFBhdGgpXHJcbiAgICB9O1xyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsR0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksY0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQTRDLFNBQUFELHVCQUFBTSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXJDLE1BQU1HLHVCQUF1QixHQUFBQyxPQUFBLENBQUFELHVCQUFBLEdBQUcsYUFBYTtBQUM3QyxNQUFNRSxvQkFBb0IsR0FBQUQsT0FBQSxDQUFBQyxvQkFBQSxHQUFHLFlBQVk7QUFDekMsTUFBTUMsNEJBQTRCLEdBQUFGLE9BQUEsQ0FBQUUsNEJBQUEsR0FBRyxXQUFXO0FBQ2hELE1BQU1DLGdCQUFnQixHQUFBSCxPQUFBLENBQUFHLGdCQUFBLEdBQUcsTUFBTTtBQUUvQixlQUFlQyxtQkFBbUJBLENBQUNDLE1BQU0sRUFBRUMsSUFBSSxFQUFFO0VBQ3BELE1BQU1DLE9BQU8sR0FBRztJQUFFLEdBQUdGO0VBQU8sQ0FBQztFQUM3QkUsT0FBTyxDQUFDQyxHQUFHLEdBQUdDLHdCQUF3QixDQUFDSixNQUFNLEVBQUVDLElBQUksQ0FBQztFQUNwREMsT0FBTyxDQUFDRyxFQUFFLEdBQUdDLHFCQUFxQixDQUFDTixNQUFNLEVBQUVDLElBQUksQ0FBQztFQUNoREMsT0FBTyxDQUFDSyxNQUFNLEdBQUcsTUFBTUMsVUFBVSxDQUFDUixNQUFNLEVBQUVDLElBQUksQ0FBQztFQUMvQyxPQUFPQyxPQUFPO0FBQ2xCO0FBRU8sZUFBZU0sVUFBVUEsQ0FBQ1IsTUFBTSxFQUFFQyxJQUFJLEVBQUU7RUFDM0MsSUFBSUQsTUFBTSxDQUFDUyxTQUFTLElBQUksT0FBT1QsTUFBTSxDQUFDUyxTQUFTLEtBQUssUUFBUSxJQUFJVCxNQUFNLENBQUNTLFNBQVMsQ0FBQ0MsV0FBVyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7SUFDekc7RUFDSjtFQUNBLE1BQU07SUFBRUM7RUFBTyxDQUFDLEdBQUdYLE1BQU07RUFDekIsTUFBTVksWUFBWSxHQUFHRCxNQUFNLEtBQ3RCQSxNQUFNLENBQUNFLElBQUksSUFBSUYsTUFBTSxDQUFDRSxJQUFJLENBQUNDLE9BQU8sQ0FBQ3BCLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUM5RGlCLE1BQU0sQ0FBQ0ksU0FBUyxLQUFLLEVBQUUsSUFBSUosTUFBTSxDQUFDSyxVQUFVLElBQUlMLE1BQU0sQ0FBQ0ssVUFBVSxDQUFDRixPQUFPLENBQUNwQix1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUMvRztFQUNELElBQUlhLE1BQU0sR0FBRyxFQUFFO0VBRWYsSUFBSSxDQUFDSyxZQUFZLEVBQUU7SUFDZixJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksU0FBUyxLQUFLLEtBQUssRUFBRTtNQUN0Q1IsTUFBTSxDQUFDVSxJQUFJLENBQUMsTUFBTUMsYUFBTSxDQUFDQywyQkFBMkIsQ0FBQ1IsTUFBTSxDQUFDUyxJQUFJLEVBQUVwQixNQUFNLENBQUNxQixVQUFVLENBQUNDLElBQUksRUFBRXRCLE1BQU0sQ0FBQ3FCLFVBQVUsQ0FBQ0UsSUFBSSxFQUFFLEtBQUssRUFBRXZCLE1BQU0sQ0FBQ3dCLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNySixDQUFDLE1BQ0ksSUFBSWIsTUFBTSxJQUFJQSxNQUFNLENBQUNJLFNBQVMsS0FBSyxPQUFPLEVBQUU7TUFDN0NSLE1BQU0sQ0FBQ1UsSUFBSSxDQUFDLE1BQU1DLGFBQU0sQ0FBQ08sNkJBQTZCLENBQUNkLE1BQU0sQ0FBQ1MsSUFBSSxFQUFFcEIsTUFBTSxDQUFDcUIsVUFBVSxDQUFDQyxJQUFJLEVBQUV0QixNQUFNLENBQUNxQixVQUFVLENBQUNFLElBQUksRUFBRXZCLE1BQU0sQ0FBQyxDQUFDO0lBQ2hJO0VBQ0osQ0FBQyxNQUVJO0lBQ0QsSUFBSTBCLFNBQVMsR0FBRyxFQUFFO0lBQ2xCLElBQUkxQixNQUFNLENBQUNPLE1BQU0sSUFBSW9CLEtBQUssQ0FBQ0MsT0FBTyxDQUFDNUIsTUFBTSxDQUFDTyxNQUFNLENBQUMsRUFBRTtNQUMvQ21CLFNBQVMsR0FBRzFCLE1BQU0sQ0FBQ08sTUFBTTtJQUM3QjtJQUVBLE1BQU1zQixZQUFZLEdBQUdULGFBQUksQ0FBQ1UsSUFBSSxDQUFDbkIsTUFBTSxDQUFDb0IsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUNwRCxJQUFJQyxXQUFFLENBQUNDLFVBQVUsQ0FBQ0osWUFBWSxDQUFDLEVBQUU7TUFDN0JILFNBQVMsR0FBRyxDQUNSLEdBQUdBLFNBQVMsRUFDWixHQUFHUSw4QkFBOEIsQ0FBQ0wsWUFBWSxDQUFDLENBQ2xEO0lBQ0w7SUFFQXRCLE1BQU0sR0FBRyxNQUFNNEIsT0FBTyxDQUFDQyxHQUFHLENBQUNWLFNBQVMsQ0FBQ1csR0FBRyxDQUFDLE1BQU9DLFFBQVEsSUFBSyxNQUFNcEIsYUFBTSxDQUFDcUIseUJBQXlCLENBQUNELFFBQVEsRUFBRXRDLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDM0g7RUFFQSxJQUFJQyxJQUFJLENBQUNNLE1BQU0sSUFBSSxPQUFPTixJQUFJLENBQUNNLE1BQU0sS0FBSyxRQUFRLEVBQUU7SUFDaEQsTUFBTWlDLGtCQUFrQixHQUFHdkMsSUFBSSxDQUFDTSxNQUFNLENBQUNrQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ2pEbEMsTUFBTSxHQUFHQSxNQUFNLENBQUNtQyxNQUFNLENBQUNDLENBQUMsSUFBSUgsa0JBQWtCLENBQUNJLFFBQVEsQ0FBQ0QsQ0FBQyxDQUFDOUIsSUFBSSxDQUFDLENBQUM7RUFDcEU7RUFDQSxPQUFPTixNQUFNO0FBQ2pCO0FBRU8sU0FBUzJCLDhCQUE4QkEsQ0FBQ1csVUFBVSxFQUFFO0VBQ3ZELE1BQU1DLEtBQUssR0FBR2QsV0FBRSxDQUFDZSxXQUFXLENBQUNGLFVBQVUsQ0FBQztFQUN4QyxJQUFJbkIsU0FBUyxHQUFHLEVBQUU7RUFDbEIsSUFBQXNCLGNBQU8sRUFBQ0YsS0FBSyxFQUFFeEIsSUFBSSxJQUFJO0lBQ25CLElBQUlGLGFBQUksQ0FBQzZCLE9BQU8sQ0FBQzNCLElBQUksQ0FBQyxLQUFLLE9BQU8sRUFBRTtNQUNoQyxNQUFNNEIsUUFBUSxHQUFHOUIsYUFBSSxDQUFDVSxJQUFJLENBQUNlLFVBQVUsRUFBRXZCLElBQUksQ0FBQztNQUM1Q0ksU0FBUyxDQUFDVCxJQUFJLENBQUMsSUFBQWtDLHNCQUFhLEVBQUNELFFBQVEsQ0FBQyxDQUFDO0lBQzNDO0VBQ0osQ0FBQyxDQUFDO0VBQ0YsT0FBT3hCLFNBQVM7QUFDcEI7QUFFTyxTQUFTcEIscUJBQXFCQSxDQUFDTixNQUFNLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNyRCxNQUFNVSxNQUFNLEdBQUdYLE1BQU0sQ0FBQ1csTUFBTSxJQUFJLENBQUMsQ0FBQztFQUNsQyxNQUFNeUMsVUFBVSxHQUFHbkQsSUFBSSxDQUFDSSxFQUFFLElBQUksR0FBR1IsNEJBQTRCLEtBQUs7RUFDbEUsTUFBTWtDLEdBQUcsR0FBR3BCLE1BQU0sQ0FBQ29CLEdBQUcsSUFBSXNCLE9BQU8sQ0FBQ3RCLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZDLElBQUl1QixVQUFVLEdBQUdsQyxhQUFJLENBQUNtQyxPQUFPLENBQUN4QixHQUFHLEVBQUVxQixVQUFVLENBQUM7RUFDOUNFLFVBQVUsR0FBR3RCLFdBQUUsQ0FBQ0MsVUFBVSxDQUFDcUIsVUFBVSxDQUFDLEdBQUdBLFVBQVUsR0FBRyxJQUFJO0VBRTFELElBQUlBLFVBQVUsRUFBRTtJQUNaLElBQUk7TUFDQSxJQUFBSCxzQkFBYSxFQUFDRyxVQUFVLENBQUM7TUFDekIsT0FBT0EsVUFBVTtJQUNyQixDQUFDLENBQUMsT0FBTy9ELENBQUMsRUFBRTtNQUNSLE1BQU1pRSxHQUFHLEdBQUcsSUFBSUMsS0FBSyxDQUFDLHdCQUF3QkgsVUFBVSxhQUFhL0QsQ0FBQyxDQUFDbUUsT0FBTyxJQUFJbkUsQ0FBQyxDQUFDb0UsS0FBSyxFQUFFLENBQUM7TUFDNUYsTUFBTUgsR0FBRztJQUNiO0VBQ0osQ0FBQyxNQUFNO0lBQ0gsT0FBTyxJQUFJO0VBQ2Y7QUFDSjtBQUVPLFNBQVNwRCx3QkFBd0JBLENBQUNKLE1BQU0sRUFBRUMsSUFBSSxFQUFFO0VBQ25ELE1BQU1VLE1BQU0sR0FBR1gsTUFBTSxDQUFDVyxNQUFNLElBQUksQ0FBQyxDQUFDO0VBQ2xDLE1BQU1pRCxPQUFPLEdBQUczRCxJQUFJLENBQUNFLEdBQUcsSUFBSUgsTUFBTSxDQUFDNkQsV0FBVyxJQUFJLFNBQVM7RUFDM0QsTUFBTTlCLEdBQUcsR0FBR3BCLE1BQU0sQ0FBQ29CLEdBQUcsSUFBSXNCLE9BQU8sQ0FBQ3RCLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZDLE1BQU0rQixjQUFjLEdBQUcxQyxhQUFJLENBQUNVLElBQUksQ0FBQ0MsR0FBRyxFQUFFLEdBQUduQyxvQkFBb0IsS0FBSyxDQUFDO0VBQ25FLElBQUlvQyxXQUFFLENBQUNDLFVBQVUsQ0FBQzZCLGNBQWMsQ0FBQyxFQUFFO0lBQy9CLE1BQU0zRCxHQUFHLEdBQUcsSUFBQWdELHNCQUFhLEVBQUNXLGNBQWMsQ0FBQztJQUN6QyxJQUFJM0QsR0FBRyxJQUFJLE9BQU9BLEdBQUcsS0FBSyxRQUFRLElBQUk0RCxNQUFNLENBQUNDLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUMvRCxHQUFHLEVBQUV5RCxPQUFPLENBQUMsRUFBRTtNQUN0RixPQUFPekQsR0FBRyxDQUFDeUQsT0FBTyxDQUFDO0lBQ3ZCO0VBQ0o7RUFFQSxNQUFNTyxrQkFBa0IsR0FBRy9DLGFBQUksQ0FBQ1UsSUFBSSxDQUFDQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUc2QixPQUFPLEtBQUssQ0FBQztFQUNqRSxNQUFNUSxvQkFBb0IsR0FBR2hELGFBQUksQ0FBQ1UsSUFBSSxDQUFDQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUc2QixPQUFPLE9BQU8sQ0FBQztFQUNyRSxJQUFJNUIsV0FBRSxDQUFDQyxVQUFVLENBQUNrQyxrQkFBa0IsQ0FBQyxFQUFFO0lBQ25DLE9BQU8sSUFBQWhCLHNCQUFhLEVBQUNnQixrQkFBa0IsQ0FBQztFQUM1QyxDQUFDLE1BQ0ksSUFBSW5DLFdBQUUsQ0FBQ0MsVUFBVSxDQUFDbUMsb0JBQW9CLENBQUMsRUFBRTtJQUMxQyxPQUFPLElBQUFqQixzQkFBYSxFQUFDaUIsb0JBQW9CLENBQUM7RUFDOUM7RUFDQSxPQUFPLENBQUMsQ0FBQztBQUNiO0FBRU8sU0FBU0MsZUFBZUEsQ0FBQzFELE1BQU0sRUFBRTtFQUNwQyxJQUFJMkQsU0FBUyxHQUFHLElBQUk7RUFFcEIsSUFBSTNELE1BQU0sSUFBSUEsTUFBTSxDQUFDb0IsR0FBRyxFQUFFO0lBQ3RCdUMsU0FBUyxHQUFHM0QsTUFBTSxDQUFDb0IsR0FBRztFQUMxQjtFQUVBLE1BQU1BLEdBQUcsR0FBR3VDLFNBQVMsSUFBSWpCLE9BQU8sQ0FBQ3RCLEdBQUcsQ0FBQyxDQUFDO0VBQ3RDLE1BQU0rQixjQUFjLEdBQUcxQyxhQUFJLENBQUNVLElBQUksQ0FBQ0MsR0FBRyxFQUFFLEdBQUduQyxvQkFBb0IsS0FBSyxDQUFDO0VBQ25FLElBQUlvQyxXQUFFLENBQUNDLFVBQVUsQ0FBQzZCLGNBQWMsQ0FBQyxFQUFFO0lBQy9CLElBQUk7TUFDQSxPQUFPLElBQUFYLHNCQUFhLEVBQUNXLGNBQWMsQ0FBQztJQUN4QyxDQUFDLENBQUMsT0FBT3ZFLENBQUMsRUFBRTtNQUNSLE1BQU1pRSxHQUFHLEdBQUcsSUFBSUMsS0FBSyxDQUFDLHdCQUF3QkssY0FBYyxhQUFhdkUsQ0FBQyxDQUFDbUUsT0FBTyxJQUFJbkUsQ0FBQyxDQUFDb0UsS0FBSyxFQUFFLENBQUM7TUFDaEcsTUFBTUgsR0FBRztJQUNiO0VBQ0o7RUFDQSxPQUFPLENBQUMsQ0FBQztBQUNiO0FBRU8sU0FBU2UsaUJBQWlCQSxDQUFDNUQsTUFBTSxFQUFFVixJQUFJLEVBQUU7RUFFNUMsSUFBSXFFLFNBQVMsR0FBRyxJQUFJO0VBRXBCLElBQUkzRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ29CLEdBQUcsRUFBRTtJQUN0QnVDLFNBQVMsR0FBRzNELE1BQU0sQ0FBQ29CLEdBQUc7RUFDMUI7RUFDQSxNQUFNeUMsWUFBWSxHQUFHO0lBQ2pCekMsR0FBRyxFQUFFcEIsTUFBTSxHQUFJMkQsU0FBUyxJQUFJakIsT0FBTyxDQUFDdEIsR0FBRyxDQUFDLENBQUMsR0FBSXNCLE9BQU8sQ0FBQ3RCLEdBQUcsQ0FBQyxDQUFDO0lBQzFEcEIsTUFBTSxFQUFFQSxNQUFNO0lBQ2Q4RCxXQUFXLEVBQUUsUUFBUTtJQUNyQkMsV0FBVyxFQUFHLDhCQUE4QjtJQUM1Q0MsU0FBUyxFQUFHLDhCQUE4QjtJQUMxQ0MsYUFBYSxFQUFFLEtBQUs7SUFDcEJDLGFBQWEsRUFBRSxLQUFLO0lBQ3BCckQsVUFBVSxFQUFHLENBQUM7SUFDZHNELFNBQVMsRUFBRSxJQUFJO0lBQ2ZDLEtBQUssRUFBRSxJQUFJO0lBQ1hDLGlCQUFpQixFQUFFLEtBQUs7SUFDeEJDLGlCQUFpQixFQUFFLEtBQUs7SUFDeEJDLGtCQUFrQixFQUFFLEtBQUs7SUFDekJDLFNBQVMsRUFBRTtNQUNQQyxTQUFTLEVBQUUsQ0FBQ3RGLGdCQUFnQjtJQUNoQyxDQUFDO0lBQ0R1QixVQUFVLEVBQUc7TUFDVEMsSUFBSSxFQUFFLElBQUk7TUFDVkMsSUFBSSxFQUFFO0lBQ1Y7RUFDSixDQUFDO0VBRUQsTUFBTThELE9BQU8sR0FBR0MscUJBQXFCLENBQUNyRixJQUFJLENBQUM7RUFFM0MsSUFBSXNGLGNBQWMsR0FBRyxDQUFDLENBQUM7RUFDdkIsSUFBSTVFLE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFJLEtBQUtuQix1QkFBdUIsS0FBS2lCLE1BQU0sQ0FBQ0ksU0FBUyxLQUFLLEtBQUssSUFBSUosTUFBTSxDQUFDSSxTQUFTLEtBQUssT0FBTyxDQUFDLEVBQUU7SUFDbkgsSUFBSTtNQUNBd0UsY0FBYyxHQUFHLElBQUFwQyxzQkFBYSxFQUFDeEMsTUFBTSxDQUFDUyxJQUFJLENBQUM7SUFDL0MsQ0FBQyxDQUFDLE9BQU83QixDQUFDLEVBQUU7TUFDUixNQUFNaUUsR0FBRyxHQUFHLElBQUlDLEtBQUssQ0FBQyx3QkFBd0I5QyxNQUFNLENBQUNTLElBQUksYUFBYTdCLENBQUMsQ0FBQ21FLE9BQU8sSUFBSW5FLENBQUMsQ0FBQ29FLEtBQUssRUFBRSxDQUFDO01BQzdGLE1BQU1ILEdBQUc7SUFDYjtFQUNKLENBQUMsTUFDSSxJQUFJN0MsTUFBTSxJQUFJQSxNQUFNLENBQUNLLFVBQVUsRUFBRTtJQUNsQyxJQUFJO01BQ0F1RSxjQUFjLEdBQUcsSUFBQXBDLHNCQUFhLEVBQUN4QyxNQUFNLENBQUNLLFVBQVUsQ0FBQztJQUNyRCxDQUFDLENBQUMsT0FBT3pCLENBQUMsRUFBRTtNQUNSLE1BQU1pRSxHQUFHLEdBQUcsSUFBSUMsS0FBSyxDQUFDLHdCQUF3QjlDLE1BQU0sQ0FBQ0ssVUFBVSxhQUFhekIsQ0FBQyxDQUFDbUUsT0FBTyxJQUFJbkUsQ0FBQyxDQUFDb0UsS0FBSyxFQUFFLENBQUM7TUFDbkcsTUFBTUgsR0FBRztJQUNiO0VBQ0o7RUFDQSxNQUFNZ0MsSUFBSSxHQUFHbkIsZUFBZSxDQUFDMUQsTUFBTSxDQUFDO0VBRXBDLElBQUk0RSxjQUFjLENBQUNDLElBQUksRUFBRTtJQUVyQkQsY0FBYyxDQUFDQyxJQUFJLEdBQUc7TUFBRSxHQUFHRCxjQUFjLENBQUNDLElBQUk7TUFBRSxHQUFHQTtJQUFLLENBQUM7RUFDN0QsQ0FBQyxNQUNJO0lBQ0RELGNBQWMsR0FBRztNQUFFLEdBQUdBLGNBQWM7TUFBRUMsSUFBSSxFQUFFQTtJQUFLLENBQUM7RUFDdEQ7RUFFQSxNQUFNQyxxQkFBcUIsR0FBR0osT0FBTyxDQUFDRixTQUFTLElBQUlFLE9BQU8sQ0FBQ0YsU0FBUyxDQUFDQyxTQUFTO0VBQzlFLE1BQU1NLG9CQUFvQixHQUFHSCxjQUFjLENBQUNKLFNBQVMsSUFBSUksY0FBYyxDQUFDSixTQUFTLENBQUNDLFNBQVM7RUFDM0YsSUFBSSxDQUFDSyxxQkFBcUIsSUFBSSxDQUFDQyxvQkFBb0IsRUFBRTtJQUNqRCxJQUFJLENBQUNILGNBQWMsQ0FBQ0osU0FBUyxFQUFFO01BQzNCSSxjQUFjLENBQUNKLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDakM7SUFDQUksY0FBYyxDQUFDSixTQUFTLENBQUNDLFNBQVMsR0FBRyxDQUFDdEYsZ0JBQWdCLENBQUM7RUFDM0Q7RUFFQSxJQUFJZSxJQUFJLEdBQUd3RSxPQUFPLENBQUN4RSxJQUFJLElBQUkwRSxjQUFjLENBQUMxRSxJQUFJLElBQUksSUFBSTtFQUN0RCxJQUFJLENBQUNBLElBQUksSUFBSUYsTUFBTSxFQUFFO0lBQ2pCRSxJQUFJLEdBQUdGLE1BQU0sQ0FBQ0UsSUFBSSxLQUFLbkIsdUJBQXVCLEdBQUdpQixNQUFNLENBQUNFLElBQUksR0FBR0YsTUFBTSxDQUFDZ0YsUUFBUTtFQUNsRjtFQUdBLE9BQU87SUFBRSxHQUFHbkIsWUFBWTtJQUFFLEdBQUdlLGNBQWM7SUFBRSxHQUFHRixPQUFPO0lBQUV4RSxJQUFJLEVBQUVBO0VBQUssQ0FBQztBQUN6RTtBQUVPLFNBQVN5RSxxQkFBcUJBLENBQUNyRixJQUFJLEVBQUU7RUFDeEMsTUFBTTJGLElBQUksR0FBRztJQUVUL0UsSUFBSSxFQUFFWixJQUFJLENBQUNZLElBQUksSUFBSSxJQUFJO0lBRXZCNEQsV0FBVyxFQUFHeEUsSUFBSSxDQUFDNEYsQ0FBQyxJQUFJNUYsSUFBSSxDQUFDNkYsT0FBTyxJQUFJLElBQUk7SUFDNUNwQixXQUFXLEVBQUd6RSxJQUFJLENBQUM4RixDQUFDLElBQUk5RixJQUFJLENBQUMrRixNQUFNLElBQUksSUFBSTtJQUMzQ3JCLFNBQVMsRUFBRzFFLElBQUksQ0FBQzhGLENBQUMsSUFBSTlGLElBQUksQ0FBQytGLE1BQU0sSUFBSSxJQUFJO0lBQ3pDcEIsYUFBYSxFQUFFM0UsSUFBSSxDQUFDZ0csTUFBTSxHQUFHaEcsSUFBSSxDQUFDZ0csTUFBTSxLQUFLLE1BQU0sR0FBRyxJQUFJO0lBQzFEekUsVUFBVSxFQUFHdkIsSUFBSSxDQUFDaUcsQ0FBQyxHQUFHQyxRQUFRLENBQUNsRyxJQUFJLENBQUNpRyxDQUFDLENBQUMsR0FBSWpHLElBQUksQ0FBQ21HLElBQUksR0FBR0QsUUFBUSxDQUFDbEcsSUFBSSxDQUFDbUcsSUFBSSxDQUFDLEdBQUcsSUFBSztJQUNqRnRCLFNBQVMsRUFBRTdFLElBQUksQ0FBQ29HLE9BQU8sSUFBSSxJQUFJO0lBQy9CQyxNQUFNLEVBQUVyRyxJQUFJLENBQUNzRyxNQUFNLElBQUksSUFBSTtJQUMzQnhCLEtBQUssRUFBRTlFLElBQUksQ0FBQ3VHLENBQUMsSUFBSXZHLElBQUksQ0FBQzhFLEtBQUssSUFBSSxJQUFJO0lBQ25DMEIsa0JBQWtCLEVBQUV4RyxJQUFJLENBQUN5RyxNQUFNLElBQUl6RyxJQUFJLENBQUN5RyxNQUFNLEtBQUssTUFBTSxJQUFJO0VBQ2pFLENBQUM7RUFFRCxJQUFJekcsSUFBSSxDQUFDMEcsRUFBRSxJQUFJLE9BQU8xRyxJQUFJLENBQUMwRyxFQUFFLEtBQUssUUFBUSxJQUFJMUcsSUFBSSxDQUFDMEcsRUFBRSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQzlELE1BQU1DLGFBQWEsR0FBRzVHLElBQUksQ0FBQzBHLEVBQUUsQ0FBQ2xFLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDeENtRCxJQUFJLENBQUNULFNBQVMsR0FBRztNQUNiQyxTQUFTLEVBQUV5QjtJQUNmLENBQUM7SUFHRCxJQUFJNUcsSUFBSSxDQUFDNkcsRUFBRSxJQUFJLE9BQU83RyxJQUFJLENBQUM2RyxFQUFFLEtBQUssUUFBUSxJQUFJN0csSUFBSSxDQUFDNkcsRUFBRSxDQUFDRixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzlEaEIsSUFBSSxDQUFDVCxTQUFTLENBQUM0QixTQUFTLEdBQUc5RyxJQUFJLENBQUM2RyxFQUFFO0lBQ3RDO0VBQ0o7RUFFQSxJQUFJN0csSUFBSSxDQUFDK0csQ0FBQyxJQUFJL0csSUFBSSxDQUFDZ0gsS0FBSyxFQUFFO0lBQ3RCckIsSUFBSSxDQUFDdkUsVUFBVSxHQUFHO01BQ2RDLElBQUksRUFBRXJCLElBQUksQ0FBQytHLENBQUMsSUFBSS9HLElBQUksQ0FBQ2dILEtBQUssSUFBSSxJQUFJO01BQ2xDMUYsSUFBSSxFQUFFdEIsSUFBSSxDQUFDaUgsRUFBRSxJQUFJO0lBQ3JCLENBQUM7RUFDTDtFQUdBLElBQUlqSCxJQUFJLENBQUNrSCxLQUFLLElBQUksT0FBT2xILElBQUksQ0FBQ2tILEtBQUssS0FBSyxRQUFRLElBQUlsSCxJQUFJLENBQUNrSCxLQUFLLENBQUNQLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDdkUsTUFBTU8sS0FBSyxHQUFHbEgsSUFBSSxDQUFDa0gsS0FBSyxDQUFDMUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUNuQ21ELElBQUksQ0FBQ3VCLEtBQUssR0FBR0EsS0FBSztFQUN0QjtFQUVBLElBQUlsSCxJQUFJLENBQUNtSCxPQUFPLElBQUksT0FBT25ILElBQUksQ0FBQ21ILE9BQU8sS0FBSyxRQUFRLElBQUluSCxJQUFJLENBQUNtSCxPQUFPLENBQUNSLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDN0UsTUFBTVEsT0FBTyxHQUFHbkgsSUFBSSxDQUFDbUgsT0FBTyxDQUFDM0UsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN2Q21ELElBQUksQ0FBQ3dCLE9BQU8sR0FBR0EsT0FBTztFQUMxQjtFQUVBLE9BQU9DLG9CQUFvQixDQUFDekIsSUFBSSxDQUFDO0FBQ3JDO0FBRUEsU0FBU3lCLG9CQUFvQkEsQ0FBQ0MsR0FBRyxFQUFFO0VBQy9CLElBQUksT0FBT0EsR0FBRyxLQUFLLFFBQVEsRUFBRTtJQUN6QixPQUFPQSxHQUFHO0VBQ2Q7RUFDQSxNQUFNQyxLQUFLLEdBQUc7SUFBRSxHQUFHRDtFQUFJLENBQUM7RUFDeEIsTUFBTUUsSUFBSSxHQUFHekQsTUFBTSxDQUFDeUQsSUFBSSxDQUFDRixHQUFHLENBQUM7RUFDN0IsSUFBQXRFLGNBQU8sRUFBRXdFLElBQUksRUFBRUMsR0FBRyxJQUFJO0lBQ2xCLElBQUkxRCxNQUFNLENBQUNDLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNvRCxHQUFHLEVBQUVHLEdBQUcsQ0FBQyxLQUFLSCxHQUFHLENBQUNHLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSUgsR0FBRyxDQUFDRyxHQUFHLENBQUMsSUFBSUMsU0FBUyxDQUFDLEVBQUU7TUFDL0YsT0FBT0gsS0FBSyxDQUFDRSxHQUFHLENBQUM7SUFDckI7RUFDSixDQUFDLENBQUM7RUFDRixPQUFPRixLQUFLO0FBQ2hCO0FBRU8sU0FBU0ksaUJBQWlCQSxDQUFDQyxVQUFVLEVBQUVDLE9BQU8sRUFBRTtFQUNuRCxJQUFJOUYsR0FBRyxHQUFHOEYsT0FBTyxJQUFJeEUsT0FBTyxDQUFDdEIsR0FBRyxDQUFDLENBQUM7RUFFbEMsSUFBSSxPQUFPNkYsVUFBVyxLQUFLLFdBQVcsRUFBRTtJQUNwQ0EsVUFBVSxHQUFHN0YsR0FBRztFQUNwQixDQUFDLE1BRUk7SUFDRDZGLFVBQVUsR0FBRzFHLGFBQU0sQ0FBQzRHLFdBQVcsQ0FBQ0YsVUFBVSxFQUFFN0YsR0FBRyxDQUFDO0VBQ3BEO0VBRUEsSUFBSSxDQUFDQyxXQUFFLENBQUNDLFVBQVUsQ0FBQzJGLFVBQVUsQ0FBQyxFQUFFO0lBQzVCLE9BQU8sSUFBSTtFQUNmO0VBRUEsTUFBTUcsS0FBSyxHQUFHL0YsV0FBRSxDQUFDZ0csU0FBUyxDQUFDSixVQUFVLENBQUM7RUFDdEMsTUFBTUssVUFBVSxHQUFHRixLQUFLLENBQUNHLFdBQVcsQ0FBQyxDQUFDO0VBQ3RDLElBQUlDLGNBQWM7RUFDbEIsSUFBSUYsVUFBVSxFQUFFO0lBSVpsRyxHQUFHLEdBQUc4RixPQUFPLElBQUlELFVBQVU7SUFFM0JPLGNBQWMsR0FBRy9HLGFBQUksQ0FBQ1UsSUFBSSxDQUFDOEYsVUFBVSxFQUFFbEksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZFLElBQUksQ0FBQ3NDLFdBQUUsQ0FBQ0MsVUFBVSxDQUFDa0csY0FBYyxDQUFDLEVBQUU7TUFDaENBLGNBQWMsR0FBRy9HLGFBQUksQ0FBQ1UsSUFBSSxDQUFDOEYsVUFBVSxFQUFFbEksdUJBQXVCLEdBQUcsT0FBTyxDQUFDO01BQ3pFLElBQUksQ0FBQ3NDLFdBQUUsQ0FBQ0MsVUFBVSxDQUFDa0csY0FBYyxDQUFDLEVBQUU7UUFDaEMsT0FBTyxJQUFJO01BQ2Y7SUFDSjtFQUNKLENBQUMsTUFDSSxJQUFJUCxVQUFVLENBQUNRLFFBQVEsQ0FBQzFJLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxJQUFJa0ksVUFBVSxDQUFDUSxRQUFRLENBQUMxSSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsRUFBRTtJQUNySHlJLGNBQWMsR0FBR1AsVUFBVTtJQUMzQjdGLEdBQUcsR0FBRzZGLFVBQVUsR0FBR3hHLGFBQUksQ0FBQ2lILE9BQU8sQ0FBQ1QsVUFBVSxDQUFDO0VBQy9DLENBQUMsTUFDSTtJQUNEN0YsR0FBRyxHQUFHOEYsT0FBTyxJQUFJekcsYUFBSSxDQUFDaUgsT0FBTyxDQUFDVCxVQUFVLENBQUM7SUFDekNPLGNBQWMsR0FBRy9HLGFBQUksQ0FBQ1UsSUFBSSxDQUFDQyxHQUFHLEVBQUVyQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEUsSUFBSSxDQUFDc0MsV0FBRSxDQUFDQyxVQUFVLENBQUNrRyxjQUFjLENBQUMsRUFBRTtNQUNoQ0EsY0FBYyxHQUFHL0csYUFBSSxDQUFDVSxJQUFJLENBQUNDLEdBQUcsRUFBRXJDLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztNQUNsRSxJQUFJLENBQUNzQyxXQUFFLENBQUNDLFVBQVUsQ0FBQ2tHLGNBQWMsQ0FBQyxFQUFFO1FBQ2hDQSxjQUFjLEdBQUdULFNBQVM7TUFDOUI7SUFDSjtFQUNKO0VBQ0EsSUFBSSxDQUFDRSxVQUFVLEVBQUU7SUFDYixPQUFPLElBQUk7RUFDZjtFQUNBLE9BQU87SUFFSHhHLElBQUksRUFBRXdHLFVBQVU7SUFDaEI1RyxVQUFVLEVBQUVtSCxjQUFjO0lBRTFCcEcsR0FBRyxFQUFFQSxHQUFHLElBQUlYLGFBQUksQ0FBQ2lILE9BQU8sQ0FBQ1QsVUFBVSxDQUFDO0lBRXBDL0csSUFBSSxFQUFFSyxhQUFNLENBQUNvSCxxQkFBcUIsQ0FBQ1YsVUFBVSxDQUFDO0lBRTlDVyxRQUFRLEVBQUVuSCxhQUFJLENBQUNvSCxRQUFRLENBQUNaLFVBQVUsQ0FBQztJQUVuQ2pDLFFBQVEsRUFBRXZFLGFBQUksQ0FBQ29ILFFBQVEsQ0FBQ3BILGFBQUksQ0FBQ2lILE9BQU8sQ0FBQ1QsVUFBVSxDQUFDLENBQUM7SUFFakQ3RyxTQUFTLEVBQUVLLGFBQUksQ0FBQzZCLE9BQU8sQ0FBQzJFLFVBQVU7RUFDdEMsQ0FBQztBQUNMIiwiaWdub3JlTGlzdCI6W119
|