oxygen-cli 1.22.0 → 1.99.0-alpha.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 +0 -50
- package/build/core/OxygenCore.js +56 -145
- package/build/errors/OxygenError.js +5 -15
- package/build/errors/helper.js +45 -49
- package/build/index.js +14 -6
- package/build/lib/cli-util.js +19 -19
- package/build/lib/cli.js +4 -2
- package/build/lib/parallel-launcher.js +333 -0
- package/build/lib/param-manager.js +66 -47
- package/build/lib/util.js +38 -9
- package/build/ox_modules/index.js +1 -97
- package/build/ox_modules/module-assert.js +19 -9
- package/build/ox_modules/module-dns.js +220 -0
- package/build/ox_modules/module-http.js +39 -51
- package/build/ox_modules/module-shell.js +19 -75
- package/build/ox_modules/module-utils.js +1 -108
- package/build/ox_modules/utils.js +1 -357
- package/build/reporter/FileReporterBase.js +5 -5
- package/build/reporter/ReportAggregator.js +127 -4
- package/build/runners/WorkerProcess.js +15 -28
- package/build/runners/index.js +2 -6
- package/build/runners/oxygen/OxygenWorker.js +8 -8
- package/build/runners/oxygen/index.js +17 -18
- package/build/runners/oxygen/worker.js +10 -8
- package/package.json +12 -46
- package/build/lib/img-merge.js +0 -163
- package/build/ox_modules/module-db.js +0 -146
- package/build/ox_modules/module-email.js +0 -212
- package/build/ox_modules/module-eyes.js +0 -189
- package/build/ox_modules/module-mailinator.js +0 -207
- package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
- package/build/ox_modules/module-mob/commands/assertText.js +0 -45
- package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
- package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
- package/build/ox_modules/module-mob/commands/back.js +0 -27
- package/build/ox_modules/module-mob/commands/clear.js +0 -40
- package/build/ox_modules/module-mob/commands/click.js +0 -35
- package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
- package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
- package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
- package/build/ox_modules/module-mob/commands/debug.js +0 -26
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
- package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
- package/build/ox_modules/module-mob/commands/execute.js +0 -32
- package/build/ox_modules/module-mob/commands/findElement.js +0 -36
- package/build/ox_modules/module-mob/commands/findElements.js +0 -39
- package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
- package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
- package/build/ox_modules/module-mob/commands/getSource.js +0 -26
- package/build/ox_modules/module-mob/commands/getText.js +0 -36
- package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
- package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
- package/build/ox_modules/module-mob/commands/getValue.js +0 -50
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
- package/build/ox_modules/module-mob/commands/index.js +0 -594
- package/build/ox_modules/module-mob/commands/installApp.js +0 -28
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
- package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
- package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
- package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
- package/build/ox_modules/module-mob/commands/isExist.js +0 -36
- package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
- package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
- package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
- package/build/ox_modules/module-mob/commands/open.js +0 -43
- package/build/ox_modules/module-mob/commands/pause.js +0 -27
- package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
- package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
- package/build/ox_modules/module-mob/commands/select.js +0 -54
- package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
- package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
- package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
- package/build/ox_modules/module-mob/commands/setContext.js +0 -28
- package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
- package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
- package/build/ox_modules/module-mob/commands/shake.js +0 -27
- package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
- package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
- package/build/ox_modules/module-mob/commands/swipe.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
- package/build/ox_modules/module-mob/commands/tap.js +0 -34
- package/build/ox_modules/module-mob/commands/type.js +0 -67
- package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
- package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
- package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-mob.js +0 -699
- package/build/ox_modules/module-pdf.js +0 -328
- package/build/ox_modules/module-proxy.js +0 -324
- package/build/ox_modules/module-serial.js +0 -187
- package/build/ox_modules/module-soap.js +0 -260
- package/build/ox_modules/module-twilio.js +0 -192
- package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
- package/build/ox_modules/module-web/commands/assertExist.js +0 -28
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
- package/build/ox_modules/module-web/commands/assertText.js +0 -45
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
- package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
- package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
- package/build/ox_modules/module-web/commands/assertValue.js +0 -44
- package/build/ox_modules/module-web/commands/back.js +0 -27
- package/build/ox_modules/module-web/commands/clear.js +0 -41
- package/build/ox_modules/module-web/commands/click.js +0 -112
- package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
- package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
- package/build/ox_modules/module-web/commands/debug.js +0 -25
- package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
- package/build/ox_modules/module-web/commands/deselect.js +0 -34
- package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
- package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
- package/build/ox_modules/module-web/commands/execute.js +0 -36
- package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
- package/build/ox_modules/module-web/commands/findElement.js +0 -35
- package/build/ox_modules/module-web/commands/findElements.js +0 -38
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
- package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
- package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
- package/build/ox_modules/module-web/commands/getCookies.js +0 -23
- package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
- package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
- package/build/ox_modules/module-web/commands/getHTML.js +0 -30
- package/build/ox_modules/module-web/commands/getSource.js +0 -26
- package/build/ox_modules/module-web/commands/getText.js +0 -36
- package/build/ox_modules/module-web/commands/getTitle.js +0 -22
- package/build/ox_modules/module-web/commands/getUrl.js +0 -26
- package/build/ox_modules/module-web/commands/getValue.js +0 -43
- package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
- package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
- package/build/ox_modules/module-web/commands/index.js +0 -634
- package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
- package/build/ox_modules/module-web/commands/isChecked.js +0 -30
- package/build/ox_modules/module-web/commands/isExist.js +0 -36
- package/build/ox_modules/module-web/commands/isSelected.js +0 -35
- package/build/ox_modules/module-web/commands/isVisible.js +0 -36
- package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
- package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/newWindow.js +0 -27
- package/build/ox_modules/module-web/commands/open.js +0 -42
- package/build/ox_modules/module-web/commands/pause.js +0 -26
- package/build/ox_modules/module-web/commands/point.js +0 -37
- package/build/ox_modules/module-web/commands/pointJS.js +0 -56
- package/build/ox_modules/module-web/commands/refresh.js +0 -26
- package/build/ox_modules/module-web/commands/rightClick.js +0 -61
- package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
- package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
- package/build/ox_modules/module-web/commands/select.js +0 -55
- package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
- package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
- package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
- package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
- package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
- package/build/ox_modules/module-web/commands/type.js +0 -52
- package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
- package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
- package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
- package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
- package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
- package/build/ox_modules/module-web.js +0 -909
- package/build/ox_modules/module-win/commands/assertText.js +0 -41
- package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
- package/build/ox_modules/module-win/commands/assertValue.js +0 -62
- package/build/ox_modules/module-win/commands/back.js +0 -21
- package/build/ox_modules/module-win/commands/clear.js +0 -34
- package/build/ox_modules/module-win/commands/click.js +0 -25
- package/build/ox_modules/module-win/commands/clickLong.js +0 -30
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
- package/build/ox_modules/module-win/commands/findElement.js +0 -31
- package/build/ox_modules/module-win/commands/findElements.js +0 -31
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
- package/build/ox_modules/module-win/commands/getLocation.js +0 -26
- package/build/ox_modules/module-win/commands/getSource.js +0 -22
- package/build/ox_modules/module-win/commands/getText.js +0 -32
- package/build/ox_modules/module-win/commands/getValue.js +0 -46
- package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
- package/build/ox_modules/module-win/commands/index.js +0 -298
- package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
- package/build/ox_modules/module-win/commands/isChecked.js +0 -26
- package/build/ox_modules/module-win/commands/isClickable.js +0 -26
- package/build/ox_modules/module-win/commands/isExist.js +0 -32
- package/build/ox_modules/module-win/commands/isSelected.js +0 -26
- package/build/ox_modules/module-win/commands/isVisible.js +0 -32
- package/build/ox_modules/module-win/commands/open.js +0 -24
- package/build/ox_modules/module-win/commands/pause.js +0 -23
- package/build/ox_modules/module-win/commands/rightClick.js +0 -30
- package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
- package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
- package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
- package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
- package/build/ox_modules/module-win/commands/tap.js +0 -29
- package/build/ox_modules/module-win/commands/type.js +0 -38
- package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
- package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
- package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
- package/build/ox_modules/module-win.js +0 -367
- package/build/ox_services/service-devtools/submodule-network.js +0 -338
- package/build/ox_services/service-devtools.js +0 -83
- package/build/runners/cucumber/CucumberEventListener.js +0 -181
- package/build/runners/cucumber/CucumberReporter.js +0 -277
- package/build/runners/cucumber/CucumberWorker.js +0 -337
- package/build/runners/cucumber/index.js +0 -159
- package/build/runners/cucumber/worker.js +0 -184
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2015-present CloudBeat Limited
|
|
3
|
-
*
|
|
4
|
-
* This program is free software: you can redistribute it and/or modify
|
|
5
|
-
* it under the terms of the GNU General Public License as published by
|
|
6
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
7
|
-
* (at your option) any later version.
|
|
8
|
-
*/
|
|
9
|
-
'use strict';
|
|
10
|
-
/**
|
|
11
|
-
* @name win
|
|
12
|
-
* @description Provides methods for Windows native applications automation.
|
|
13
|
-
* @sample **Locators:**
|
|
14
|
-
*
|
|
15
|
-
* * `/XPATH` - Locates element using an XPath 1.0 expression.
|
|
16
|
-
* * `~AccessibilityId` - Locates element by its Accessibility ID. Attribute name in inspect.exe - AutomationId.
|
|
17
|
-
* * `name=NAME` - Locates element by its name. Attribute name in inspect.exe - Name.
|
|
18
|
-
* * `id=ID` - Locates element by its ID. Attribute name in inspect.exe - RuntimeID.
|
|
19
|
-
*
|
|
20
|
-
* **Pattern arguments:**
|
|
21
|
-
*
|
|
22
|
-
* Commands which expect a string matching pattern in their arguments, support following patterns unless specified otherwise:
|
|
23
|
-
*
|
|
24
|
-
* * `regex:PATTERN` - Match using regular expression.
|
|
25
|
-
* * `PATTERN` - Verbatim matching.
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
Object.defineProperty(exports, "__esModule", {
|
|
29
|
-
value: true
|
|
30
|
-
});
|
|
31
|
-
exports.default = void 0;
|
|
32
|
-
|
|
33
|
-
require("source-map-support/register");
|
|
34
|
-
|
|
35
|
-
var _url = _interopRequireDefault(require("url"));
|
|
36
|
-
|
|
37
|
-
var wdio = _interopRequireWildcard(require("webdriverio"));
|
|
38
|
-
|
|
39
|
-
var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
|
|
40
|
-
|
|
41
|
-
var _utils = _interopRequireDefault(require("./utils"));
|
|
42
|
-
|
|
43
|
-
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
44
|
-
|
|
45
|
-
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
46
|
-
|
|
47
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
48
|
-
|
|
49
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
50
|
-
|
|
51
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
52
|
-
|
|
53
|
-
const MODULE_NAME = 'win';
|
|
54
|
-
const DEFAULT_APPIUM_URL = 'http://localhost:4723/wd/hub';
|
|
55
|
-
const DEFAULT_APP = 'Root';
|
|
56
|
-
const NO_SCREENSHOT_COMMANDS = ['init', 'assertAlert'];
|
|
57
|
-
const ACTION_COMMANDS = ['open', 'tap', 'click', 'swipe', 'submit', 'setValue'];
|
|
58
|
-
const DEFAULT_WAIT_TIMEOUT = 60 * 1000; // default 60s wait timeout
|
|
59
|
-
|
|
60
|
-
const WINDOWS_STANDARD_APP_IDS = {
|
|
61
|
-
Calculator: 'Microsoft.WindowsCalculator_8wekyb3d8bbwe!App',
|
|
62
|
-
AlarmClock: 'Microsoft.WindowsAlarms_8wekyb3d8bbwe!App',
|
|
63
|
-
Notepad: 'C:\\Windows\\System32\\notepad.exe',
|
|
64
|
-
Paint: 'C:\\Windows\\System32\\mspaint.exe',
|
|
65
|
-
Paint3D: 'Microsoft.MSPaint_8wekyb3d8bbwe!Microsoft.MSPaint',
|
|
66
|
-
StickyNotes: 'Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe!App'
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
class WindowsModule extends _WebDriverModule.default {
|
|
70
|
-
constructor(options, context, rs, logger, modules, services) {
|
|
71
|
-
super(options, context, rs, logger, modules, services);
|
|
72
|
-
this.transactions = {};
|
|
73
|
-
this.lastNavigationStartTime = null;
|
|
74
|
-
this.networkRequests = null;
|
|
75
|
-
this.helpers = {};
|
|
76
|
-
|
|
77
|
-
this._loadHelperFunctions(); // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
this.OxError = _OxygenError.default;
|
|
81
|
-
this.errHelper = _helper.default; // holds element operation timeout value
|
|
82
|
-
|
|
83
|
-
this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
get name() {
|
|
87
|
-
return MODULE_NAME;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* @function getDriver
|
|
91
|
-
* @summary Returns the underlying WDIO driver.
|
|
92
|
-
* @return {Object} WDIO driver.
|
|
93
|
-
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
getDriver() {
|
|
97
|
-
return super.getDriver();
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* @function getCapabilities
|
|
101
|
-
* @summary Returns currently defined capabilities.
|
|
102
|
-
* @return {Object} Current capabilities object.
|
|
103
|
-
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
getCapabilities() {
|
|
107
|
-
return this.caps || super.getCapabilities();
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* @function init
|
|
111
|
-
* @summary Initializes a new Appium session.
|
|
112
|
-
* @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
|
|
113
|
-
* @param {String=} appiumUrl - Remote Appium server URL (default: http://localhost:4723/wd/hub).
|
|
114
|
-
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
async init(caps, appiumUrl) {
|
|
118
|
-
// if reopenSession is true - reinitilize the module
|
|
119
|
-
if (this.isInitialized) {
|
|
120
|
-
if (this.options.reopenSession !== false) {
|
|
121
|
-
// true or false if explisitly set. true on null or undefined.
|
|
122
|
-
this.logger.debug('reopenSession is true - reloading the session...');
|
|
123
|
-
this.driver.reloadSession();
|
|
124
|
-
this._isInitialized = true;
|
|
125
|
-
} else {
|
|
126
|
-
this.logger.debug('mob.init was called for already initialized module. reopenSession is false so the call is ignored.');
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (!appiumUrl) {
|
|
133
|
-
appiumUrl = this.options.appiumUrl || DEFAULT_APPIUM_URL;
|
|
134
|
-
} // merge capabilities from context and from init function argument, give preference to context-passed capabilities
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this.caps = {};
|
|
138
|
-
|
|
139
|
-
if (this.ctx.caps) {
|
|
140
|
-
this.caps = { ...this.ctx.caps
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (caps) {
|
|
145
|
-
this.caps = { ...this.caps,
|
|
146
|
-
...caps
|
|
147
|
-
};
|
|
148
|
-
} // make sure 'app' capability is provided (mandatory for WinAppDriver)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (!this.caps.app) {
|
|
152
|
-
this.caps.app = DEFAULT_APP;
|
|
153
|
-
} else {
|
|
154
|
-
const appCapVal = this.caps.app; // try to resolve 'app' value in the Windows standard app list
|
|
155
|
-
|
|
156
|
-
const appNames = Object.keys(WINDOWS_STANDARD_APP_IDS);
|
|
157
|
-
|
|
158
|
-
if (appNames.includes(appCapVal)) {
|
|
159
|
-
this.caps.app = WINDOWS_STANDARD_APP_IDS[appCapVal];
|
|
160
|
-
}
|
|
161
|
-
} // set default platformName for WinAppDriver
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (!this.caps.platformName) {
|
|
165
|
-
this.caps.platformName = 'Windows';
|
|
166
|
-
} // set default deviceName for WinAppDriver
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (!this.caps.deviceName) {
|
|
170
|
-
this.caps.deviceName = 'WindowsPC';
|
|
171
|
-
} // set default platformVersion for WinAppDriver
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (!this.caps.platformVersion) {
|
|
175
|
-
this.caps.platformVersion = '1.0';
|
|
176
|
-
} // populate WDIO options
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const url = _url.default.parse(appiumUrl);
|
|
180
|
-
|
|
181
|
-
const protocol = url.protocol.replace(/:$/, '');
|
|
182
|
-
const host = url.hostname;
|
|
183
|
-
const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
|
|
184
|
-
const path = url.pathname; // auth is needed mostly for cloud providers such as LambdaTest
|
|
185
|
-
|
|
186
|
-
if (url.auth) {
|
|
187
|
-
const auth = url.auth.split(':');
|
|
188
|
-
this.options.wdioOpts = {
|
|
189
|
-
user: auth[0],
|
|
190
|
-
key: auth[1]
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
var wdioOpts = { ...(this.options.wdioOpts || {}),
|
|
195
|
-
protocol: protocol,
|
|
196
|
-
hostname: host,
|
|
197
|
-
port: port,
|
|
198
|
-
path: path,
|
|
199
|
-
capabilities: this.caps,
|
|
200
|
-
logLevel: 'silent',
|
|
201
|
-
runner: 'repl',
|
|
202
|
-
waitforTimeout: 5000,
|
|
203
|
-
// increase the default 3000
|
|
204
|
-
connectionRetryTimeout: 310 * 1000,
|
|
205
|
-
connectionRetryCount: 1
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
try {
|
|
209
|
-
this.driver = await wdio.remote(wdioOpts);
|
|
210
|
-
|
|
211
|
-
if (this.options.seleniumBrowserTimeout) {
|
|
212
|
-
this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (this.options.seleniumTimeout) {
|
|
216
|
-
this.driver.seleniumTimeout = this.options.seleniumTimeout;
|
|
217
|
-
}
|
|
218
|
-
} catch (e) {
|
|
219
|
-
throw _helper.default.getAppiumInitError(e);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
await this.driver.setTimeout({
|
|
223
|
-
'implicit': this.waitForTimeout
|
|
224
|
-
});
|
|
225
|
-
super.init(this.driver);
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* @function dispose
|
|
229
|
-
* @summary Ends the current session.
|
|
230
|
-
*/
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
async dispose(status) {
|
|
234
|
-
status = status.toUpperCase();
|
|
235
|
-
|
|
236
|
-
if (this.driver && this.isInitialized) {
|
|
237
|
-
try {
|
|
238
|
-
if (!['CANCELED', 'FAILED'].includes(status)) {
|
|
239
|
-
if (this.seleniumSessionTimeout) {// ignore
|
|
240
|
-
// deleteSession will take 5 min to call
|
|
241
|
-
} else {
|
|
242
|
-
await this.driver.deleteSession();
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
} catch (e) {
|
|
246
|
-
this.logger.warn('Error disposing driver: ' + e); // ignore any errors at disposal stage
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
this.driver = null;
|
|
250
|
-
this.lastNavigationStartTime = null;
|
|
251
|
-
super.dispose();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* @summary Opens new transaction.
|
|
256
|
-
* @description The transaction will persist till a new one is opened. Transaction names must be
|
|
257
|
-
* unique.
|
|
258
|
-
* @function transaction
|
|
259
|
-
* @param {String} name - The transaction name.
|
|
260
|
-
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
transaction(name) {
|
|
264
|
-
global._lastTransactionName = name;
|
|
265
|
-
}
|
|
266
|
-
/*
|
|
267
|
-
* Private
|
|
268
|
-
*/
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
_isAction(name) {
|
|
272
|
-
return ACTION_COMMANDS.includes(name);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
_takeScreenshotSilent(name) {
|
|
276
|
-
if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
|
|
277
|
-
try {
|
|
278
|
-
if (this.driver && this.driver.takeScreenshot) {
|
|
279
|
-
return this.driver.takeScreenshot();
|
|
280
|
-
}
|
|
281
|
-
} catch (e) {
|
|
282
|
-
this.logger.error('Cannot get screenshot', e); // ignore
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
} // _getLogs(name) {
|
|
286
|
-
// if (!NO_LOGS_COMMANDS.includes(name)) {
|
|
287
|
-
// return this.getLogs();
|
|
288
|
-
// }
|
|
289
|
-
// }
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
_adjustAppiumLog(log, src) {
|
|
293
|
-
if (!log || typeof log !== 'object') {
|
|
294
|
-
return null;
|
|
295
|
-
} // TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return {
|
|
299
|
-
time: log.timestamp,
|
|
300
|
-
msg: log.message,
|
|
301
|
-
level: log.level,
|
|
302
|
-
src: src
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
_iterationStart() {
|
|
307
|
-
// clear transaction name saved in previous iteration if any
|
|
308
|
-
global._lastTransactionName = null;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
_iterationEnd(error) {
|
|
312
|
-
if (error && error.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT) {
|
|
313
|
-
this.seleniumSessionTimeout = true;
|
|
314
|
-
return;
|
|
315
|
-
} else {
|
|
316
|
-
this.seleniumSessionTimeout = false;
|
|
317
|
-
} // ignore the rest if mob module is not initialized
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
if (!this.isInitialized) {
|
|
321
|
-
return;
|
|
322
|
-
} // collect all Appium logs for this session
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
if (this.options.collectAppiumLogs) {
|
|
326
|
-
try {
|
|
327
|
-
const logs = this.getAppiumLogs();
|
|
328
|
-
|
|
329
|
-
if (logs && Array.isArray(logs)) {
|
|
330
|
-
for (var logEntry of logs) {
|
|
331
|
-
this.rs.logs.push(this._adjustAppiumLog(logEntry, 'appium'));
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
} catch (e) {
|
|
335
|
-
// ignore errors
|
|
336
|
-
this.logger.error('Cannot retrieve Appium logs.', e);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
_getWdioLocator(locator) {
|
|
342
|
-
if (!locator) throw new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');else if (typeof locator === 'object') return locator;else if (locator.indexOf('/') === 0) return locator;else if (locator.indexOf('id=') === 0) return `//*[@id="${locator.substr('id='.length)}"]`;else if (locator.indexOf('name=') === 0) return '[name="' + locator.substr('name='.length) + '"]';
|
|
343
|
-
return locator;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
_loadHelperFunctions() {
|
|
347
|
-
this.helpers.getWdioLocator = this._getWdioLocator;
|
|
348
|
-
this.helpers.matchPattern = _utils.default.matchPattern;
|
|
349
|
-
this.helpers.getElement = _utils.default.getElement;
|
|
350
|
-
this.helpers.getElements = _utils.default.getElements;
|
|
351
|
-
this.helpers.getChildElement = _utils.default.getChildElement;
|
|
352
|
-
this.helpers.getChildElements = _utils.default.getChildElements;
|
|
353
|
-
this.helpers.setTimeoutImplicit = _utils.default.setTimeoutImplicit;
|
|
354
|
-
this.helpers.restoreTimeoutImplicit = _utils.default.restoreTimeoutImplicit;
|
|
355
|
-
this.helpers.assertArgument = _utils.default.assertArgument;
|
|
356
|
-
this.helpers.assertArgumentNonEmptyString = _utils.default.assertArgumentNonEmptyString;
|
|
357
|
-
this.helpers.assertArgumentNumber = _utils.default.assertArgumentNumber;
|
|
358
|
-
this.helpers.assertArgumentNumberNonNegative = _utils.default.assertArgumentNumberNonNegative;
|
|
359
|
-
this.helpers.assertArgumentBool = _utils.default.assertArgumentBool;
|
|
360
|
-
this.helpers.assertArgumentBoolOptional = _utils.default.assertArgumentBoolOptional;
|
|
361
|
-
this.helpers.assertArgumentTimeout = _utils.default.assertArgumentTimeout;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
exports.default = WindowsModule;
|
|
367
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13aW4uanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0FQUCIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIldJTkRPV1NfU1RBTkRBUkRfQVBQX0lEUyIsIkNhbGN1bGF0b3IiLCJBbGFybUNsb2NrIiwiTm90ZXBhZCIsIlBhaW50IiwiUGFpbnQzRCIsIlN0aWNreU5vdGVzIiwiV2luZG93c01vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwibmV0d29ya1JlcXVlc3RzIiwiaGVscGVycyIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0IiwiYXBwaXVtVXJsIiwiaXNJbml0aWFsaXplZCIsInJlb3BlblNlc3Npb24iLCJkZWJ1ZyIsImRyaXZlciIsInJlbG9hZFNlc3Npb24iLCJfaXNJbml0aWFsaXplZCIsImN0eCIsImFwcCIsImFwcENhcFZhbCIsImFwcE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluY2x1ZGVzIiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInBsYXRmb3JtVmVyc2lvbiIsInVybCIsIlVSTCIsInBhcnNlIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicGF0aCIsInBhdGhuYW1lIiwiYXV0aCIsInNwbGl0Iiwid2Rpb09wdHMiLCJ1c2VyIiwia2V5IiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsIndkaW8iLCJyZW1vdGUiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwiZSIsImdldEFwcGl1bUluaXRFcnJvciIsInNldFRpbWVvdXQiLCJkaXNwb3NlIiwic3RhdHVzIiwidG9VcHBlckNhc2UiLCJzZWxlbml1bVNlc3Npb25UaW1lb3V0IiwiZGVsZXRlU2Vzc2lvbiIsIndhcm4iLCJ0cmFuc2FjdGlvbiIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiX2lzQWN0aW9uIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwidGFrZVNjcmVlbnNob3QiLCJlcnJvciIsIl9hZGp1c3RBcHBpdW1Mb2ciLCJsb2ciLCJzcmMiLCJ0aW1lIiwidGltZXN0YW1wIiwibXNnIiwibWVzc2FnZSIsImxldmVsIiwiX2l0ZXJhdGlvblN0YXJ0IiwiX2l0ZXJhdGlvbkVuZCIsInR5cGUiLCJlcnJvckhlbHBlciIsImVycm9yQ29kZSIsIlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCIsImNvbGxlY3RBcHBpdW1Mb2dzIiwibG9ncyIsImdldEFwcGl1bUxvZ3MiLCJBcnJheSIsImlzQXJyYXkiLCJsb2dFbnRyeSIsInB1c2giLCJfZ2V0V2Rpb0xvY2F0b3IiLCJsb2NhdG9yIiwiU0NSSVBUX0VSUk9SIiwiaW5kZXhPZiIsInN1YnN0ciIsImxlbmd0aCIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwibW9kVXRpbHMiLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFHQSxNQUFNQSxXQUFXLEdBQUcsS0FBcEI7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyw4QkFBM0I7QUFDQSxNQUFNQyxXQUFXLEdBQUcsTUFBcEI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUFDLE1BQUQsRUFBUyxhQUFULENBQS9CO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLENBQUMsTUFBRCxFQUFRLEtBQVIsRUFBYyxPQUFkLEVBQXNCLE9BQXRCLEVBQThCLFFBQTlCLEVBQXVDLFVBQXZDLENBQXhCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsS0FBSyxJQUFsQyxDLENBQW1EOztBQUNuRCxNQUFNQyx3QkFBd0IsR0FBRztBQUM3QkMsRUFBQUEsVUFBVSxFQUFFLCtDQURpQjtBQUU3QkMsRUFBQUEsVUFBVSxFQUFFLDJDQUZpQjtBQUc3QkMsRUFBQUEsT0FBTyxFQUFFLG9DQUhvQjtBQUk3QkMsRUFBQUEsS0FBSyxFQUFFLG9DQUpzQjtBQUs3QkMsRUFBQUEsT0FBTyxFQUFFLG1EQUxvQjtBQU03QkMsRUFBQUEsV0FBVyxFQUFFO0FBTmdCLENBQWpDOztBQVNlLE1BQU1DLGFBQU4sU0FBNEJDLHdCQUE1QixDQUE0QztBQUN2REMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVB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ZUFBeEM7QUFDQSxTQUFLckcsT0FBTCxDQUFhc0csZ0JBQWIsR0FBZ0NKLGVBQVNJLGdCQUF6QztBQUNBLFNBQUt0RyxPQUFMLENBQWF1RyxrQkFBYixHQUFrQ0wsZUFBU0ssa0JBQTNDO0FBQ0EsU0FBS3ZHLE9BQUwsQ0FBYXdHLHNCQUFiLEdBQXNDTixlQUFTTSxzQkFBL0M7QUFDQSxTQUFLeEcsT0FBTCxDQUFheUcsY0FBYixHQUE4QlAsZUFBU08sY0FBdkM7QUFDQSxTQUFLekcsT0FBTCxDQUFhMEcsNEJBQWIsR0FBNENSLGVBQVNRLDRCQUFyRDtBQUNBLFNBQUsxRyxPQUFMLENBQWEyRyxvQkFBYixHQUFvQ1QsZUFBU1Msb0JBQTdDO0FBQ0EsU0FBSzNHLE9BQUwsQ0FBYTRHLCtCQUFiLEdBQStDVixlQUFTVSwrQkFBeEQ7QUFDQSxTQUFLNUcsT0FBTCxDQUFhNkcsa0JBQWIsR0FBa0NYLGVBQVNXLGtCQUEzQztBQUNBLFNBQUs3RyxPQUFMLENBQWE4RywwQkFBYixHQUEwQ1osZUFBU1ksMEJBQW5EO0FBQ0EsU0FBSzlHLE9BQUwsQ0FBYStHLHFCQUFiLEdBQXFDYixlQUFTYSxxQkFBOUM7QUFDSDs7QUEvUnNEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSB3aW5cclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIFdpbmRvd3MgbmF0aXZlIGFwcGxpY2F0aW9ucyBhdXRvbWF0aW9uLlxyXG4gKiBAc2FtcGxlICoqTG9jYXRvcnM6KiogIFxyXG4gKiAgIFxyXG4gKiAgKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogICogYH5BY2Nlc3NpYmlsaXR5SWRgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBBY2Nlc3NpYmlsaXR5IElELiBBdHRyaWJ1dGUgbmFtZSBpbiBpbnNwZWN0LmV4ZSAtIEF1dG9tYXRpb25JZC5cclxuICogICogYG5hbWU9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIG5hbWUuIEF0dHJpYnV0ZSBuYW1lIGluIGluc3BlY3QuZXhlIC0gTmFtZS5cclxuICogICogYGlkPUlEYCAtICBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElELiBBdHRyaWJ1dGUgbmFtZSBpbiBpbnNwZWN0LmV4ZSAtIFJ1bnRpbWVJRC4gIFxyXG4gKiAgXHJcbiAqICoqUGF0dGVybiBhcmd1bWVudHM6KipcclxuICogIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGEgc3RyaW5nIG1hdGNoaW5nIHBhdHRlcm4gaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBwYXR0ZXJucyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogIFxyXG4gKiAgKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGBQQVRURVJOYCAtIFZlcmJhdGltIG1hdGNoaW5nLlxyXG4gKi9cclxuXHJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcclxuaW1wb3J0ICogYXMgd2RpbyBmcm9tICd3ZWJkcml2ZXJpbyc7XHJcbmltcG9ydCBXZWJEcml2ZXJNb2R1bGUgZnJvbSAnLi4vY29yZS9XZWJEcml2ZXJNb2R1bGUnO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ3dpbic7XHJcbmNvbnN0IERFRkFVTFRfQVBQSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9BUFAgPSAnUm9vdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywndGFwJywnY2xpY2snLCdzd2lwZScsJ3N1Ym1pdCcsJ3NldFZhbHVlJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5jb25zdCBXSU5ET1dTX1NUQU5EQVJEX0FQUF9JRFMgPSB7XHJcbiAgICBDYWxjdWxhdG9yOiAnTWljcm9zb2Z0LldpbmRvd3NDYWxjdWxhdG9yXzh3ZWt5YjNkOGJid2UhQXBwJyxcclxuICAgIEFsYXJtQ2xvY2s6ICdNaWNyb3NvZnQuV2luZG93c0FsYXJtc184d2VreWIzZDhiYndlIUFwcCcsXHJcbiAgICBOb3RlcGFkOiAnQzpcXFxcV2luZG93c1xcXFxTeXN0ZW0zMlxcXFxub3RlcGFkLmV4ZScsXHJcbiAgICBQYWludDogJ0M6XFxcXFdpbmRvd3NcXFxcU3lzdGVtMzJcXFxcbXNwYWludC5leGUnLFxyXG4gICAgUGFpbnQzRDogJ01pY3Jvc29mdC5NU1BhaW50Xzh3ZWt5YjNkOGJid2UhTWljcm9zb2Z0Lk1TUGFpbnQnLFxyXG4gICAgU3RpY2t5Tm90ZXM6ICdNaWNyb3NvZnQuTWljcm9zb2Z0U3RpY2t5Tm90ZXNfOHdla3liM2Q4YmJ3ZSFBcHAnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaW5kb3dzTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5uZXR3b3JrUmVxdWVzdHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXREcml2ZXJcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgV0RJTyBkcml2ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFdESU8gZHJpdmVyLlxyXG4gICAgICovXHJcbiAgICBnZXREcml2ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldERyaXZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldENhcGFiaWxpdGllc1xyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBjdXJyZW50bHkgZGVmaW5lZCBjYXBhYmlsaXRpZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcHMgfHwgc3VwZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgQXBwaXVtIHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNhcHMgLSBEZXNpcmVkIGNhcGFiaWxpdGllcy4gSWYgbm90IHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgd2lsbCBiZSB0YWtlbiBmcm9tIHN1aXRlIGRlZmluaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGFwcGl1bVVybCAtIFJlbW90ZSBBcHBpdW0gc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YikuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoY2FwcywgYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgLy8gaWYgcmVvcGVuU2Vzc2lvbiBpcyB0cnVlIC0gcmVpbml0aWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW9wZW5TZXNzaW9uICE9PSBmYWxzZSkgeyAvLyB0cnVlIG9yIGZhbHNlIGlmIGV4cGxpc2l0bHkgc2V0LiB0cnVlIG9uIG51bGwgb3IgdW5kZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3Jlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlbG9hZGluZyB0aGUgc2Vzc2lvbi4uLicpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIucmVsb2FkU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnbW9iLmluaXQgd2FzIGNhbGxlZCBmb3IgYWxyZWFkeSBpbml0aWFsaXplZCBtb2R1bGUuIHJlb3BlblNlc3Npb24gaXMgZmFsc2Ugc28gdGhlIGNhbGwgaXMgaWdub3JlZC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFwcGl1bVVybCkge1xyXG4gICAgICAgICAgICBhcHBpdW1VcmwgPSB0aGlzLm9wdGlvbnMuYXBwaXVtVXJsIHx8IERFRkFVTFRfQVBQSVVNX1VSTDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdhcHAnIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgKG1hbmRhdG9yeSBmb3IgV2luQXBwRHJpdmVyKVxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmFwcCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYXBwID0gREVGQVVMVF9BUFA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBhcHBDYXBWYWwgPSB0aGlzLmNhcHMuYXBwO1xyXG4gICAgICAgICAgICAvLyB0cnkgdG8gcmVzb2x2ZSAnYXBwJyB2YWx1ZSBpbiB0aGUgV2luZG93cyBzdGFuZGFyZCBhcHAgbGlzdFxyXG4gICAgICAgICAgICBjb25zdCBhcHBOYW1lcyA9IE9iamVjdC5rZXlzKFdJTkRPV1NfU1RBTkRBUkRfQVBQX0lEUyk7XHJcbiAgICAgICAgICAgIGlmIChhcHBOYW1lcy5pbmNsdWRlcyhhcHBDYXBWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHMuYXBwID0gV0lORE9XU19TVEFOREFSRF9BUFBfSURTW2FwcENhcFZhbF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgcGxhdGZvcm1OYW1lIGZvciBXaW5BcHBEcml2ZXJcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5wbGF0Zm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLnBsYXRmb3JtTmFtZSA9ICdXaW5kb3dzJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgZGV2aWNlTmFtZSBmb3IgV2luQXBwRHJpdmVyXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhcHMuZGV2aWNlTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9ICdXaW5kb3dzUEMnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgZGVmYXVsdCBwbGF0Zm9ybVZlcnNpb24gZm9yIFdpbkFwcERyaXZlclxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbikge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gJzEuMCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHBvcHVsYXRlIFdESU8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5wYXJzZShhcHBpdW1VcmwpO1xyXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xyXG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XHJcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8IChwcm90b2NvbCA9PT0gJ2h0dHBzJyA/IDQ0MyA6IDgwKSk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZTtcclxuXHJcbiAgICAgICAgLy8gYXV0aCBpcyBuZWVkZWQgbW9zdGx5IGZvciBjbG91ZCBwcm92aWRlcnMgc3VjaCBhcyBMYW1iZGFUZXN0XHJcbiAgICAgICAgaWYgKHVybC5hdXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSB1cmwuYXV0aC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMud2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiBhdXRoWzBdLFxyXG4gICAgICAgICAgICAgICAga2V5OiBhdXRoWzFdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgd2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucy53ZGlvT3B0cyB8fCB7fSxcclxuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxyXG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdCxcclxuICAgICAgICAgICAgcG9ydDogcG9ydCxcclxuICAgICAgICAgICAgcGF0aDogcGF0aCxcclxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB0aGlzLmNhcHMsXHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcclxuICAgICAgICAgICAgcnVubmVyOiAncmVwbCcsXHJcbiAgICAgICAgICAgIHdhaXRmb3JUaW1lb3V0OiA1MDAwLCAvLyBpbmNyZWFzZSB0aGUgZGVmYXVsdCAzMDAwXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IDMxMCoxMDAwLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogMVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVyckhlbHBlci5nZXRBcHBpdW1Jbml0RXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHsgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIHN0YXR1cyA9IHN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghWydDQU5DRUxFRCcsICdGQUlMRUQnXS5pbmNsdWRlcyhzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlU2Vzc2lvbiB3aWxsIHRha2UgNSBtaW4gdG8gY2FsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Vycm9yIGRpc3Bvc2luZyBkcml2ZXI6ICcgKyBlKTsgICAgLy8gaWdub3JlIGFueSBlcnJvcnMgYXQgZGlzcG9zYWwgc3RhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogUHJpdmF0ZVxyXG4gICAgICovXHJcblxyXG4gICAgX2lzQWN0aW9uKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gQUNUSU9OX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIF90YWtlU2NyZWVuc2hvdFNpbGVudChuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFOT19TQ1JFRU5TSE9UX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlKTtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIF9nZXRMb2dzKG5hbWUpIHtcclxuICAgIC8vICAgICBpZiAoIU5PX0xPR1NfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9ncygpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBfYWRqdXN0QXBwaXVtTG9nKGxvZywgc3JjKSB7XHJcbiAgICAgICAgaWYgKCFsb2cgfHwgdHlwZW9mIGxvZyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IGNvbnZlcnQgbG9nLnRpbWVzdGFtcCBmcm9tIHRoZSBkZXZpY2UgdGltZSB6b25lIHRvIHRoZSBsb2NhbCBvbmUgKHNvIHdlIGNhbiBsYXRlciBjb3JyZWxhdGUgYmV0d2VlbiBzdGVwcyBhbmQgbG9ncykgICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwsXHJcbiAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBfaXRlcmF0aW9uU3RhcnQoKSB7XHJcbiAgICAgICAgLy8gY2xlYXIgdHJhbnNhY3Rpb24gbmFtZSBzYXZlZCBpbiBwcmV2aW91cyBpdGVyYXRpb24gaWYgYW55XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBfaXRlcmF0aW9uRW5kKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5TRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWdub3JlIHRoZSByZXN0IGlmIG1vYiBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCBBcHBpdW0gbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QXBwaXVtTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IHRoaXMuZ2V0QXBwaXVtTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZ0VudHJ5IG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZ0VudHJ5LCAnYXBwaXVtJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBBcHBpdW0gbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0b3IgPT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGAvLypbQGlkPVwiJHtsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpfVwiXWA7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ1tuYW1lPVwiJyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICdcIl0nO1xyXG5cclxuICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEhlbHBlckZ1bmN0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IgPSB0aGlzLl9nZXRXZGlvTG9jYXRvcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMubWF0Y2hQYXR0ZXJuID0gbW9kVXRpbHMubWF0Y2hQYXR0ZXJuO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudHMgPSBtb2RVdGlscy5nZXRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuc2V0VGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMuc2V0VGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5yZXN0b3JlVGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXI7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2w7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50VGltZW91dDtcclxuICAgIH1cclxufVxyXG5cclxuIl19
|