oxygen-cli 1.41.0 → 1.43.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 +16 -0
- package/build/core/OxygenCore.js +93 -283
- 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 +22 -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 +50 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +36 -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 +13 -84
- 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 +20 -41
- 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 +107 -217
- package/build/ox_modules/module-mongo.js +14 -51
- 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 +169 -233
- 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 +97 -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 +4 -92
- 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 +7 -121
- 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 +4 -1
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
require("source-map-support/register");
|
|
4
|
-
|
|
5
4
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
6
|
-
|
|
7
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
-
|
|
5
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
6
|
/*
|
|
10
7
|
* Copyright (C) 2015-present CloudBeat Limited
|
|
11
8
|
*
|
|
@@ -14,12 +11,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
14
11
|
* the Free Software Foundation, either version 3 of the License, or
|
|
15
12
|
* (at your option) any later version.
|
|
16
13
|
*/
|
|
17
|
-
const errHelper = require('../errors/helper');
|
|
18
14
|
|
|
15
|
+
const errHelper = require('../errors/helper');
|
|
19
16
|
const {
|
|
20
17
|
v1
|
|
21
18
|
} = require('uuid');
|
|
22
|
-
|
|
23
19
|
const providers = {
|
|
24
20
|
PERFECTO: 'perfecto',
|
|
25
21
|
BROWSERSTACK: 'browserstack',
|
|
@@ -34,32 +30,21 @@ const contextList = {
|
|
|
34
30
|
web: 'web'
|
|
35
31
|
};
|
|
36
32
|
const cmdsToOverwrite = ['$$', '$', 'addValue', 'clearValue', 'click', 'doubleClick', 'dragAndDrop', 'getAttribute', 'getCSSProperty', 'getComputedLabel', 'getComputedRole', 'getHTML', 'getLocation', 'getProperty', 'getSize', 'getTagName', 'getText', 'getValue', 'isClickable', 'isDisplayed', 'isDisplayedInViewport', 'isEnabled', 'isEqual', 'isExisting', 'isFocused', 'isSelected', 'moveTo', 'nextElement', 'parentElement', 'previousElement', 'react$$', 'react$', 'saveScreenshot', 'scrollIntoView', 'selectByAttribute', 'selectByIndex', 'selectByVisibleText', 'setValue', 'shadow$$', 'shadow$', 'touchAction', 'waitForClickable', 'waitForDisplayed', 'waitForEnabled', 'waitForExist', 'waitUntil'];
|
|
37
|
-
|
|
38
33
|
const isElementNotFound = el => {
|
|
39
34
|
let result = false;
|
|
40
|
-
|
|
41
|
-
if (el.error && (el.error.error === 'no such element' || el.error.message &&
|
|
42
|
-
/* winappdriver win.rightClick */
|
|
43
|
-
el.error.message.startsWith('no such element') || el.error.message &&
|
|
44
|
-
/* winappdriver */
|
|
45
|
-
el.error.message.startsWith('An element could not be located'))) {
|
|
35
|
+
if (el.error && (el.error.error === 'no such element' || el.error.message && /* winappdriver win.rightClick */el.error.message.startsWith('no such element') || el.error.message && /* winappdriver */el.error.message.startsWith('An element could not be located'))) {
|
|
46
36
|
result = true;
|
|
47
37
|
}
|
|
48
|
-
|
|
49
38
|
return result;
|
|
50
39
|
};
|
|
51
|
-
|
|
52
40
|
module.exports = {
|
|
53
41
|
matchPattern: function (val, pattern) {
|
|
54
42
|
if (!val && !pattern) {
|
|
55
43
|
return true;
|
|
56
44
|
}
|
|
57
|
-
|
|
58
45
|
var globToRegex = require('glob-to-regexp');
|
|
59
|
-
|
|
60
46
|
pattern = pattern.toString().replace(/\s+/g, ' ');
|
|
61
47
|
var regex;
|
|
62
|
-
|
|
63
48
|
if (pattern.indexOf('regex:') == 0) {
|
|
64
49
|
// match using a regular-expression
|
|
65
50
|
regex = new RegExp(pattern.substring('regex:'.length), 'g');
|
|
@@ -89,30 +74,23 @@ module.exports = {
|
|
|
89
74
|
if (timeout) {
|
|
90
75
|
await module.exports.setTimeoutImplicit.call(this, timeout);
|
|
91
76
|
}
|
|
92
|
-
|
|
93
77
|
var el;
|
|
94
|
-
|
|
95
78
|
if (locator && locator.constructor && locator.constructor.name === 'Element') {
|
|
96
79
|
el = locator;
|
|
97
80
|
} else {
|
|
98
81
|
locator = this.helpers.getWdioLocator(locator);
|
|
99
82
|
el = await this.driver.$(locator);
|
|
100
83
|
}
|
|
101
|
-
|
|
102
84
|
const elementNotFound = isElementNotFound(el);
|
|
103
|
-
|
|
104
85
|
if (elementNotFound) {
|
|
105
86
|
if (timeout) {
|
|
106
87
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
107
88
|
}
|
|
108
|
-
|
|
109
89
|
if (throwException) {
|
|
110
90
|
throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
|
|
111
91
|
}
|
|
112
|
-
|
|
113
92
|
return null;
|
|
114
93
|
}
|
|
115
|
-
|
|
116
94
|
if (waitForVisible) {
|
|
117
95
|
try {
|
|
118
96
|
await el.waitForDisplayed({
|
|
@@ -122,69 +100,55 @@ module.exports = {
|
|
|
122
100
|
if (timeout) {
|
|
123
101
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
124
102
|
}
|
|
125
|
-
|
|
126
103
|
if (throwException && e.message && e.message.includes('still not displayed')) {
|
|
127
104
|
throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
|
|
128
105
|
} else if (throwException) {
|
|
129
106
|
throw e;
|
|
130
107
|
}
|
|
131
|
-
|
|
132
108
|
return null;
|
|
133
109
|
}
|
|
134
110
|
}
|
|
135
|
-
|
|
136
111
|
if (timeout) {
|
|
137
112
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
138
113
|
}
|
|
139
|
-
|
|
140
114
|
return el;
|
|
141
115
|
},
|
|
142
116
|
getElements: async function (locator, timeout) {
|
|
143
117
|
if (timeout) {
|
|
144
118
|
await module.exports.setTimeoutImplicit.call(this, timeout);
|
|
145
119
|
}
|
|
146
|
-
|
|
147
120
|
let els = [];
|
|
148
|
-
|
|
149
121
|
try {
|
|
150
122
|
els = await this.driver.$$(this.helpers.getWdioLocator(locator));
|
|
151
123
|
} catch (e) {
|
|
152
124
|
const elementsNotFound = isElementNotFound(els);
|
|
153
|
-
|
|
154
|
-
|
|
125
|
+
if (elementsNotFound) {
|
|
126
|
+
// ignore errors
|
|
155
127
|
} else {
|
|
156
128
|
throw e;
|
|
157
129
|
}
|
|
158
130
|
}
|
|
159
|
-
|
|
160
131
|
if (timeout) {
|
|
161
132
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
162
133
|
}
|
|
163
|
-
|
|
164
134
|
return els;
|
|
165
135
|
},
|
|
166
136
|
getChildElement: async function (locator, parentElement, waitForVisible, timeout) {
|
|
167
137
|
if (timeout) {
|
|
168
138
|
await module.exports.setTimeoutImplicit.call(this, timeout);
|
|
169
139
|
}
|
|
170
|
-
|
|
171
140
|
locator = this.helpers.getWdioLocator(locator);
|
|
172
|
-
|
|
173
141
|
if (!(parentElement && parentElement.$)) {
|
|
174
142
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
|
|
175
143
|
}
|
|
176
|
-
|
|
177
144
|
var el = await parentElement.$(locator);
|
|
178
145
|
const elementNotFound = isElementNotFound(el);
|
|
179
|
-
|
|
180
146
|
if (elementNotFound) {
|
|
181
147
|
if (timeout) {
|
|
182
148
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
183
149
|
}
|
|
184
|
-
|
|
185
150
|
throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
|
|
186
151
|
}
|
|
187
|
-
|
|
188
152
|
if (waitForVisible) {
|
|
189
153
|
try {
|
|
190
154
|
await el.waitForDisplayed({
|
|
@@ -194,73 +158,60 @@ module.exports = {
|
|
|
194
158
|
if (timeout) {
|
|
195
159
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
196
160
|
}
|
|
197
|
-
|
|
198
161
|
if (e.message && e.message.includes('still not displayed')) {
|
|
199
162
|
throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
|
|
200
163
|
}
|
|
201
|
-
|
|
202
164
|
throw e;
|
|
203
165
|
}
|
|
204
166
|
}
|
|
205
|
-
|
|
206
167
|
if (timeout) {
|
|
207
168
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
208
169
|
}
|
|
209
|
-
|
|
210
170
|
return el;
|
|
211
171
|
},
|
|
212
172
|
getChildElements: async function (locator, parentElement, timeout) {
|
|
213
173
|
if (timeout) {
|
|
214
174
|
module.exports.setTimeoutImplicit.call(this, timeout);
|
|
215
175
|
}
|
|
216
|
-
|
|
217
176
|
locator = this.helpers.getWdioLocator(locator);
|
|
218
|
-
|
|
219
177
|
if (!(parentElement && parentElement.$$)) {
|
|
220
178
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
|
|
221
179
|
}
|
|
222
|
-
|
|
223
180
|
let els = [];
|
|
224
|
-
|
|
225
181
|
try {
|
|
226
182
|
els = await parentElement.$$(locator);
|
|
227
183
|
} catch (e) {
|
|
228
184
|
const elementsNotFound = isElementNotFound(els);
|
|
229
|
-
|
|
230
|
-
|
|
185
|
+
if (elementsNotFound) {
|
|
186
|
+
// ignore errors
|
|
231
187
|
} else {
|
|
232
188
|
throw e;
|
|
233
189
|
}
|
|
234
190
|
}
|
|
235
|
-
|
|
236
191
|
if (timeout) {
|
|
237
192
|
await module.exports.restoreTimeoutImplicit.call(this);
|
|
238
193
|
}
|
|
239
|
-
|
|
240
194
|
return els;
|
|
241
195
|
},
|
|
242
196
|
setTimeoutImplicit: async function (timeout) {
|
|
243
197
|
if (!this.driver) {
|
|
244
198
|
return;
|
|
245
199
|
}
|
|
246
|
-
|
|
247
200
|
if (this.driver.seleniumTimeout && timeout > this.driver.seleniumTimeout * 1000) {
|
|
248
201
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumTimeout * 1000}`);
|
|
249
202
|
}
|
|
250
|
-
|
|
251
203
|
if (this.driver.seleniumBrowserTimeout && timeout > this.driver.seleniumBrowserTimeout * 1000) {
|
|
252
204
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumBrowserTimeout * 1000}`);
|
|
253
205
|
}
|
|
254
|
-
|
|
255
206
|
let timeouts;
|
|
256
|
-
|
|
257
207
|
if (this.driver.capabilities && this.driver.capabilities.browserName === 'MicrosoftEdge') {
|
|
258
208
|
// not supported on Edge
|
|
259
209
|
return;
|
|
260
210
|
} else if (this.driver.getTimeouts) {
|
|
261
211
|
// chrome >= 75
|
|
262
212
|
try {
|
|
263
|
-
if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {
|
|
213
|
+
if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {
|
|
214
|
+
//ignore
|
|
264
215
|
} else {
|
|
265
216
|
timeouts = await this.driver.getTimeouts();
|
|
266
217
|
}
|
|
@@ -272,15 +223,12 @@ module.exports = {
|
|
|
272
223
|
// chrome >= 72 && chrome < 75
|
|
273
224
|
timeouts = this.driver.capabilities.timeouts;
|
|
274
225
|
}
|
|
275
|
-
|
|
276
226
|
if (timeouts && timeouts.implicit) {
|
|
277
227
|
this._prevImplicitTimeout = timeouts.implicit;
|
|
278
228
|
}
|
|
279
|
-
|
|
280
229
|
if (timeouts && timeouts.pageLoad) {
|
|
281
230
|
this._prevPageLoadTimeout = timeouts.pageLoad;
|
|
282
231
|
}
|
|
283
|
-
|
|
284
232
|
if (this.driver.setTimeout) {
|
|
285
233
|
if (this.driver.capabilities && this.driver.capabilities.browserName) {
|
|
286
234
|
// browserName 'default' on android
|
|
@@ -301,7 +249,6 @@ module.exports = {
|
|
|
301
249
|
'implicit': this._prevImplicitTimeout
|
|
302
250
|
});
|
|
303
251
|
}
|
|
304
|
-
|
|
305
252
|
if (this._prevPageLoadTimeout && this.driver.setTimeout) {
|
|
306
253
|
await this.driver.setTimeout({
|
|
307
254
|
'pageLoad': this._prevPageLoadTimeout
|
|
@@ -352,14 +299,15 @@ module.exports = {
|
|
|
352
299
|
assertContext: async function (...alowedContexts) {
|
|
353
300
|
var context = await this.driver.getContext();
|
|
354
301
|
const isWeb = context && (context.indexOf('WEBVIEW') > -1 || context.indexOf('CHROMIUM') > -1);
|
|
355
|
-
|
|
356
302
|
if (isWeb) {
|
|
357
|
-
if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {
|
|
303
|
+
if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {
|
|
304
|
+
// ignore, all is ok
|
|
358
305
|
} else {
|
|
359
306
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
|
|
360
307
|
}
|
|
361
308
|
} else {
|
|
362
|
-
if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {
|
|
309
|
+
if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {
|
|
310
|
+
// ignore, all is ok
|
|
363
311
|
} else {
|
|
364
312
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
|
|
365
313
|
}
|
|
@@ -368,15 +316,15 @@ module.exports = {
|
|
|
368
316
|
getWdioLocator: function (locator) {
|
|
369
317
|
if (!locator) throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');else if (typeof locator === 'object') return locator;else if (locator.indexOf('/') === 0) return locator; // leave xpath locator as is
|
|
370
318
|
else if (locator.indexOf('id=') === 0) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
319
|
+
// generate XPath instead of CSS for browser tests, since ID can contain illegal characters
|
|
320
|
+
// and escaping doesn't work reliably or in identical manner in all browser
|
|
321
|
+
if (this.driver.capabilities && this.driver.capabilities.browserName) {
|
|
322
|
+
return `//*[@id="${locator.substr('id='.length)}"]`;
|
|
323
|
+
} else {
|
|
324
|
+
return '#' + locator.substr('id='.length);
|
|
325
|
+
}
|
|
326
|
+
} else if (locator.indexOf('name=') === 0) return '[name="' + locator.substr('name='.length) + '"]';else if (locator.indexOf('link=') === 0) return '=' + locator.substr('link='.length);else if (locator.indexOf('link-contains=') === 0) return '*=' + locator.substr('link='.length);else if (locator.indexOf('css=') === 0) return locator.substr('css='.length); // in case of css, just remove css= prefix
|
|
327
|
+
else if (locator.indexOf('tag=') === 0) return '<' + locator.substr('tag='.length) + ' />';
|
|
380
328
|
return locator;
|
|
381
329
|
},
|
|
382
330
|
getLogTypes: function (context) {
|
|
@@ -391,7 +339,6 @@ module.exports = {
|
|
|
391
339
|
if (!wdioOpts || !wdioOpts.capabilities) {
|
|
392
340
|
return null;
|
|
393
341
|
}
|
|
394
|
-
|
|
395
342
|
if (wdioOpts.capabilities['perfectoMobile:options'] || wdioOpts.hostname && wdioOpts.hostname.includes('perfectomobile.com')) {
|
|
396
343
|
return providers.PERFECTO;
|
|
397
344
|
} else if (wdioOpts.capabilities['bstack:options']) {
|
|
@@ -403,7 +350,6 @@ module.exports = {
|
|
|
403
350
|
} else if (wdioOpts.capabilities['testingBot:options']) {
|
|
404
351
|
return providers.TESTINGBOT;
|
|
405
352
|
}
|
|
406
|
-
|
|
407
353
|
return null;
|
|
408
354
|
},
|
|
409
355
|
hasCircularDependency: function (obj) {
|
|
@@ -414,12 +360,10 @@ module.exports = {
|
|
|
414
360
|
return String(e);
|
|
415
361
|
}
|
|
416
362
|
}
|
|
417
|
-
|
|
418
363
|
return false;
|
|
419
364
|
},
|
|
420
365
|
assertCircular: function (obj) {
|
|
421
366
|
const hasCircularDependency = this.hasCircularDependency(obj);
|
|
422
|
-
|
|
423
367
|
if (hasCircularDependency) {
|
|
424
368
|
throw new _OxygenError.default(errHelper.errorCode.CIRCULAR_ERROR, hasCircularDependency);
|
|
425
369
|
}
|
|
@@ -434,17 +378,91 @@ module.exports = {
|
|
|
434
378
|
overwriteWdioCommands: async function (driver) {
|
|
435
379
|
// if element command is invoked directly from user script and error happens,
|
|
436
380
|
// it won't be caught and will lead to unhandledRejection (since it's executed in async manner without awaiting) and test results will be lost.
|
|
381
|
+
|
|
437
382
|
// e.g.
|
|
438
383
|
// var el = web.findElement('id=foo');
|
|
439
384
|
// el.click(); // if element is not visible then click will throw eventually
|
|
385
|
+
|
|
440
386
|
// therefore we wrap all wdio commands to make them execute synchronously.
|
|
441
387
|
// P.S. it would be better to disallow users from using wdio element commands directly since they are not displayed in logs or results.
|
|
442
388
|
// but we have no way determining whether command was executed from user script or from oxygen internals...
|
|
389
|
+
|
|
443
390
|
for (let cmd of cmdsToOverwrite) {
|
|
444
391
|
await driver.overwriteCommand(cmd, function (origFunc) {
|
|
445
392
|
return origFunc.apply(undefined, [].slice.call(arguments, 1));
|
|
446
393
|
}, true);
|
|
447
394
|
}
|
|
395
|
+
},
|
|
396
|
+
enrichProviderWdioOptions: function (providerName, wdioOpts) {
|
|
397
|
+
let name = 'name';
|
|
398
|
+
if (providerName === providers.PERFECTO) {
|
|
399
|
+
wdioOpts.capabilities.maxInstances = 1;
|
|
400
|
+
wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
|
|
401
|
+
wdioOpts.port = 80;
|
|
402
|
+
wdioOpts.protocol = 'http';
|
|
403
|
+
wdioOpts.openDeviceTimeout = 15;
|
|
404
|
+
delete wdioOpts.capabilities.manufacturer;
|
|
405
|
+
delete wdioOpts.capabilities.model;
|
|
406
|
+
delete wdioOpts.capabilities.browserName;
|
|
407
|
+
delete wdioOpts.capabilities.host;
|
|
408
|
+
name = wdioOpts.capabilities['perfectoMobile:options']['name'];
|
|
409
|
+
delete wdioOpts.capabilities['perfectoMobile:options'];
|
|
410
|
+
} else if (providerName === providers.BROWSERSTACK) {
|
|
411
|
+
const bsOptions = wdioOpts.capabilities['bstack:options'];
|
|
412
|
+
if (bsOptions) {
|
|
413
|
+
const deviceName = bsOptions.deviceName;
|
|
414
|
+
const osName = bsOptions.os;
|
|
415
|
+
if (deviceName) {
|
|
416
|
+
bsOptions.realMobile = true;
|
|
417
|
+
wdioOpts.capabilities['appium:deviceName'] = deviceName;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// for mobile browser test, both borwserName and appium:deviceName will be set
|
|
421
|
+
// however for BS to work it also expects bstack:options.deviceName
|
|
422
|
+
if (wdioOpts.capabilities.browserName && wdioOpts.capabilities['appium:deviceName']) {
|
|
423
|
+
bsOptions.deviceName = wdioOpts.capabilities['appium:deviceName'];
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// set automationName Appium capability
|
|
427
|
+
if (osName && osName.toLowerCase() === 'android') {
|
|
428
|
+
wdioOpts.capabilities.platformName = 'Android';
|
|
429
|
+
wdioOpts.capabilities['appium:automationName'] = 'UIAutomator2';
|
|
430
|
+
} else if (osName && osName.toLowerCase() === 'ios') {
|
|
431
|
+
wdioOpts.capabilities.platformName = 'iOS';
|
|
432
|
+
wdioOpts.capabilities['appium:automationName'] = 'XCUITest';
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// merge user-provided BS options into the final options object
|
|
436
|
+
for (const capName in wdioOpts.capabilities) {
|
|
437
|
+
if (capName.startsWith('bstack:')) {
|
|
438
|
+
const bsCapName = capName.substring('bstack:'.length);
|
|
439
|
+
if (bsCapName === 'options') {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// for backward compatibility... needs to be removed eventually
|
|
444
|
+
if (bsCapName === 'recordVideo') {
|
|
445
|
+
bsOptions.video = wdioOpts.capabilities[capName];
|
|
446
|
+
delete wdioOpts.capabilities[capName];
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
bsOptions[bsCapName] = wdioOpts.capabilities[capName];
|
|
450
|
+
delete wdioOpts.capabilities[capName];
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
} else if (wdioOpts.capabilities['lambda:options'] && wdioOpts.capabilities['lambda:options']['name']) {
|
|
455
|
+
name = wdioOpts.capabilities['lambda:options']['name'];
|
|
456
|
+
delete wdioOpts.capabilities['lambda:options'];
|
|
457
|
+
} else if (wdioOpts.capabilities['testingBot:options'] && wdioOpts.capabilities['testingBot:options']['name']) {
|
|
458
|
+
name = wdioOpts.capabilities['testingBot:options']['name'];
|
|
459
|
+
delete wdioOpts.capabilities['testingBot:options'];
|
|
460
|
+
}
|
|
461
|
+
if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
|
|
462
|
+
name = wdioOpts.capabilities['bstack:options']['name'];
|
|
463
|
+
delete wdioOpts.capabilities['bstack:options'];
|
|
464
|
+
}
|
|
465
|
+
return name;
|
|
448
466
|
}
|
|
449
467
|
};
|
|
450
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sIm5hbWVzIjpbImVyckhlbHBlciIsInJlcXVpcmUiLCJ2MSIsInByb3ZpZGVycyIsIlBFUkZFQ1RPIiwiQlJPV1NFUlNUQUNLIiwiU0FVQ0VMQUJTIiwiTEFNQkRBVEVTVCIsIlRFU1RJTkdCT1QiLCJjb250ZXh0TGlzdCIsImFuZHJvaWQiLCJpb3MiLCJoeWJyaWQiLCJ3ZWIiLCJjbWRzVG9PdmVyd3JpdGUiLCJpc0VsZW1lbnROb3RGb3VuZCIsImVsIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRzV2l0aCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtYXRjaFBhdHRlcm4iLCJ2YWwiLCJwYXR0ZXJuIiwiZ2xvYlRvUmVnZXgiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJyZWdleCIsImluZGV4T2YiLCJSZWdFeHAiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJ0ZXN0IiwiZmxhZ3MiLCJnZXRFbGVtZW50IiwibG9jYXRvciIsIndhaXRGb3JWaXNpYmxlIiwidGltZW91dCIsInRocm93RXhjZXB0aW9uIiwic2V0VGltZW91dEltcGxpY2l0IiwiY2FsbCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImhlbHBlcnMiLCJnZXRXZGlvTG9jYXRvciIsImRyaXZlciIsIiQiLCJlbGVtZW50Tm90Rm91bmQiLCJyZXN0b3JlVGltZW91dEltcGxpY2l0IiwiT3hFcnJvciIsImVycm9yQ29kZSIsIkVMRU1FTlRfTk9UX0ZPVU5EIiwid2FpdEZvckRpc3BsYXllZCIsIndhaXRGb3JUaW1lb3V0IiwiZSIsImluY2x1ZGVzIiwiRUxFTUVOVF9OT1RfVklTSUJMRSIsImdldEVsZW1lbnRzIiwiZWxzIiwiJCQiLCJlbGVtZW50c05vdEZvdW5kIiwiZ2V0Q2hpbGRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsIlNDUklQVF9FUlJPUiIsImdldENoaWxkRWxlbWVudHMiLCJzZWxlbml1bVRpbWVvdXQiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0IiwidGltZW91dHMiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsImdldFRpbWVvdXRzIiwic3RvcFVybCIsImNvbnNvbGUiLCJsb2ciLCJpbXBsaWNpdCIsIl9wcmV2SW1wbGljaXRUaW1lb3V0IiwicGFnZUxvYWQiLCJfcHJldlBhZ2VMb2FkVGltZW91dCIsInNldFRpbWVvdXQiLCJhc3NlcnRBcmd1bWVudCIsImFyZyIsInVuZGVmaW5lZCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImFsb3dlZENvbnRleHRzIiwiY29udGV4dCIsImdldENvbnRleHQiLCJpc1dlYiIsInN1YnN0ciIsImdldExvZ1R5cGVzIiwicHJvdmlkZXIiLCJkZXRlcm1pbmVQcm92aWRlciIsIndkaW9PcHRzIiwiaG9zdG5hbWUiLCJoYXNDaXJjdWxhckRlcGVuZGVuY3kiLCJvYmoiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiYXNzZXJ0Q2lyY3VsYXIiLCJDSVJDVUxBUl9FUlJPUiIsIm5ld1ZpZGVvQXR0YWNobWVudCIsImZpbGVOYW1lIiwidmlkZW9VcmwiLCJpZCIsInR5cGUiLCJzdWJ0eXBlIiwiX3VybCIsIm92ZXJ3cml0ZVdkaW9Db21tYW5kcyIsImNtZCIsIm92ZXJ3cml0ZUNvbW1hbmQiLCJvcmlnRnVuYyIsImFwcGx5Iiwic2xpY2UiLCJhcmd1bWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFVQTs7OztBQVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUF6Qjs7QUFF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VUFBVUUsUUFBVixFQUFvQjtBQUNuRCxlQUFPQSxRQUFRLENBQUNDLEtBQVQsQ0FBZXJDLFNBQWYsRUFBMEIsR0FBR3NDLEtBQUgsQ0FBUy9FLElBQVQsQ0FBY2dGLFNBQWQsRUFBeUIsQ0FBekIsQ0FBMUIsQ0FBUDtBQUNILE9BRkssRUFFSCxJQUZHLENBQU47QUFHSDtBQUNKO0FBaGFZLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmNvbnN0IHsgdjEgfSA9IHJlcXVpcmUoJ3V1aWQnKTtcclxuXHJcbmNvbnN0IHByb3ZpZGVycyA9IHtcclxuICAgIFBFUkZFQ1RPOiAncGVyZmVjdG8nLFxyXG4gICAgQlJPV1NFUlNUQUNLOiAnYnJvd3NlcnN0YWNrJyxcclxuICAgIFNBVUNFTEFCUzogJ3NhdWNlJyxcclxuICAgIExBTUJEQVRFU1Q6ICdsYW1iZGEnLFxyXG4gICAgVEVTVElOR0JPVDogJ3Rlc3Rpbmdib3QnXHJcbn07XHJcblxyXG5jb25zdCBjb250ZXh0TGlzdCA9IHtcclxuICAgIGFuZHJvaWQ6ICdhbmRyb2lkJyxcclxuICAgIGlvczogJ2lvcycsXHJcbiAgICBoeWJyaWQ6ICdoeWJyaWQnLFxyXG4gICAgd2ViOiAnd2ViJ1xyXG59O1xyXG5cclxuY29uc3QgY21kc1RvT3ZlcndyaXRlID0gWyckJCcsICckJywnYWRkVmFsdWUnLCdjbGVhclZhbHVlJywnY2xpY2snLCdkb3VibGVDbGljaycsJ2RyYWdBbmREcm9wJywnZ2V0QXR0cmlidXRlJywnZ2V0Q1NTUHJvcGVydHknLCdnZXRDb21wdXRlZExhYmVsJywnZ2V0Q29tcHV0ZWRSb2xlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRIVE1MJywnZ2V0TG9jYXRpb24nLCdnZXRQcm9wZXJ0eScsJ2dldFNpemUnLCdnZXRUYWdOYW1lJywnZ2V0VGV4dCcsJ2dldFZhbHVlJywnaXNDbGlja2FibGUnLCdpc0Rpc3BsYXllZCcsJ2lzRGlzcGxheWVkSW5WaWV3cG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFbmFibGVkJywnaXNFcXVhbCcsJ2lzRXhpc3RpbmcnLCdpc0ZvY3VzZWQnLCdpc1NlbGVjdGVkJywnbW92ZVRvJywnbmV4dEVsZW1lbnQnLCdwYXJlbnRFbGVtZW50JywncHJldmlvdXNFbGVtZW50JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICdyZWFjdCQkJywncmVhY3QkJywnc2F2ZVNjcmVlbnNob3QnLCdzY3JvbGxJbnRvVmlldycsJ3NlbGVjdEJ5QXR0cmlidXRlJywnc2VsZWN0QnlJbmRleCcsJ3NlbGVjdEJ5VmlzaWJsZVRleHQnLCdzZXRWYWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhZG93JCQnLCdzaGFkb3ckJywndG91Y2hBY3Rpb24nLCd3YWl0Rm9yQ2xpY2thYmxlJywnd2FpdEZvckRpc3BsYXllZCcsJ3dhaXRGb3JFbmFibGVkJywnd2FpdEZvckV4aXN0Jywnd2FpdFVudGlsJ107XHJcblxyXG5jb25zdCBpc0VsZW1lbnROb3RGb3VuZCA9IChlbCkgPT4ge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICAgIGVsLmVycm9yICYmIChcclxuICAgICAgICBlbC5lcnJvci5lcnJvciA9PT0gJ25vIHN1Y2ggZWxlbWVudCcgfHxcclxuICAgICAgICAoZWwuZXJyb3IubWVzc2FnZSAmJiAvKiB3aW5hcHBkcml2ZXIgd2luLnJpZ2h0Q2xpY2sgKi8gZWwuZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKCdubyBzdWNoIGVsZW1lbnQnKSB8fFxyXG4gICAgICAgIGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCcpKSlcclxuICAgICkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBtYXRjaFBhdHRlcm46IGZ1bmN0aW9uKHZhbCwgcGF0dGVybikge1xyXG4gICAgICAgIGlmICghdmFsICYmICFwYXR0ZXJuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdsb2JUb1JlZ2V4ID0gcmVxdWlyZSgnZ2xvYi10by1yZWdleHAnKTtcclxuICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcclxuXHJcbiAgICAgICAgdmFyIHJlZ2V4O1xyXG4gICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4OicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB1c2luZyBhIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4OicubGVuZ3RoKSwgJ2cnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZigncmVnZXhpOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4aTonLmxlbmd0aCksICdpZycpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdleGFjdDonKSA9PSAwIHx8IHBhdHRlcm4gPT09ICcnKSB7ICAvLyBtYXRjaCBhIHN0cmluZyBleGFjdGx5LCB2ZXJiYXRpbVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybi5zdWJzdHJpbmcoJ2V4YWN0OicubGVuZ3RoKSA9PT0gdmFsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdnbG9iOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBhZ2FpbnN0IGEgY2FzZS1pbnNlbnNpdGl2ZSBcImdsb2JcIiBwYXR0ZXJuXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybi5zdWJzdHJpbmcoJ2dsb2I6Jy5sZW5ndGgpLCB7IGZsYWdzOiAnaWcnIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwcmVmaXggc2FtZSBhcyBnbG9iIG1hdGNoaW5nXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybiwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEVsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHdhaXRGb3JWaXNpYmxlLCB0aW1lb3V0LCB0aHJvd0V4Y2VwdGlvbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbDtcclxuICAgICAgICBpZiAobG9jYXRvciAmJiBsb2NhdG9yLmNvbnN0cnVjdG9yICYmIGxvY2F0b3IuY29uc3RydWN0b3IubmFtZSA9PT0gJ0VsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIGVsID0gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2NhdG9yID0gdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpO1xyXG4gICAgICAgICAgICBlbCA9IGF3YWl0IHRoaXMuZHJpdmVyLiQobG9jYXRvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50Tm90Rm91bmQgPSBpc0VsZW1lbnROb3RGb3VuZChlbCk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnROb3RGb3VuZCkge1xyXG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6dGltZW91dCA/IHRpbWVvdXQgOiB0aGlzLndhaXRGb3JUaW1lb3V0fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRocm93RXhjZXB0aW9uICYmIGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0aWxsIG5vdCBkaXNwbGF5ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfVklTSUJMRSwgYEVsZW1lbnQgbm90IHZpc2libGU6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocm93RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEVsZW1lbnRzOiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZWxzID0gW107XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVscyA9IGF3YWl0IHRoaXMuZHJpdmVyLiQkKHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c05vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWxzKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzTm90Rm91bmQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxzO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDaGlsZEVsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHBhcmVudEVsZW1lbnQsIHdhaXRGb3JWaXNpYmxlLCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhdG9yID0gdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpO1xyXG5cclxuICAgICAgICBpZiAoIShwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQuJCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gcGFyZW50RWxlbWVudCwgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbCA9IGF3YWl0IHBhcmVudEVsZW1lbnQuJChsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudE5vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWwpO1xyXG4gICAgICAgIGlmIChlbGVtZW50Tm90Rm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX0ZPVU5ELCBgVW5hYmxlIHRvIGZpbmQgZWxlbWVudDogJHtsb2NhdG9yfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdhaXRGb3JWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBlbC53YWl0Rm9yRGlzcGxheWVkKHsgdGltZW91dDogdGltZW91dCA/IHRpbWVvdXQgOiB0aGlzLndhaXRGb3JUaW1lb3V0fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0aWxsIG5vdCBkaXNwbGF5ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfVklTSUJMRSwgYEVsZW1lbnQgbm90IHZpc2libGU6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hpbGRFbGVtZW50czogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgcGFyZW50RWxlbWVudCwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKCEocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LiQkKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBwYXJlbnRFbGVtZW50LCBtdXN0IGJlIGEgdmFsaWQgZWxlbWVudCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVscyA9IFtdO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVscyA9IGF3YWl0IHBhcmVudEVsZW1lbnQuJCQobG9jYXRvcik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c05vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWxzKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzTm90Rm91bmQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbHM7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFRpbWVvdXRJbXBsaWNpdDogYXN5bmMgZnVuY3Rpb24odGltZW91dCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAmJiB0aW1lb3V0ID4gdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICogMTAwMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYHRpbWVvdXQgbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgKiAxMDAwfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAmJiB0aW1lb3V0ID4gdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAqIDEwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGB0aW1lb3V0IG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAqIDEwMDB9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZW91dHM7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gJ01pY3Jvc29mdEVkZ2UnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgb24gRWRnZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5nZXRUaW1lb3V0cykge1xyXG4gICAgICAgICAgICAvLyBjaHJvbWUgPj0gNzVcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuc3RvcFVybCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5zdG9wVXJsLmluY2x1ZGVzKCdwZXJmZWN0b21vYmlsZS5jb20nKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dHMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRUaW1lb3V0cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmYWlscyBvbiBwZXJmZWN0byBtb2JpbGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXRUaW1lb3V0cyBlcnJvcicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiYgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnRpbWVvdXRzKSB7XHJcbiAgICAgICAgICAgIC8vIGNocm9tZSA+PSA3MiAmJiBjaHJvbWUgPCA3NVxyXG4gICAgICAgICAgICB0aW1lb3V0cyA9IHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy50aW1lb3V0cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0cyAmJiB0aW1lb3V0cy5pbXBsaWNpdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0ID0gdGltZW91dHMuaW1wbGljaXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lb3V0cyAmJiB0aW1lb3V0cy5wYWdlTG9hZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0ID0gdGltZW91dHMucGFnZUxvYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiYgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBicm93c2VyTmFtZSAnZGVmYXVsdCcgb24gYW5kcm9pZCBcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCc6IHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3BhZ2VMb2FkJzogdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc3RvcmVUaW1lb3V0SW1wbGljaXQ6IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0ICYmIHRoaXMuZHJpdmVyLnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7ICdpbXBsaWNpdCc6IHRoaXMuX3ByZXZJbXBsaWNpdFRpbWVvdXQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0ICYmIHRoaXMuZHJpdmVyLnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7ICdwYWdlTG9hZCc6IHRoaXMuX3ByZXZQYWdlTG9hZFRpbWVvdXQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBpcyByZXF1aXJlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudFN0cmluZzogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIHN0cmluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50TnVtYmVyOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG51bWJlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInIHx8IGFyZyA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudEJvb2w6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPSB0eXBlb2YodHJ1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIHRydWUgb3IgZmFsc2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKGFyZykgIT0gdHlwZW9mKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSB0cnVlIG9yIGZhbHNlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50VGltZW91dDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInIHx8IGFyZyA8IDApKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbiBuZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY29udGV4dExpc3Q6IGNvbnRleHRMaXN0LFxyXG5cclxuICAgIGFzc2VydENvbnRleHQ6IGFzeW5jIGZ1bmN0aW9uKC4uLmFsb3dlZENvbnRleHRzKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRDb250ZXh0KCk7XHJcbiAgICAgICAgY29uc3QgaXNXZWIgPSAoY29udGV4dCAmJiAoY29udGV4dC5pbmRleE9mKCdXRUJWSUVXJykgPiAtMSB8fCBjb250ZXh0LmluZGV4T2YoJ0NIUk9NSVVNJykgPiAtMSkpO1xyXG5cclxuICAgICAgICBpZiAoaXNXZWIpIHtcclxuICAgICAgICAgICAgaWYgKGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LndlYikgfHwgYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuaHlicmlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhbGwgaXMgb2tcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBjb250ZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuYW5kcm9pZCkgfHwgYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuaW9zKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhbGwgaXMgb2tcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBjb250ZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFdkaW9Mb2NhdG9yOiBmdW5jdGlvbihsb2NhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFsb2NhdG9yKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBsb2NhdG9yIG5vdCBzcGVjaWZpZWQnKTtcclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG9jYXRvciA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignLycpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSB4cGF0aCBsb2NhdG9yIGFzIGlzXHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBYUGF0aCBpbnN0ZWFkIG9mIENTUyBmb3IgYnJvd3NlciB0ZXN0cywgc2luY2UgSUQgY2FuIGNvbnRhaW4gaWxsZWdhbCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgICAgIC8vIGFuZCBlc2NhcGluZyBkb2Vzbid0IHdvcmsgcmVsaWFibHkgb3IgaW4gaWRlbnRpY2FsIG1hbm5lciBpbiBhbGwgYnJvd3NlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAvLypbQGlkPVwiJHtsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpfVwiXWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyMnICsgbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ25hbWU9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnW25hbWU9XCInICsgbG9jYXRvci5zdWJzdHIoJ25hbWU9Jy5sZW5ndGgpICsgJ1wiXSc7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJz0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluay1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICcqPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yLnN1YnN0cignY3NzPScubGVuZ3RoKTsgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgY3NzLCBqdXN0IHJlbW92ZSBjc3M9IHByZWZpeFxyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGFnPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJzwnICsgbG9jYXRvci5zdWJzdHIoJ3RhZz0nLmxlbmd0aCkgKyAnIC8+JztcclxuXHJcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldExvZ1R5cGVzOiBmdW5jdGlvbihjb250ZXh0KSB7XHJcbiAgICAgICAgaWYgKGNvbnRleHQgPT09ICdOQVRJVkVfQVBQJykge1xyXG4gICAgICAgICAgICByZXR1cm4gWydsb2djYXQnLCAnYnVncmVwb3J0JywgJ3NlcnZlciddO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbJ2Jyb3dzZXInLCAnZHJpdmVyJ107XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBwcm92aWRlcjogcHJvdmlkZXJzLFxyXG5cclxuICAgIGRldGVybWluZVByb3ZpZGVyOiBmdW5jdGlvbih3ZGlvT3B0cykge1xyXG4gICAgICAgIGlmICghd2Rpb09wdHMgfHwgIXdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSB8fCAod2Rpb09wdHMuaG9zdG5hbWUgJiYgd2Rpb09wdHMuaG9zdG5hbWUuaW5jbHVkZXMoJ3BlcmZlY3RvbW9iaWxlLmNvbScpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLlBFUkZFQ1RPO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuQlJPV1NFUlNUQUNLO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5TQVVDRUxBQlM7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5ob3N0bmFtZS5pbmNsdWRlcygnbGFtYmRhdGVzdCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuTEFNQkRBVEVTVDtcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5URVNUSU5HQk9UO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGhhc0NpcmN1bGFyRGVwZW5kZW5jeTogZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9iaik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoU3RyaW5nKGUpLmluY2x1ZGVzKCdDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRDaXJjdWxhcjogZnVuY3Rpb24ob2JqKSB7XHJcbiAgICAgICAgY29uc3QgaGFzQ2lyY3VsYXJEZXBlbmRlbmN5ID0gdGhpcy5oYXNDaXJjdWxhckRlcGVuZGVuY3kob2JqKTtcclxuICAgICAgICBpZiAoaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQ0lSQ1VMQVJfRVJST1IsIGhhc0NpcmN1bGFyRGVwZW5kZW5jeSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBuZXdWaWRlb0F0dGFjaG1lbnQ6IChmaWxlTmFtZSwgdmlkZW9VcmwpID0+ICh7XHJcbiAgICAgICAgaWQ6IHYxKCksXHJcbiAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgdHlwZTogJ3ZpZGVvJyxcclxuICAgICAgICBzdWJ0eXBlOiAnc2NyZWVuY2FzdCcsXHJcbiAgICAgICAgX3VybDogdmlkZW9VcmwsXHJcbiAgICB9KSxcclxuXHJcbiAgICBvdmVyd3JpdGVXZGlvQ29tbWFuZHM6IGFzeW5jIGZ1bmN0aW9uKGRyaXZlcikge1xyXG4gICAgICAgIC8vIGlmIGVsZW1lbnQgY29tbWFuZCBpcyBpbnZva2VkIGRpcmVjdGx5IGZyb20gdXNlciBzY3JpcHQgYW5kIGVycm9yIGhhcHBlbnMsXHJcbiAgICAgICAgLy8gaXQgd29uJ3QgYmUgY2F1Z2h0IGFuZCB3aWxsIGxlYWQgdG8gdW5oYW5kbGVkUmVqZWN0aW9uIChzaW5jZSBpdCdzIGV4ZWN1dGVkIGluIGFzeW5jIG1hbm5lciB3aXRob3V0IGF3YWl0aW5nKSBhbmQgdGVzdCByZXN1bHRzIHdpbGwgYmUgbG9zdC5cclxuXHJcbiAgICAgICAgLy8gZS5nLlxyXG4gICAgICAgIC8vIHZhciBlbCA9IHdlYi5maW5kRWxlbWVudCgnaWQ9Zm9vJyk7XHJcbiAgICAgICAgLy8gZWwuY2xpY2soKTsgLy8gaWYgZWxlbWVudCBpcyBub3QgdmlzaWJsZSB0aGVuIGNsaWNrIHdpbGwgdGhyb3cgZXZlbnR1YWxseVxyXG5cclxuICAgICAgICAvLyB0aGVyZWZvcmUgd2Ugd3JhcCBhbGwgd2RpbyBjb21tYW5kcyB0byBtYWtlIHRoZW0gZXhlY3V0ZSBzeW5jaHJvbm91c2x5LlxyXG4gICAgICAgIC8vIFAuUy4gaXQgd291bGQgYmUgYmV0dGVyIHRvIGRpc2FsbG93IHVzZXJzIGZyb20gdXNpbmcgd2RpbyBlbGVtZW50IGNvbW1hbmRzIGRpcmVjdGx5IHNpbmNlIHRoZXkgYXJlIG5vdCBkaXNwbGF5ZWQgaW4gbG9ncyBvciByZXN1bHRzLlxyXG4gICAgICAgIC8vIGJ1dCB3ZSBoYXZlIG5vIHdheSBkZXRlcm1pbmluZyB3aGV0aGVyIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZyb20gdXNlciBzY3JpcHQgb3IgZnJvbSBveHlnZW4gaW50ZXJuYWxzLi4uXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNtZCBvZiBjbWRzVG9PdmVyd3JpdGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHJpdmVyLm92ZXJ3cml0ZUNvbW1hbmQoY21kLCBmdW5jdGlvbiAob3JpZ0Z1bmMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnRnVuYy5hcHBseSh1bmRlZmluZWQsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XHJcbiAgICAgICAgICAgIH0sIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuIl19
|
|
468
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuRXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImVyckhlbHBlciIsInYxIiwicHJvdmlkZXJzIiwiUEVSRkVDVE8iLCJCUk9XU0VSU1RBQ0siLCJTQVVDRUxBQlMiLCJMQU1CREFURVNUIiwiVEVTVElOR0JPVCIsImNvbnRleHRMaXN0IiwiYW5kcm9pZCIsImlvcyIsImh5YnJpZCIsIndlYiIsImNtZHNUb092ZXJ3cml0ZSIsImlzRWxlbWVudE5vdEZvdW5kIiwiZWwiLCJyZXN1bHQiLCJlcnJvciIsIm1lc3NhZ2UiLCJzdGFydHNXaXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1hdGNoUGF0dGVybiIsInZhbCIsInBhdHRlcm4iLCJnbG9iVG9SZWdleCIsInRvU3RyaW5nIiwicmVwbGFjZSIsInJlZ2V4IiwiaW5kZXhPZiIsIlJlZ0V4cCIsInN1YnN0cmluZyIsImxlbmd0aCIsInRlc3QiLCJmbGFncyIsImdldEVsZW1lbnQiLCJsb2NhdG9yIiwid2FpdEZvclZpc2libGUiLCJ0aW1lb3V0IiwidGhyb3dFeGNlcHRpb24iLCJzZXRUaW1lb3V0SW1wbGljaXQiLCJjYWxsIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaGVscGVycyIsImdldFdkaW9Mb2NhdG9yIiwiZHJpdmVyIiwiJCIsImVsZW1lbnROb3RGb3VuZCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiRUxFTUVOVF9OT1RfRk9VTkQiLCJ3YWl0Rm9yRGlzcGxheWVkIiwid2FpdEZvclRpbWVvdXQiLCJpbmNsdWRlcyIsIkVMRU1FTlRfTk9UX1ZJU0lCTEUiLCJnZXRFbGVtZW50cyIsImVscyIsIiQkIiwiZWxlbWVudHNOb3RGb3VuZCIsImdldENoaWxkRWxlbWVudCIsInBhcmVudEVsZW1lbnQiLCJTQ1JJUFRfRVJST1IiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2VsZW5pdW1UaW1lb3V0Iiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInRpbWVvdXRzIiwiY2FwYWJpbGl0aWVzIiwiYnJvd3Nlck5hbWUiLCJnZXRUaW1lb3V0cyIsInN0b3BVcmwiLCJjb25zb2xlIiwibG9nIiwiaW1wbGljaXQiLCJfcHJldkltcGxpY2l0VGltZW91dCIsInBhZ2VMb2FkIiwiX3ByZXZQYWdlTG9hZFRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiYXNzZXJ0QXJndW1lbnQiLCJhcmciLCJ1bmRlZmluZWQiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydENvbnRleHQiLCJhbG93ZWRDb250ZXh0cyIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiaXNXZWIiLCJzdWJzdHIiLCJnZXRMb2dUeXBlcyIsInByb3ZpZGVyIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJ3ZGlvT3B0cyIsImhvc3RuYW1lIiwiaGFzQ2lyY3VsYXJEZXBlbmRlbmN5Iiwib2JqIiwiSlNPTiIsInN0cmluZ2lmeSIsIlN0cmluZyIsImFzc2VydENpcmN1bGFyIiwiQ0lSQ1VMQVJfRVJST1IiLCJuZXdWaWRlb0F0dGFjaG1lbnQiLCJmaWxlTmFtZSIsInZpZGVvVXJsIiwiaWQiLCJ0eXBlIiwic3VidHlwZSIsIl91cmwiLCJvdmVyd3JpdGVXZGlvQ29tbWFuZHMiLCJjbWQiLCJvdmVyd3JpdGVDb21tYW5kIiwib3JpZ0Z1bmMiLCJhcHBseSIsInNsaWNlIiwiYXJndW1lbnRzIiwiZW5yaWNoUHJvdmlkZXJXZGlvT3B0aW9ucyIsInByb3ZpZGVyTmFtZSIsIm1heEluc3RhbmNlcyIsInBhdGgiLCJwb3J0IiwicHJvdG9jb2wiLCJvcGVuRGV2aWNlVGltZW91dCIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwiaG9zdCIsImJzT3B0aW9ucyIsImRldmljZU5hbWUiLCJvc05hbWUiLCJvcyIsInJlYWxNb2JpbGUiLCJ0b0xvd2VyQ2FzZSIsInBsYXRmb3JtTmFtZSIsImNhcE5hbWUiLCJic0NhcE5hbWUiLCJ2aWRlbyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuY29uc3QgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5jb25zdCB7IHYxIH0gPSByZXF1aXJlKCd1dWlkJyk7XHJcblxyXG5jb25zdCBwcm92aWRlcnMgPSB7XHJcbiAgICBQRVJGRUNUTzogJ3BlcmZlY3RvJyxcclxuICAgIEJST1dTRVJTVEFDSzogJ2Jyb3dzZXJzdGFjaycsXHJcbiAgICBTQVVDRUxBQlM6ICdzYXVjZScsXHJcbiAgICBMQU1CREFURVNUOiAnbGFtYmRhJyxcclxuICAgIFRFU1RJTkdCT1Q6ICd0ZXN0aW5nYm90J1xyXG59O1xyXG5cclxuY29uc3QgY29udGV4dExpc3QgPSB7XHJcbiAgICBhbmRyb2lkOiAnYW5kcm9pZCcsXHJcbiAgICBpb3M6ICdpb3MnLFxyXG4gICAgaHlicmlkOiAnaHlicmlkJyxcclxuICAgIHdlYjogJ3dlYidcclxufTtcclxuXHJcbmNvbnN0IGNtZHNUb092ZXJ3cml0ZSA9IFsnJCQnLCAnJCcsJ2FkZFZhbHVlJywnY2xlYXJWYWx1ZScsJ2NsaWNrJywnZG91YmxlQ2xpY2snLCdkcmFnQW5kRHJvcCcsJ2dldEF0dHJpYnV0ZScsJ2dldENTU1Byb3BlcnR5JywnZ2V0Q29tcHV0ZWRMYWJlbCcsJ2dldENvbXB1dGVkUm9sZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0SFRNTCcsJ2dldExvY2F0aW9uJywnZ2V0UHJvcGVydHknLCdnZXRTaXplJywnZ2V0VGFnTmFtZScsJ2dldFRleHQnLCdnZXRWYWx1ZScsJ2lzQ2xpY2thYmxlJywnaXNEaXNwbGF5ZWQnLCdpc0Rpc3BsYXllZEluVmlld3BvcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRW5hYmxlZCcsJ2lzRXF1YWwnLCdpc0V4aXN0aW5nJywnaXNGb2N1c2VkJywnaXNTZWxlY3RlZCcsJ21vdmVUbycsJ25leHRFbGVtZW50JywncGFyZW50RWxlbWVudCcsJ3ByZXZpb3VzRWxlbWVudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAncmVhY3QkJCcsJ3JlYWN0JCcsJ3NhdmVTY3JlZW5zaG90Jywnc2Nyb2xsSW50b1ZpZXcnLCdzZWxlY3RCeUF0dHJpYnV0ZScsJ3NlbGVjdEJ5SW5kZXgnLCdzZWxlY3RCeVZpc2libGVUZXh0Jywnc2V0VmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYWRvdyQkJywnc2hhZG93JCcsJ3RvdWNoQWN0aW9uJywnd2FpdEZvckNsaWNrYWJsZScsJ3dhaXRGb3JEaXNwbGF5ZWQnLCd3YWl0Rm9yRW5hYmxlZCcsJ3dhaXRGb3JFeGlzdCcsJ3dhaXRVbnRpbCddO1xyXG5cclxuY29uc3QgaXNFbGVtZW50Tm90Rm91bmQgPSAoZWwpID0+IHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgICBlbC5lcnJvciAmJiAoXHJcbiAgICAgICAgZWwuZXJyb3IuZXJyb3IgPT09ICdubyBzdWNoIGVsZW1lbnQnIHx8XHJcbiAgICAgICAgKGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyIHdpbi5yaWdodENsaWNrICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnbm8gc3VjaCBlbGVtZW50JykgfHxcclxuICAgICAgICBlbC5lcnJvci5tZXNzYWdlICYmIC8qIHdpbmFwcGRyaXZlciAqLyBlbC5lcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0FuIGVsZW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQnKSkpXHJcbiAgICApIHtcclxuICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgbWF0Y2hQYXR0ZXJuOiBmdW5jdGlvbih2YWwsIHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXZhbCAmJiAhcGF0dGVybikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbG9iVG9SZWdleCA9IHJlcXVpcmUoJ2dsb2ItdG8tcmVnZXhwJyk7XHJcbiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XHJcblxyXG4gICAgICAgIHZhciByZWdleDtcclxuICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdyZWdleDonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleDonLmxlbmd0aCksICdnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4aTonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIHVzaW5nIGEgY2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleGk6Jy5sZW5ndGgpLCAnaWcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZXhhY3Q6JykgPT0gMCB8fCBwYXR0ZXJuID09PSAnJykgeyAgLy8gbWF0Y2ggYSBzdHJpbmcgZXhhY3RseSwgdmVyYmF0aW1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4uc3Vic3RyaW5nKCdleGFjdDonLmxlbmd0aCkgPT09IHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZ2xvYjonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIGNhc2UtaW5zZW5zaXRpdmUgXCJnbG9iXCIgcGF0dGVyblxyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4uc3Vic3RyaW5nKCdnbG9iOicubGVuZ3RoKSwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJlZml4IHNhbWUgYXMgZ2xvYiBtYXRjaGluZ1xyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4sIHsgZmxhZ3M6ICdpZycgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCwgdGhyb3dFeGNlcHRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWw7XHJcbiAgICAgICAgaWYgKGxvY2F0b3IgJiYgbG9jYXRvci5jb25zdHJ1Y3RvciAmJiBsb2NhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbGVtZW50Jykge1xyXG4gICAgICAgICAgICBlbCA9IGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuICAgICAgICAgICAgZWwgPSBhd2FpdCB0aGlzLmRyaXZlci4kKGxvY2F0b3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudE5vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWwpO1xyXG4gICAgICAgIGlmIChlbGVtZW50Tm90Rm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfRk9VTkQsIGBVbmFibGUgdG8gZmluZCBlbGVtZW50OiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FpdEZvclZpc2libGUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGVsLndhaXRGb3JEaXNwbGF5ZWQoeyB0aW1lb3V0OnRpbWVvdXQgPyB0aW1lb3V0IDogdGhpcy53YWl0Rm9yVGltZW91dH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbiAmJiBlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdzdGlsbCBub3QgZGlzcGxheWVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX1ZJU0lCTEUsIGBFbGVtZW50IG5vdCB2aXNpYmxlOiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJvd0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50czogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVscyA9IFtdO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCB0aGlzLmRyaXZlci4kJCh0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVscztcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hpbGRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCBwYXJlbnRFbGVtZW50LCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKCEocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LiQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIHBhcmVudEVsZW1lbnQsIG11c3QgYmUgYSB2YWxpZCBlbGVtZW50Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWwgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnROb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVsKTtcclxuICAgICAgICBpZiAoZWxlbWVudE5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6IHRpbWVvdXQgPyB0aW1lb3V0IDogdGhpcy53YWl0Rm9yVGltZW91dH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdzdGlsbCBub3QgZGlzcGxheWVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX1ZJU0lCTEUsIGBFbGVtZW50IG5vdCB2aXNpYmxlOiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENoaWxkRWxlbWVudHM6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHBhcmVudEVsZW1lbnQsIHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2F0b3IgPSB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGlmICghKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudC4kJCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gcGFyZW50RWxlbWVudCwgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbHMgPSBbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQkKGxvY2F0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxzO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRUaW1lb3V0SW1wbGljaXQ6IGFzeW5jIGZ1bmN0aW9uKHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZHJpdmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAqIDEwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGB0aW1lb3V0IG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICogMTAwMH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgdGltZW91dCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVvdXRzO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPT09ICdNaWNyb3NvZnRFZGdlJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIG9uIEVkZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuZ2V0VGltZW91dHMpIHtcclxuICAgICAgICAgICAgLy8gY2hyb21lID49IDc1XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnN0b3BVcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuc3RvcFVybC5pbmNsdWRlcygncGVyZmVjdG9tb2JpbGUuY29tJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGltZW91dHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmFpbHMgb24gcGVyZmVjdG8gbW9iaWxlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0VGltZW91dHMgZXJyb3InLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy50aW1lb3V0cykge1xyXG4gICAgICAgICAgICAvLyBjaHJvbWUgPj0gNzIgJiYgY2hyb21lIDwgNzVcclxuICAgICAgICAgICAgdGltZW91dHMgPSB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMudGltZW91dHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMuaW1wbGljaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldkltcGxpY2l0VGltZW91dCA9IHRpbWVvdXRzLmltcGxpY2l0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMucGFnZUxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCA9IHRpbWVvdXRzLnBhZ2VMb2FkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2V0VGltZW91dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYnJvd3Nlck5hbWUgJ2RlZmF1bHQnIG9uIGFuZHJvaWQgXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgICdwYWdlTG9hZCc6IHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGltZW91dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICByZXN0b3JlVGltZW91dEltcGxpY2l0OiBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5fcHJldkltcGxpY2l0VGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAncGFnZUxvYWQnOiB0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgaXMgcmVxdWlyZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRTdHJpbmc6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBzdHJpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZzogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE51bWJlcjogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRCb29sOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT0gdHlwZW9mKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSB0cnVlIG9yIGZhbHNlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZihhcmcpICE9IHR5cGVvZih0cnVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgdHJ1ZSBvciBmYWxzZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudFRpbWVvdXQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgJiYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24gbmVnYXRpdmUgbnVtYmVyLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNvbnRleHRMaXN0OiBjb250ZXh0TGlzdCxcclxuXHJcbiAgICBhc3NlcnRDb250ZXh0OiBhc3luYyBmdW5jdGlvbiguLi5hbG93ZWRDb250ZXh0cykge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0Q29udGV4dCgpO1xyXG4gICAgICAgIGNvbnN0IGlzV2ViID0gKGNvbnRleHQgJiYgKGNvbnRleHQuaW5kZXhPZignV0VCVklFVycpID4gLTEgfHwgY29udGV4dC5pbmRleE9mKCdDSFJPTUlVTScpID4gLTEpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzV2ViKSB7XHJcbiAgICAgICAgICAgIGlmIChhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC53ZWIpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0Lmh5YnJpZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmFuZHJvaWQpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmlvcykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRXZGlvTG9jYXRvcjogZnVuY3Rpb24obG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0b3IgPT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgeHBhdGggbG9jYXRvciBhcyBpc1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgWFBhdGggaW5zdGVhZCBvZiBDU1MgZm9yIGJyb3dzZXIgdGVzdHMsIHNpbmNlIElEIGNhbiBjb250YWluIGlsbGVnYWwgY2hhcmFjdGVyc1xyXG4gICAgICAgICAgICAvLyBhbmQgZXNjYXBpbmcgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9yIGluIGlkZW50aWNhbCBtYW5uZXIgaW4gYWxsIGJyb3dzZXJcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJiB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgLy8qW0BpZD1cIiR7bG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKX1cIl1gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcjJyArIGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ1tuYW1lPVwiJyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICdcIl0nO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluaz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbmstY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnKj0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY3NzPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zdWJzdHIoJ2Nzcz0nLmxlbmd0aCk7ICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGNzcywganVzdCByZW1vdmUgY3NzPSBwcmVmaXhcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RhZz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc8JyArIGxvY2F0b3Iuc3Vic3RyKCd0YWc9Jy5sZW5ndGgpICsgJyAvPic7XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRMb2dUeXBlczogZnVuY3Rpb24oY29udGV4dCkge1xyXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnTkFUSVZFX0FQUCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsnbG9nY2F0JywgJ2J1Z3JlcG9ydCcsICdzZXJ2ZXInXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gWydicm93c2VyJywgJ2RyaXZlciddO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcHJvdmlkZXI6IHByb3ZpZGVycyxcclxuXHJcbiAgICBkZXRlcm1pbmVQcm92aWRlcjogZnVuY3Rpb24od2Rpb09wdHMpIHtcclxuICAgICAgICBpZiAoIXdkaW9PcHRzIHx8ICF3ZGlvT3B0cy5jYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10gfHwgKHdkaW9PcHRzLmhvc3RuYW1lICYmIHdkaW9PcHRzLmhvc3RuYW1lLmluY2x1ZGVzKCdwZXJmZWN0b21vYmlsZS5jb20nKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5QRVJGRUNUTztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkJST1dTRVJTVEFDSztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuU0FVQ0VMQUJTO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuaG9zdG5hbWUuaW5jbHVkZXMoJ2xhbWJkYXRlc3QnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkxBTUJEQVRFU1Q7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuVEVTVElOR0JPVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBoYXNDaXJjdWxhckRlcGVuZGVuY3k6IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvYmopO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKFN0cmluZyhlKS5pbmNsdWRlcygnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0Q2lyY3VsYXI6IGZ1bmN0aW9uKG9iaikge1xyXG4gICAgICAgIGNvbnN0IGhhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IHRoaXMuaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KG9iaik7XHJcbiAgICAgICAgaWYgKGhhc0NpcmN1bGFyRGVwZW5kZW5jeSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkNJUkNVTEFSX0VSUk9SLCBoYXNDaXJjdWxhckRlcGVuZGVuY3kpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgbmV3VmlkZW9BdHRhY2htZW50OiAoZmlsZU5hbWUsIHZpZGVvVXJsKSA9PiAoe1xyXG4gICAgICAgIGlkOiB2MSgpLFxyXG4gICAgICAgIGZpbGVOYW1lLFxyXG4gICAgICAgIHR5cGU6ICd2aWRlbycsXHJcbiAgICAgICAgc3VidHlwZTogJ3NjcmVlbmNhc3QnLFxyXG4gICAgICAgIF91cmw6IHZpZGVvVXJsLFxyXG4gICAgfSksXHJcblxyXG4gICAgb3ZlcndyaXRlV2Rpb0NvbW1hbmRzOiBhc3luYyBmdW5jdGlvbihkcml2ZXIpIHtcclxuICAgICAgICAvLyBpZiBlbGVtZW50IGNvbW1hbmQgaXMgaW52b2tlZCBkaXJlY3RseSBmcm9tIHVzZXIgc2NyaXB0IGFuZCBlcnJvciBoYXBwZW5zLFxyXG4gICAgICAgIC8vIGl0IHdvbid0IGJlIGNhdWdodCBhbmQgd2lsbCBsZWFkIHRvIHVuaGFuZGxlZFJlamVjdGlvbiAoc2luY2UgaXQncyBleGVjdXRlZCBpbiBhc3luYyBtYW5uZXIgd2l0aG91dCBhd2FpdGluZykgYW5kIHRlc3QgcmVzdWx0cyB3aWxsIGJlIGxvc3QuXHJcblxyXG4gICAgICAgIC8vIGUuZy5cclxuICAgICAgICAvLyB2YXIgZWwgPSB3ZWIuZmluZEVsZW1lbnQoJ2lkPWZvbycpO1xyXG4gICAgICAgIC8vIGVsLmNsaWNrKCk7IC8vIGlmIGVsZW1lbnQgaXMgbm90IHZpc2libGUgdGhlbiBjbGljayB3aWxsIHRocm93IGV2ZW50dWFsbHlcclxuXHJcbiAgICAgICAgLy8gdGhlcmVmb3JlIHdlIHdyYXAgYWxsIHdkaW8gY29tbWFuZHMgdG8gbWFrZSB0aGVtIGV4ZWN1dGUgc3luY2hyb25vdXNseS5cclxuICAgICAgICAvLyBQLlMuIGl0IHdvdWxkIGJlIGJldHRlciB0byBkaXNhbGxvdyB1c2VycyBmcm9tIHVzaW5nIHdkaW8gZWxlbWVudCBjb21tYW5kcyBkaXJlY3RseSBzaW5jZSB0aGV5IGFyZSBub3QgZGlzcGxheWVkIGluIGxvZ3Mgb3IgcmVzdWx0cy5cclxuICAgICAgICAvLyBidXQgd2UgaGF2ZSBubyB3YXkgZGV0ZXJtaW5pbmcgd2hldGhlciBjb21tYW5kIHdhcyBleGVjdXRlZCBmcm9tIHVzZXIgc2NyaXB0IG9yIGZyb20gb3h5Z2VuIGludGVybmFscy4uLlxyXG5cclxuICAgICAgICBmb3IgKGxldCBjbWQgb2YgY21kc1RvT3ZlcndyaXRlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGRyaXZlci5vdmVyd3JpdGVDb21tYW5kKGNtZCwgZnVuY3Rpb24gKG9yaWdGdW5jKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkodW5kZWZpbmVkLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xyXG4gICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGVucmljaFByb3ZpZGVyV2Rpb09wdGlvbnM6IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgd2Rpb09wdHMpIHtcclxuICAgICAgICBsZXQgbmFtZSA9ICduYW1lJztcclxuICAgICAgICBpZiAocHJvdmlkZXJOYW1lID09PSBwcm92aWRlcnMuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZSA9PT0gcHJvdmlkZXJzLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICBjb25zdCBic09wdGlvbnMgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgICAgIGlmIChic09wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZU5hbWUgPSBic09wdGlvbnMuZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9zTmFtZSA9IGJzT3B0aW9ucy5vcztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJzT3B0aW9ucy5yZWFsTW9iaWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10gPSBkZXZpY2VOYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZvciBtb2JpbGUgYnJvd3NlciB0ZXN0LCBib3RoIGJvcndzZXJOYW1lIGFuZCBhcHBpdW06ZGV2aWNlTmFtZSB3aWxsIGJlIHNldFxyXG4gICAgICAgICAgICAgICAgLy8gaG93ZXZlciBmb3IgQlMgdG8gd29yayBpdCBhbHNvIGV4cGVjdHMgYnN0YWNrOm9wdGlvbnMuZGV2aWNlTmFtZVxyXG4gICAgICAgICAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMuZGV2aWNlTmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmRldmljZU5hbWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgYXV0b21hdGlvbk5hbWUgQXBwaXVtIGNhcGFiaWxpdHlcclxuICAgICAgICAgICAgICAgIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUgPSAnQW5kcm9pZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXV0b21hdGlvbk5hbWUnXSA9ICdVSUF1dG9tYXRvcjInO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZSA9ICdpT1MnO1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmF1dG9tYXRpb25OYW1lJ10gPSAnWENVSVRlc3QnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgQlMgb3B0aW9ucyBpbnRvIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXBOYW1lIGluIHdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXBOYW1lLnN0YXJ0c1dpdGgoJ2JzdGFjazonKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBic0NhcE5hbWUgPSBjYXBOYW1lLnN1YnN0cmluZygnYnN0YWNrOicubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic0NhcE5hbWUgPT09ICdvcHRpb25zJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uIG5lZWRzIHRvIGJlIHJlbW92ZWQgZXZlbnR1YWxseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNDYXBOYW1lID09PSAncmVjb3JkVmlkZW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMudmlkZW8gPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbY2FwTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJzT3B0aW9uc1tic0NhcE5hbWVdID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcbn07XHJcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBQUEsWUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQTRDLFNBQUFELHVC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
|