appium-geckodriver 0.3.3 → 1.0.3
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/.eslintrc +1 -1
- package/.github/workflows/publish.js.yml +30 -0
- package/.releaserc +18 -0
- package/README.md +14 -7
- package/build/index.js +1 -1
- package/build/lib/commands/find.js +3 -3
- package/build/lib/desired-caps.js +4 -1
- package/build/lib/driver.js +5 -8
- package/build/lib/gecko.js +53 -31
- package/build/lib/logger.js +3 -3
- package/build/lib/server.js +4 -4
- package/build/test/functional/desktop-driver-e2e-specs.js +11 -8
- package/build/test/functional/mobile-driver-e2e-specs.js +11 -8
- package/build/test/utils.js +1 -1
- package/gulpfile.js +2 -1
- package/lib/commands/find.js +1 -1
- package/lib/desired-caps.js +3 -0
- package/lib/driver.js +3 -4
- package/lib/gecko.js +41 -21
- package/lib/logger.js +1 -1
- package/lib/server.js +3 -1
- package/npm-shrinkwrap.json +2383 -0
- package/package.json +13 -9
- package/test/functional/desktop-driver-e2e-specs.js +10 -7
- package/test/functional/mobile-driver-e2e-specs.js +10 -7
package/.eslintrc
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
branches: [ master ]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v2
|
|
13
|
+
- name: Use Node.js 14.x
|
|
14
|
+
uses: actions/setup-node@v1
|
|
15
|
+
with:
|
|
16
|
+
node-version: 14.x
|
|
17
|
+
- run: npm install --production
|
|
18
|
+
name: Install prod dependencies
|
|
19
|
+
- run: rm -rf package-lock.json
|
|
20
|
+
- run: npm shrinkwrap
|
|
21
|
+
- run: npm install --no-package-lock
|
|
22
|
+
name: Install dev dependencies
|
|
23
|
+
- run: npm test
|
|
24
|
+
name: Run NPM Test
|
|
25
|
+
- run: npx semantic-release
|
|
26
|
+
env:
|
|
27
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
28
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
29
|
+
name: Release
|
|
30
|
+
|
package/.releaserc
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugins": [
|
|
3
|
+
["@semantic-release/commit-analyzer", {
|
|
4
|
+
"preset": "angular",
|
|
5
|
+
"releaseRules": [
|
|
6
|
+
{"type": "chore", "release": "patch"}
|
|
7
|
+
|
|
8
|
+
]
|
|
9
|
+
}],
|
|
10
|
+
"@semantic-release/npm",
|
|
11
|
+
"@semantic-release/release-notes-generator",
|
|
12
|
+
["@semantic-release/git", {
|
|
13
|
+
"assets": ["docs", "package.json"],
|
|
14
|
+
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
|
15
|
+
}],
|
|
16
|
+
"@semantic-release/github",
|
|
17
|
+
]
|
|
18
|
+
}
|
package/README.md
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
Appium Geckodriver
|
|
2
2
|
====
|
|
3
3
|
|
|
4
|
+
[](https://npmjs.org/package/appium-geckodriver)
|
|
5
|
+
[](https://npmjs.org/package/appium-geckodriver)
|
|
6
|
+
|
|
7
|
+
[](https://github.com/appium/appium-geckodriver/actions/workflows/publish.js.yml)
|
|
8
|
+
|
|
4
9
|
This is Appium driver for automating Firefox on different platforms, including Android.
|
|
5
10
|
The driver only supports Firefox and Gecko-based web views (Android only) automation using [W3C WebDriver protocol](https://www.w3.org/TR/webdriver/).
|
|
6
11
|
Under the hood this driver is a wrapper/proxy over `geckodriver` binary. Check the driver [release notes](https://github.com/mozilla/geckodriver/releases) and the [official documentation](https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities) to get more details on the supported features and possible pitfalls.
|
|
@@ -18,6 +23,8 @@ Then you need to decide where the automated test is going to be executed. Gecko
|
|
|
18
23
|
|
|
19
24
|
In order to run your automated tests on Android it is necessary to have [Android SDK](https://developer.android.com/studio) installed, so the destination device is marked as `online` in the `adb devices -l` command output.
|
|
20
25
|
|
|
26
|
+
Since the version 1.0.0 this driver is only compatible with Appium 2. Use the `appium driver install gecko` CLI command to add it to your server dist.
|
|
27
|
+
|
|
21
28
|
Gecko driver allows to define multiple criterions for platform selection and also to fine-tune your automation session properties. This could be done via the following session capabilities:
|
|
22
29
|
|
|
23
30
|
Capability Name | Description
|
|
@@ -25,11 +32,12 @@ Capability Name | Description
|
|
|
25
32
|
platformName | Gecko Driver supports the following platforms: `mac`, `linux`, `windows`. The fact your test must be executed on Android is detected based on `moz:firefoxOptions` entry values. Values of platformName are compared case-insensitively.
|
|
26
33
|
browserName | Any value passed to this capability will be changed to 'firefox'.
|
|
27
34
|
browserVersion | Provide the version number of the browser to automate if there are multiple versions installed on the same machine where the driver is running.
|
|
28
|
-
automationName | Must always be set to `Gecko`.
|
|
29
|
-
noReset | Being set to `true` adds the `--connect-existing` argument to the server, that allows to connect to an existing browser instance instead of starting a new browser instance on session startup.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
appium:automationName | Must always be set to `Gecko`.
|
|
36
|
+
appium:noReset | Being set to `true` adds the `--connect-existing` argument to the server, that allows to connect to an existing browser instance instead of starting a new browser instance on session startup.
|
|
37
|
+
appium:marionettePort | Selects the port for Geckodriver’s connection to the Marionette remote protocol. The existing Firefox instance must have Marionette enabled. To enable the remote protocol in Firefox, you can pass the `-marionette` flag. Unless the `marionette.port` preference has been user-set, Marionette will listen on port `2828`, which is the default value for this capability.
|
|
38
|
+
appium:systemPort | The number of the port for the driver to listen on. Must be unique for each session. If not provided then Appium will try to detect it automatically.
|
|
39
|
+
appium:verbosity | The verbosity level of driver logging. By default minimum verbosity is applied. Possible values are `debug` or `trace`.
|
|
40
|
+
appium:androidStorage | See https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-android-storage-var-android-storage-var-code
|
|
33
41
|
moz:firefoxOptions | See https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
|
|
34
42
|
acceptInsecureCerts | See https://www.w3.org/TR/webdriver/#capabilities
|
|
35
43
|
pageLoadStrategy | See https://www.w3.org/TR/webdriver/#capabilities
|
|
@@ -146,4 +154,3 @@ def test_feature_status_page_filters(driver):
|
|
|
146
154
|
npm install
|
|
147
155
|
gulp watch
|
|
148
156
|
```
|
|
149
|
-
|
package/build/index.js
CHANGED
|
@@ -11,13 +11,13 @@ Object.defineProperty(exports, "GeckoDriver", {
|
|
|
11
11
|
return _driver.default;
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
+
exports.default = void 0;
|
|
14
15
|
Object.defineProperty(exports, "startServer", {
|
|
15
16
|
enumerable: true,
|
|
16
17
|
get: function () {
|
|
17
18
|
return _server.startServer;
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
|
-
exports.default = void 0;
|
|
21
21
|
|
|
22
22
|
require("source-map-support/register");
|
|
23
23
|
|
|
@@ -7,13 +7,13 @@ exports.default = exports.commands = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
11
|
|
|
12
12
|
const commands = {};
|
|
13
13
|
exports.commands = commands;
|
|
14
14
|
|
|
15
15
|
commands.findElOrEls = async function findElOrEls(strategy, selector, mult, context) {
|
|
16
|
-
context =
|
|
16
|
+
context = _support.util.unwrapElement(context);
|
|
17
17
|
const endpoint = `/element${context ? `/${context}/element` : ''}${mult ? 's' : ''}`;
|
|
18
18
|
return await this.gecko.proxy.command(endpoint, 'POST', {
|
|
19
19
|
using: strategy,
|
|
@@ -25,4 +25,4 @@ var _default = commands;
|
|
|
25
25
|
exports.default = _default;require('source-map-support').install();
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maW5kLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZmluZEVsT3JFbHMiLCJzdHJhdGVneSIsInNlbGVjdG9yIiwibXVsdCIsImNvbnRleHQiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsImVuZHBvaW50IiwiZ2Vja28iLCJwcm94eSIsImNvbW1hbmQiLCJ1c2luZyIsInZhbHVlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7OztBQUdBQSxRQUFRLENBQUNDLFdBQVQsR0FBdUIsZUFBZUEsV0FBZixDQUE0QkMsUUFBNUIsRUFBc0NDLFFBQXRDLEVBQWdEQyxJQUFoRCxFQUFzREMsT0FBdEQsRUFBK0Q7QUFDcEZBLEVBQUFBLE9BQU8sR0FBR0MsY0FBS0MsYUFBTCxDQUFtQkYsT0FBbkIsQ0FBVjtBQUNBLFFBQU1HLFFBQVEsR0FBSSxXQUFVSCxPQUFPLEdBQUksSUFBR0EsT0FBUSxVQUFmLEdBQTJCLEVBQUcsR0FBRUQsSUFBSSxHQUFHLEdBQUgsR0FBUyxFQUFHLEVBQW5GO0FBRUEsU0FBTyxNQUFNLEtBQUtLLEtBQUwsQ0FBV0MsS0FBWCxDQUFpQkMsT0FBakIsQ0FBeUJILFFBQXpCLEVBQW1DLE1BQW5DLEVBQTJDO0FBQ3RESSxJQUFBQSxLQUFLLEVBQUVWLFFBRCtDO0FBRXREVyxJQUFBQSxLQUFLLEVBQUVWO0FBRitDLEdBQTNDLENBQWI7QUFJRCxDQVJEOztlQVllSCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLy8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBsb29rdXAgYnkgaW1hZ2Ugd29ya2luZ1xuY29tbWFuZHMuZmluZEVsT3JFbHMgPSBhc3luYyBmdW5jdGlvbiBmaW5kRWxPckVscyAoc3RyYXRlZ3ksIHNlbGVjdG9yLCBtdWx0LCBjb250ZXh0KSB7XG4gIGNvbnRleHQgPSB1dGlsLnVud3JhcEVsZW1lbnQoY29udGV4dCk7XG4gIGNvbnN0IGVuZHBvaW50ID0gYC9lbGVtZW50JHtjb250ZXh0ID8gYC8ke2NvbnRleHR9L2VsZW1lbnRgIDogJyd9JHttdWx0ID8gJ3MnIDogJyd9YDtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5nZWNrby5wcm94eS5jb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHtcbiAgICB1c2luZzogc3RyYXRlZ3ksXG4gICAgdmFsdWU6IHNlbGVjdG9yLFxuICB9KTtcbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZmluZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -37,6 +37,9 @@ const desiredCapConstraints = {
|
|
|
37
37
|
systemPort: {
|
|
38
38
|
isNumber: true
|
|
39
39
|
},
|
|
40
|
+
marionettePort: {
|
|
41
|
+
isNumber: true
|
|
42
|
+
},
|
|
40
43
|
verbosity: {
|
|
41
44
|
isString: true,
|
|
42
45
|
inclusionCaseInsensitive: Object.values(_constants.VERBOSITY)
|
|
@@ -52,4 +55,4 @@ const desiredCapConstraints = {
|
|
|
52
55
|
exports.desiredCapConstraints = desiredCapConstraints;require('source-map-support').install();
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXNpcmVkLWNhcHMuanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiYnJvd3Nlck5hbWUiLCJpc1N0cmluZyIsImJyb3dzZXJWZXJzaW9uIiwiYWNjZXB0SW5zZWN1cmVDZXJ0cyIsImlzQm9vbGVhbiIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJwcm94eSIsImlzT2JqZWN0Iiwic2V0V2luZG93UmVjdCIsInRpbWVvdXRzIiwidW5oYW5kbGVkUHJvbXB0QmVoYXZpb3IiLCJzeXN0ZW1Qb3J0IiwiaXNOdW1iZXIiLCJtYXJpb25ldHRlUG9ydCIsInZlcmJvc2l0eSIsImluY2x1c2lvbkNhc2VJbnNlbnNpdGl2ZSIsIk9iamVjdCIsInZhbHVlcyIsIlZFUkJPU0lUWSIsImFuZHJvaWRTdG9yYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRztBQUM1QkMsRUFBQUEsV0FBVyxFQUFFO0FBQ1hDLElBQUFBLFFBQVEsRUFBRTtBQURDLEdBRGU7QUFJNUJDLEVBQUFBLGNBQWMsRUFBRTtBQUNkRCxJQUFBQSxRQUFRLEVBQUU7QUFESSxHQUpZO0FBTzVCRSxFQUFBQSxtQkFBbUIsRUFBRTtBQUNuQkMsSUFBQUEsU0FBUyxFQUFFO0FBRFEsR0FQTztBQVU1QkMsRUFBQUEsZ0JBQWdCLEVBQUU7QUFDaEJKLElBQUFBLFFBQVEsRUFBRTtBQURNLEdBVlU7QUFhNUJLLEVBQUFBLEtBQUssRUFBRTtBQUNMQyxJQUFBQSxRQUFRLEVBQUU7QUFETCxHQWJxQjtBQWdCNUJDLEVBQUFBLGFBQWEsRUFBRTtBQUNiSixJQUFBQSxTQUFTLEVBQUU7QUFERSxHQWhCYTtBQW1CNUJLLEVBQUFBLFFBQVEsRUFBRTtBQUNSRixJQUFBQSxRQUFRLEVBQUU7QUFERixHQW5Ca0I7QUFzQjVCRyxFQUFBQSx1QkFBdUIsRUFBRTtBQUN2QlQsSUFBQUEsUUFBUSxFQUFFO0FBRGEsR0F0Qkc7QUF5QjVCVSxFQUFBQSxVQUFVLEVBQUU7QUFDVkMsSUFBQUEsUUFBUSxFQUFFO0FBREEsR0F6QmdCO0FBNEI1QkMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RELElBQUFBLFFBQVEsRUFBRTtBQURJLEdBNUJZO0FBK0I1QkUsRUFBQUEsU0FBUyxFQUFFO0FBQ1RiLElBQUFBLFFBQVEsRUFBRSxJQUREO0FBRVRjLElBQUFBLHdCQUF3QixFQUFFQyxNQUFNLENBQUNDLE1BQVAsQ0FBY0Msb0JBQWQ7QUFGakIsR0EvQmlCO0FBbUM1QkMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RsQixJQUFBQSxRQUFRLEVBQUUsSUFESTtBQUVkYyxJQUFBQSx3QkFBd0IsRUFBRSxDQUFDLE1BQUQsRUFBUyxLQUFULEVBQWdCLFVBQWhCLEVBQTRCLFFBQTVCO0FBRlosR0FuQ1k7QUF1QzVCLHdCQUFzQjtBQUNwQlIsSUFBQUEsUUFBUSxFQUFFO0FBRFU7QUF2Q00sQ0FBOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWRVJCT1NJVFkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgYnJvd3Nlck5hbWU6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBicm93c2VyVmVyc2lvbjoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFjY2VwdEluc2VjdXJlQ2VydHM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgcGFnZUxvYWRTdHJhdGVneToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHByb3h5OiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgc2V0V2luZG93UmVjdDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICB0aW1lb3V0czoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIHVuaGFuZGxlZFByb21wdEJlaGF2aW9yOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgc3lzdGVtUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIG1hcmlvbmV0dGVQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgdmVyYm9zaXR5OiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBPYmplY3QudmFsdWVzKFZFUkJPU0lUWSlcbiAgfSxcbiAgYW5kcm9pZFN0b3JhZ2U6IHtcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgICBpbmNsdXNpb25DYXNlSW5zZW5zaXRpdmU6IFsnYXV0bycsICdhcHAnLCAnaW50ZXJuYWwnLCAnc2RjYXJkJ11cbiAgfSxcbiAgJ21vejpmaXJlZm94T3B0aW9ucyc6IHtcbiAgICBpc09iamVjdDogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgeyBkZXNpcmVkQ2FwQ29uc3RyYWludHMgfTtcbiJdLCJmaWxlIjoibGliL2Rlc2lyZWQtY2Fwcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
package/build/lib/driver.js
CHANGED
|
@@ -11,9 +11,7 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
17
15
|
|
|
18
16
|
var _gecko = _interopRequireDefault(require("./gecko"));
|
|
19
17
|
|
|
@@ -25,7 +23,7 @@ var _utils = require("./utils");
|
|
|
25
23
|
|
|
26
24
|
const NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/element/[^/]+/elements?$')], ['POST', new RegExp('^/session/[^/]+/elements?$')]];
|
|
27
25
|
|
|
28
|
-
class GeckoDriver extends
|
|
26
|
+
class GeckoDriver extends _baseDriver.BaseDriver {
|
|
29
27
|
constructor(opts = {}) {
|
|
30
28
|
super(opts);
|
|
31
29
|
this.desiredCapConstraints = _desiredCaps.desiredCapConstraints;
|
|
@@ -57,7 +55,7 @@ class GeckoDriver extends _appiumBaseDriver.BaseDriver {
|
|
|
57
55
|
|
|
58
56
|
async createSession(...args) {
|
|
59
57
|
const [sessionId, caps] = await super.createSession(...args);
|
|
60
|
-
this.gecko = new _gecko.default(caps);
|
|
58
|
+
this.gecko = new _gecko.default(this.log, caps);
|
|
61
59
|
|
|
62
60
|
try {
|
|
63
61
|
await this.gecko.start((0, _utils.formatCapsForServer)(caps));
|
|
@@ -72,8 +70,7 @@ class GeckoDriver extends _appiumBaseDriver.BaseDriver {
|
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
async deleteSession() {
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
this.log.info('Ending Gecko Driver session');
|
|
77
74
|
await this.gecko.stop();
|
|
78
75
|
this.resetState();
|
|
79
76
|
await super.deleteSession();
|
|
@@ -85,4 +82,4 @@ var _default = GeckoDriver;
|
|
|
85
82
|
exports.default = _default;require('source-map-support').install();
|
|
86
83
|
|
|
87
84
|
|
|
88
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiTk9fUFJPWFkiLCJSZWdFeHAiLCJHZWNrb0RyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJsb2NhdG9yU3RyYXRlZ2llcyIsInJlc2V0U3RhdGUiLCJjbWQiLCJmbiIsIl8iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJnZWNrbyIsInByb3h5UmVxUmVzIiwiaXNQcm94eUFjdGl2ZSIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsIkdlY2tvRHJpdmVyU2VydmVyIiwibG9nIiwic3RhcnQiLCJlIiwiZGVsZXRlU2Vzc2lvbiIsInByb3h5IiwiYmluZCIsImluZm8iLCJzdG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBRCxFQUFRLElBQUlDLE1BQUosQ0FBVyx3QkFBWCxDQUFSLENBRGUsRUFFZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsd0JBQVgsQ0FBVCxDQUZlLEVBR2YsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLDBDQUFYLENBQVQsQ0FIZSxFQUlmLENBQUMsTUFBRCxFQUFTLElBQUlBLE1BQUosQ0FBVyw0QkFBWCxDQUFULENBSmUsQ0FBakI7O0FBT0EsTUFBTUMsV0FBTixTQUEwQkMsc0JBQTFCLENBQXFDO0FBQ25DQyxFQUFBQSxXQUFXLENBQUVDLElBQUksR0FBRyxFQUFULEVBQWE7QUFDdEIsVUFBTUEsSUFBTjtBQUNBLFNBQUtDLHFCQUFMLEdBQTZCQSxrQ0FBN0I7QUFDQSxTQUFLQyxpQkFBTCxHQUF5QixDQUN2QixPQUR1QixFQUV2QixVQUZ1QixFQUd2QixXQUh1QixFQUl2QixtQkFKdUIsRUFLdkIsY0FMdUIsRUFPdkIsSUFQdUIsRUFRdkIsTUFSdUIsQ0FBekI7QUFVQSxTQUFLQyxVQUFMOztBQUVBLFNBQUssTUFBTSxDQUFDQyxHQUFELEVBQU1DLEVBQU4sQ0FBWCxJQUF3QkMsZ0JBQUVDLE9BQUYsQ0FBVUMsY0FBVixDQUF4QixFQUE2QztBQUMzQ1gsTUFBQUEsV0FBVyxDQUFDWSxTQUFaLENBQXNCTCxHQUF0QixJQUE2QkMsRUFBN0I7QUFDRDtBQUNGOztBQUVERixFQUFBQSxVQUFVLEdBQUk7QUFDWixTQUFLTyxLQUFMLEdBQWEsSUFBYjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0Q7O0FBRURDLEVBQUFBLFdBQVcsR0FBSTtBQUNiLFdBQU8sS0FBS0QsYUFBWjtBQUNEOztBQUVERSxFQUFBQSxpQkFBaUIsR0FBSTtBQUNuQixXQUFPbkIsUUFBUDtBQUNEOztBQUVEb0IsRUFBQUEsUUFBUSxHQUFJO0FBQ1YsV0FBTyxJQUFQO0FBQ0Q7O0FBRWtCLFFBQWJDLGFBQWEsQ0FBRSxHQUFHQyxJQUFMLEVBQVc7QUFDNUIsVUFBTSxDQUFDQyxTQUFELEVBQVlDLElBQVosSUFBb0IsTUFBTSxNQUFNSCxhQUFOLENBQW9CLEdBQUdDLElBQXZCLENBQWhDO0FBQ0EsU0FBS1AsS0FBTCxHQUFhLElBQUlVLGNBQUosQ0FBc0IsS0FBS0MsR0FBM0IsRUFBZ0NGLElBQWhDLENBQWI7O0FBQ0EsUUFBSTtBQUNGLFlBQU0sS0FBS1QsS0FBTCxDQUFXWSxLQUFYLENBQWlCLGdDQUFvQkgsSUFBcEIsQ0FBakIsQ0FBTjtBQUNELEtBRkQsQ0FFRSxPQUFPSSxDQUFQLEVBQVU7QUFDVixZQUFNLEtBQUtDLGFBQUwsRUFBTjtBQUNBLFlBQU1ELENBQU47QUFDRDs7QUFDRCxTQUFLWixXQUFMLEdBQW1CLEtBQUtELEtBQUwsQ0FBV2UsS0FBWCxDQUFpQmQsV0FBakIsQ0FBNkJlLElBQTdCLENBQWtDLEtBQUtoQixLQUFMLENBQVdlLEtBQTdDLENBQW5CO0FBQ0EsU0FBS2IsYUFBTCxHQUFxQixJQUFyQjtBQUNBLFdBQU8sQ0FBQ00sU0FBRCxFQUFZQyxJQUFaLENBQVA7QUFDRDs7QUFFa0IsUUFBYkssYUFBYSxHQUFJO0FBQ3JCLFNBQUtILEdBQUwsQ0FBU00sSUFBVCxDQUFjLDZCQUFkO0FBQ0EsVUFBTSxLQUFLakIsS0FBTCxDQUFXa0IsSUFBWCxFQUFOO0FBQ0EsU0FBS3pCLFVBQUw7QUFFQSxVQUFNLE1BQU1xQixhQUFOLEVBQU47QUFDRDs7QUEzRGtDOztlQThEdEIzQixXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBHZWNrb0RyaXZlclNlcnZlciBmcm9tICcuL2dlY2tvJztcbmltcG9ydCB7IGRlc2lyZWRDYXBDb25zdHJhaW50cyB9IGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzL2luZGV4JztcbmltcG9ydCB7IGZvcm1hdENhcHNGb3JTZXJ2ZXIgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZWxlbWVudHM/JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnRzPyQnKV0sXG5dO1xuXG5jbGFzcyBHZWNrb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIob3B0cyk7XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAndGFnIG5hbWUnLFxuICAgICAgJ2xpbmsgdGV4dCcsXG4gICAgICAncGFydGlhbCBsaW5rIHRleHQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAvLyBMZXQgdGhlc2UgdHdvIHJlYWNoIEdlY2tvIERyaXZlciBhbmQgZmFpbCB0aGVyZSB3aXRoIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2VcbiAgICAgICdpZCcsXG4gICAgICAnbmFtZScsXG4gICAgXTtcbiAgICB0aGlzLnJlc2V0U3RhdGUoKTtcblxuICAgIGZvciAoY29uc3QgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgICAgIEdlY2tvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTdGF0ZSAoKSB7XG4gICAgdGhpcy5nZWNrbyA9IG51bGw7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gICAgdGhpcy5pc1Byb3h5QWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm94eUFjdGl2ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0ICgpIHtcbiAgICByZXR1cm4gTk9fUFJPWFk7XG4gIH1cblxuICBjYW5Qcm94eSAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuICAgIHRoaXMuZ2Vja28gPSBuZXcgR2Vja29Ecml2ZXJTZXJ2ZXIodGhpcy5sb2csIGNhcHMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmdlY2tvLnN0YXJ0KGZvcm1hdENhcHNGb3JTZXJ2ZXIoY2FwcykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZ2Vja28ucHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmdlY2tvLnByb3h5KTtcbiAgICB0aGlzLmlzUHJveHlBY3RpdmUgPSB0cnVlO1xuICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ0VuZGluZyBHZWNrbyBEcml2ZXIgc2Vzc2lvbicpO1xuICAgIGF3YWl0IHRoaXMuZ2Vja28uc3RvcCgpO1xuICAgIHRoaXMucmVzZXRTdGF0ZSgpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlY2tvRHJpdmVyO1xuIl0sImZpbGUiOiJsaWIvZHJpdmVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
package/build/lib/gecko.js
CHANGED
|
@@ -15,9 +15,9 @@ var _os = _interopRequireDefault(require("os"));
|
|
|
15
15
|
|
|
16
16
|
var _path = _interopRequireDefault(require("path"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _baseDriver = require("@appium/base-driver");
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _support = require("@appium/support");
|
|
21
21
|
|
|
22
22
|
var _teen_process = require("teen_process");
|
|
23
23
|
|
|
@@ -29,21 +29,28 @@ var _child_process = require("child_process");
|
|
|
29
29
|
|
|
30
30
|
var _constants = require("./constants");
|
|
31
31
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const GD_BINARY = `geckodriver${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
|
|
32
|
+
const GD_BINARY = `geckodriver${_support.system.isWindows() ? '.exe' : ''}`;
|
|
35
33
|
const STARTUP_TIMEOUT_MS = 10000;
|
|
36
34
|
const GECKO_PORT_RANGE = [5200, 5300];
|
|
37
35
|
|
|
38
|
-
const GECKO_SERVER_GUARD =
|
|
36
|
+
const GECKO_SERVER_GUARD = _support.util.getLockFileGuard(_path.default.resolve(_os.default.tmpdir(), 'gecko_server_guard.lock'), {
|
|
39
37
|
timeout: 5,
|
|
40
38
|
tryRecovery: true
|
|
41
39
|
});
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
const DEFAULT_MARIONETTE_PORT = 2828;
|
|
42
|
+
const PROCESS_SPECIFIC_OPTION_NAMES_MAP = Object.freeze({
|
|
43
|
+
noReset: 'noReset',
|
|
44
|
+
verbosity: 'verbosity',
|
|
45
|
+
androidStorage: 'androidStorage',
|
|
46
|
+
marionettePort: 'marionettePort',
|
|
47
|
+
systemPort: 'port'
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
class GeckoProxy extends _baseDriver.JWProxy {
|
|
44
51
|
async proxyCommand(url, method, body = null) {
|
|
45
52
|
if (this.didProcessExit) {
|
|
46
|
-
throw new
|
|
53
|
+
throw new _baseDriver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to Gecko Driver server because ` + 'its process is not running (probably crashed). Check the Appium log for more details');
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
return await super.proxyCommand(url, method, body);
|
|
@@ -52,19 +59,19 @@ class GeckoProxy extends _appiumBaseDriver.JWProxy {
|
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
class GeckoDriverProcess {
|
|
55
|
-
constructor(opts = {}) {
|
|
56
|
-
for (const optName of
|
|
57
|
-
this[
|
|
62
|
+
constructor(log, opts = {}) {
|
|
63
|
+
for (const [optName, propName] of _lodash.default.toPairs(PROCESS_SPECIFIC_OPTION_NAMES_MAP)) {
|
|
64
|
+
this[propName] = opts[optName];
|
|
58
65
|
}
|
|
59
66
|
|
|
60
|
-
this.
|
|
67
|
+
this.log = log;
|
|
61
68
|
this.proc = null;
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
get isRunning() {
|
|
65
72
|
var _this$proc;
|
|
66
73
|
|
|
67
|
-
return !!((_this$proc = this.proc)
|
|
74
|
+
return !!((_this$proc = this.proc) !== null && _this$proc !== void 0 && _this$proc.isRunning);
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
async init() {
|
|
@@ -87,7 +94,7 @@ class GeckoDriverProcess {
|
|
|
87
94
|
let driverBin;
|
|
88
95
|
|
|
89
96
|
try {
|
|
90
|
-
driverBin = await
|
|
97
|
+
driverBin = await _support.fs.which(GD_BINARY);
|
|
91
98
|
} catch (e) {
|
|
92
99
|
throw new Error(`${GD_BINARY} binary cannot be found in PATH. ` + `Please make sure it is present on your system`);
|
|
93
100
|
}
|
|
@@ -105,7 +112,18 @@ class GeckoDriverProcess {
|
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
if (this.noReset) {
|
|
115
|
+
var _this$marionettePort;
|
|
116
|
+
|
|
108
117
|
args.push('--connect-existing');
|
|
118
|
+
|
|
119
|
+
if (_lodash.default.isNil(this.marionettePort)) {
|
|
120
|
+
this.log.info(`'marionettePort' capability value is not provided while 'noReset' is enabled`);
|
|
121
|
+
this.log.info(`Assigning 'marionettePort' to the default value (${DEFAULT_MARIONETTE_PORT})`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
args.push('--marionette-port', (_this$marionettePort = this.marionettePort) !== null && _this$marionettePort !== void 0 ? _this$marionettePort : DEFAULT_MARIONETTE_PORT);
|
|
125
|
+
} else if (!_lodash.default.isNil(this.marionettePort)) {
|
|
126
|
+
args.push('--marionette-port', this.marionettePort);
|
|
109
127
|
}
|
|
110
128
|
|
|
111
129
|
args.push('-p', this.port);
|
|
@@ -119,13 +137,13 @@ class GeckoDriverProcess {
|
|
|
119
137
|
const line = _lodash.default.trim(stdout || stderr);
|
|
120
138
|
|
|
121
139
|
if (line) {
|
|
122
|
-
log.debug(`[${GD_BINARY}] ${line}`);
|
|
140
|
+
this.log.debug(`[${GD_BINARY}] ${line}`);
|
|
123
141
|
}
|
|
124
142
|
});
|
|
125
143
|
this.proc.on('exit', (code, signal) => {
|
|
126
|
-
log.info(`${GD_BINARY} has exited with code ${code}, signal ${signal}`);
|
|
144
|
+
this.log.info(`${GD_BINARY} has exited with code ${code}, signal ${signal}`);
|
|
127
145
|
});
|
|
128
|
-
log.info(`Starting '${driverBin}' with args ${JSON.stringify(args)}`);
|
|
146
|
+
this.log.info(`Starting '${driverBin}' with args ${JSON.stringify(args)}`);
|
|
129
147
|
await this.proc.start(0);
|
|
130
148
|
}
|
|
131
149
|
|
|
@@ -147,25 +165,28 @@ class GeckoDriverProcess {
|
|
|
147
165
|
|
|
148
166
|
const RUNNING_PROCESS_IDS = [];
|
|
149
167
|
process.once('exit', () => {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
try {
|
|
154
|
-
(0, _child_process.execSync)(command);
|
|
155
|
-
} catch (ign) {}
|
|
168
|
+
if (_lodash.default.isEmpty(RUNNING_PROCESS_IDS)) {
|
|
169
|
+
return;
|
|
156
170
|
}
|
|
171
|
+
|
|
172
|
+
const command = _support.system.isWindows() ? 'taskkill.exe ' + RUNNING_PROCESS_IDS.map(pid => `/PID ${pid}`).join(' ') : `kill ${RUNNING_PROCESS_IDS.join(' ')}`;
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
(0, _child_process.execSync)(command);
|
|
176
|
+
} catch (ign) {}
|
|
157
177
|
});
|
|
158
178
|
|
|
159
179
|
class GeckoDriverServer {
|
|
160
|
-
constructor(caps) {
|
|
161
|
-
this.process = new GeckoDriverProcess(caps);
|
|
180
|
+
constructor(log, caps) {
|
|
181
|
+
this.process = new GeckoDriverProcess(log, caps);
|
|
182
|
+
this.log = log;
|
|
162
183
|
this.proxy = null;
|
|
163
184
|
}
|
|
164
185
|
|
|
165
186
|
get isRunning() {
|
|
166
187
|
var _this$process;
|
|
167
188
|
|
|
168
|
-
return !!((_this$process = this.process)
|
|
189
|
+
return !!((_this$process = this.process) !== null && _this$process !== void 0 && _this$process.isRunning);
|
|
169
190
|
}
|
|
170
191
|
|
|
171
192
|
async start(geckoCaps) {
|
|
@@ -173,6 +194,7 @@ class GeckoDriverServer {
|
|
|
173
194
|
this.proxy = new GeckoProxy({
|
|
174
195
|
server: '127.0.0.1',
|
|
175
196
|
port: this.process.port,
|
|
197
|
+
log: this.log,
|
|
176
198
|
base: '',
|
|
177
199
|
keepAlive: true
|
|
178
200
|
});
|
|
@@ -224,22 +246,22 @@ class GeckoDriverServer {
|
|
|
224
246
|
var _this$proxy;
|
|
225
247
|
|
|
226
248
|
if (!this.isRunning) {
|
|
227
|
-
log.info(`Gecko Driver session cannot be stopped, because the server is not running`);
|
|
249
|
+
this.log.info(`Gecko Driver session cannot be stopped, because the server is not running`);
|
|
228
250
|
return;
|
|
229
251
|
}
|
|
230
252
|
|
|
231
|
-
if ((_this$proxy = this.proxy)
|
|
253
|
+
if ((_this$proxy = this.proxy) !== null && _this$proxy !== void 0 && _this$proxy.sessionId) {
|
|
232
254
|
try {
|
|
233
255
|
await this.proxy.command(`/session/${this.proxy.sessionId}`, 'DELETE');
|
|
234
256
|
} catch (e) {
|
|
235
|
-
log.info(`Gecko Driver session cannot be deleted. Original error: ${e.message}`);
|
|
257
|
+
this.log.info(`Gecko Driver session cannot be deleted. Original error: ${e.message}`);
|
|
236
258
|
}
|
|
237
259
|
}
|
|
238
260
|
|
|
239
261
|
try {
|
|
240
262
|
await this.process.stop();
|
|
241
263
|
} catch (e) {
|
|
242
|
-
log.warn(`Gecko Driver process cannot be stopped (${e.message}). Killing it forcefully`);
|
|
264
|
+
this.log.warn(`Gecko Driver process cannot be stopped (${e.message}). Killing it forcefully`);
|
|
243
265
|
await this.process.kill();
|
|
244
266
|
}
|
|
245
267
|
}
|
|
@@ -250,4 +272,4 @@ var _default = GeckoDriverServer;
|
|
|
250
272
|
exports.default = _default;require('source-map-support').install();
|
|
251
273
|
|
|
252
274
|
|
|
253
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9nZWNrby5qcyJdLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJHRF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJHRUNLT19QT1JUX1JBTkdFIiwiR0VDS09fU0VSVkVSX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiR2Vja29Qcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkUHJvY2Vzc0V4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiR2Vja29Ecml2ZXJQcm9jZXNzIiwiY29uc3RydWN0b3IiLCJvcHRzIiwib3B0TmFtZSIsInBvcnQiLCJzeXN0ZW1Qb3J0IiwicHJvYyIsImlzUnVubmluZyIsImluaXQiLCJzdGFydFBvcnQiLCJlbmRQb3J0IiwiZSIsIkVycm9yIiwiZHJpdmVyQmluIiwiZnMiLCJ3aGljaCIsImFyZ3MiLCJfIiwidG9Mb3dlciIsInZlcmJvc2l0eSIsIlZFUkJPU0lUWSIsIkRFQlVHIiwicHVzaCIsIlRSQUNFIiwibm9SZXNldCIsImFuZHJvaWRTdG9yYWdlIiwiU3ViUHJvY2VzcyIsIm9uIiwic3Rkb3V0Iiwic3RkZXJyIiwibGluZSIsInRyaW0iLCJkZWJ1ZyIsImNvZGUiLCJzaWduYWwiLCJpbmZvIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0Iiwic3RvcCIsImtpbGwiLCJpZ24iLCJSVU5OSU5HX1BST0NFU1NfSURTIiwicHJvY2VzcyIsIm9uY2UiLCJwaWQiLCJjb21tYW5kIiwiR2Vja29Ecml2ZXJTZXJ2ZXIiLCJjYXBzIiwicHJveHkiLCJnZWNrb0NhcHMiLCJzZXJ2ZXIiLCJiYXNlIiwia2VlcEFsaXZlIiwiZXJyIiwibWVzc2FnZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwicHVsbCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsInNlc3Npb25JZCIsIndhcm4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixtQkFBakIsQ0FBWjs7QUFFQSxNQUFNQyxTQUFTLEdBQUksY0FBYUMsc0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUFqRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEtBQTNCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBR0Msb0JBQUtDLGdCQUFMLENBQ3pCQyxjQUFLQyxPQUFMLENBQWFDLFlBQUdDLE1BQUgsRUFBYixFQUEwQix5QkFBMUIsQ0FEeUIsRUFFekI7QUFBQ0MsRUFBQUEsT0FBTyxFQUFFLENBQVY7QUFBYUMsRUFBQUEsV0FBVyxFQUFFO0FBQTFCLENBRnlCLENBQTNCOztBQU1BLE1BQU1DLFVBQU4sU0FBeUJDLHlCQUF6QixDQUFpQztBQUMvQixRQUFNQyxZQUFOLENBQW9CQyxHQUFwQixFQUF5QkMsTUFBekIsRUFBaUNDLElBQUksR0FBRyxJQUF4QyxFQUE4QztBQUM1QyxRQUFJLEtBQUtDLGNBQVQsRUFBeUI7QUFDdkIsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0Esc0ZBRkksQ0FBTjtBQUdEOztBQUNELFdBQU8sTUFBTSxNQUFNRCxZQUFOLENBQW1CQyxHQUFuQixFQUF3QkMsTUFBeEIsRUFBZ0NDLElBQWhDLENBQWI7QUFDRDs7QUFSOEI7O0FBV2pDLE1BQU1JLGtCQUFOLENBQXlCO0FBQ3ZCQyxFQUFBQSxXQUFXLENBQUVDLElBQUksR0FBRyxFQUFULEVBQWE7QUFDdEIsU0FBSyxNQUFNQyxPQUFYLElBQXNCLENBQUMsU0FBRCxFQUFZLFdBQVosRUFBeUIsZ0JBQXpCLENBQXRCLEVBQWtFO0FBQ2hFLFdBQUtBLE9BQUwsSUFBZ0JELElBQUksQ0FBQ0MsT0FBRCxDQUFwQjtBQUNEOztBQUNELFNBQUtDLElBQUwsR0FBWUYsSUFBSSxDQUFDRyxVQUFqQjtBQUNBLFNBQUtDLElBQUwsR0FBWSxJQUFaO0FBQ0Q7O0FBRUQsTUFBSUMsU0FBSixHQUFpQjtBQUFBOztBQUNmLFdBQU8sQ0FBQyxnQkFBRSxLQUFLRCxJQUFQLCtDQUFFLFdBQVdDLFNBQWIsQ0FBUjtBQUNEOztBQUVELFFBQU1DLElBQU4sR0FBYztBQUNaLFFBQUksS0FBS0QsU0FBVCxFQUFvQjtBQUNsQjtBQUNEOztBQUVELFFBQUksQ0FBQyxLQUFLSCxJQUFWLEVBQWdCO0FBQ2QsWUFBTXRCLGtCQUFrQixDQUFDLFlBQVk7QUFDbkMsY0FBTSxDQUFDMkIsU0FBRCxFQUFZQyxPQUFaLElBQXVCN0IsZ0JBQTdCOztBQUNBLFlBQUk7QUFDRixlQUFLdUIsSUFBTCxHQUFZLE1BQU0sb0NBQWtCSyxTQUFsQixFQUE2QkMsT0FBN0IsQ0FBbEI7QUFDRCxTQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVO0FBQ1YsZ0JBQU0sSUFBSUMsS0FBSixDQUNILHNDQUFxQ0gsU0FBVSxLQUFJQyxPQUFRLElBQTVELEdBQ0Msb0ZBREQsR0FFQywrRkFIRyxDQUFOO0FBSUQ7QUFDRixPQVZ1QixDQUF4QjtBQVdEOztBQUVELFFBQUlHLFNBQUo7O0FBQ0EsUUFBSTtBQUNGQSxNQUFBQSxTQUFTLEdBQUcsTUFBTUMsa0JBQUdDLEtBQUgsQ0FBU3RDLFNBQVQsQ0FBbEI7QUFDRCxLQUZELENBRUUsT0FBT2tDLENBQVAsRUFBVTtBQUNWLFlBQU0sSUFBSUMsS0FBSixDQUFXLEdBQUVuQyxTQUFVLG1DQUFiLEdBQ2IsK0NBREcsQ0FBTjtBQUVEOztBQUNELFVBQU11QyxJQUFJLEdBQUcsRUFBYjs7QUFFQSxZQUFRQyxnQkFBRUMsT0FBRixDQUFVLEtBQUtDLFNBQWYsQ0FBUjtBQUNFLFdBQUtDLHFCQUFVQyxLQUFmO0FBQ0VMLFFBQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVLElBQVY7QUFDQTs7QUFDRixXQUFLRixxQkFBVUcsS0FBZjtBQUNFUCxRQUFBQSxJQUFJLENBQUNNLElBQUwsQ0FBVSxLQUFWO0FBQ0E7QUFOSjs7QUFRQSxRQUFJLEtBQUtFLE9BQVQsRUFBa0I7QUFDaEJSLE1BQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVLG9CQUFWO0FBQ0Q7O0FBR0ROLElBQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVLElBQVYsRUFBZ0IsS0FBS2xCLElBQXJCOztBQUNBLFFBQUksS0FBS3FCLGNBQVQsRUFBeUI7QUFDdkJULE1BQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVLG1CQUFWLEVBQStCLEtBQUtHLGNBQXBDO0FBQ0Q7O0FBQ0QsU0FBS25CLElBQUwsR0FBWSxJQUFJb0Isd0JBQUosQ0FBZWIsU0FBZixFQUEwQkcsSUFBMUIsQ0FBWjtBQUNBLFNBQUtWLElBQUwsQ0FBVXFCLEVBQVYsQ0FBYSxRQUFiLEVBQXVCLENBQUNDLE1BQUQsRUFBU0MsTUFBVCxLQUFvQjtBQUN6QyxZQUFNQyxJQUFJLEdBQUdiLGdCQUFFYyxJQUFGLENBQU9ILE1BQU0sSUFBSUMsTUFBakIsQ0FBYjs7QUFDQSxVQUFJQyxJQUFKLEVBQVU7QUFDUnhELFFBQUFBLEdBQUcsQ0FBQzBELEtBQUosQ0FBVyxJQUFHdkQsU0FBVSxLQUFJcUQsSUFBSyxFQUFqQztBQUNEO0FBQ0YsS0FMRDtBQU1BLFNBQUt4QixJQUFMLENBQVVxQixFQUFWLENBQWEsTUFBYixFQUFxQixDQUFDTSxJQUFELEVBQU9DLE1BQVAsS0FBa0I7QUFDckM1RCxNQUFBQSxHQUFHLENBQUM2RCxJQUFKLENBQVUsR0FBRTFELFNBQVUseUJBQXdCd0QsSUFBSyxZQUFXQyxNQUFPLEVBQXJFO0FBQ0QsS0FGRDtBQUdBNUQsSUFBQUEsR0FBRyxDQUFDNkQsSUFBSixDQUFVLGFBQVl0QixTQUFVLGVBQWN1QixJQUFJLENBQUNDLFNBQUwsQ0FBZXJCLElBQWYsQ0FBcUIsRUFBbkU7QUFDQSxVQUFNLEtBQUtWLElBQUwsQ0FBVWdDLEtBQVYsQ0FBZ0IsQ0FBaEIsQ0FBTjtBQUNEOztBQUVELFFBQU1DLElBQU4sR0FBYztBQUNaLFFBQUksS0FBS2hDLFNBQVQsRUFBb0I7QUFDbEIsWUFBTSxLQUFLRCxJQUFMLENBQVVpQyxJQUFWLENBQWUsU0FBZixDQUFOO0FBQ0Q7QUFDRjs7QUFFRCxRQUFNQyxJQUFOLEdBQWM7QUFDWixRQUFJLEtBQUtqQyxTQUFULEVBQW9CO0FBQ2xCLFVBQUk7QUFDRixjQUFNLEtBQUtELElBQUwsQ0FBVWlDLElBQVYsQ0FBZSxTQUFmLENBQU47QUFDRCxPQUZELENBRUUsT0FBT0UsR0FBUCxFQUFZLENBQUU7QUFDakI7QUFDRjs7QUFwRnNCOztBQXVGekIsTUFBTUMsbUJBQW1CLEdBQUcsRUFBNUI7QUFDQUMsT0FBTyxDQUFDQyxJQUFSLENBQWEsTUFBYixFQUFxQixNQUFNO0FBQ3pCLE9BQUssTUFBTUMsR0FBWCxJQUFrQkgsbUJBQWxCLEVBQXVDO0FBQ3JDLFVBQU1JLE9BQU8sR0FBR3BFLHNCQUFPQyxTQUFQLEtBQXNCLHFCQUFvQmtFLEdBQUksRUFBOUMsR0FBbUQsUUFBT0EsR0FBSSxFQUE5RTs7QUFDQSxRQUFJO0FBQ0YsbUNBQVNDLE9BQVQ7QUFDRCxLQUZELENBRUUsT0FBT0wsR0FBUCxFQUFZLENBQUU7QUFDakI7QUFDRixDQVBEOztBQVNBLE1BQU1NLGlCQUFOLENBQXdCO0FBQ3RCOUMsRUFBQUEsV0FBVyxDQUFFK0MsSUFBRixFQUFRO0FBQ2pCLFNBQUtMLE9BQUwsR0FBZSxJQUFJM0Msa0JBQUosQ0FBdUJnRCxJQUF2QixDQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQWI7QUFDRDs7QUFFRCxNQUFJMUMsU0FBSixHQUFpQjtBQUFBOztBQUNmLFdBQU8sQ0FBQyxtQkFBRSxLQUFLb0MsT0FBUCxrREFBRSxjQUFjcEMsU0FBaEIsQ0FBUjtBQUNEOztBQUVELFFBQU0rQixLQUFOLENBQWFZLFNBQWIsRUFBd0I7QUFDdEIsVUFBTSxLQUFLUCxPQUFMLENBQWFuQyxJQUFiLEVBQU47QUFFQSxTQUFLeUMsS0FBTCxHQUFhLElBQUkxRCxVQUFKLENBQWU7QUFDMUI0RCxNQUFBQSxNQUFNLEVBQUUsV0FEa0I7QUFFMUIvQyxNQUFBQSxJQUFJLEVBQUUsS0FBS3VDLE9BQUwsQ0FBYXZDLElBRk87QUFHMUJnRCxNQUFBQSxJQUFJLEVBQUUsRUFIb0I7QUFJMUJDLE1BQUFBLFNBQVMsRUFBRTtBQUplLEtBQWYsQ0FBYjtBQU1BLFNBQUtKLEtBQUwsQ0FBV3BELGNBQVgsR0FBNEIsS0FBNUI7QUFDQSxTQUFLOEMsT0FBTCxDQUFhckMsSUFBYixDQUFrQnFCLEVBQWxCLENBQXFCLE1BQXJCLEVBQTZCLE1BQU07QUFDakMsV0FBS3NCLEtBQUwsQ0FBV3BELGNBQVgsR0FBNEIsSUFBNUI7QUFDRCxLQUZEOztBQUlBLFFBQUk7QUFDRixZQUFNLGdDQUFpQixZQUFZO0FBQ2pDLFlBQUk7QUFDRixnQkFBTSxLQUFLb0QsS0FBTCxDQUFXSCxPQUFYLENBQW1CLFNBQW5CLEVBQThCLEtBQTlCLENBQU47QUFDQSxpQkFBTyxJQUFQO0FBQ0QsU0FIRCxDQUdFLE9BQU9RLEdBQVAsRUFBWTtBQUNaLGNBQUksS0FBS0wsS0FBTCxDQUFXcEQsY0FBZixFQUErQjtBQUM3QixrQkFBTSxJQUFJZSxLQUFKLENBQVUwQyxHQUFHLENBQUNDLE9BQWQsQ0FBTjtBQUNEOztBQUNELGlCQUFPLEtBQVA7QUFDRDtBQUNGLE9BVkssRUFVSDtBQUNEQyxRQUFBQSxNQUFNLEVBQUU1RSxrQkFEUDtBQUVENkUsUUFBQUEsVUFBVSxFQUFFO0FBRlgsT0FWRyxDQUFOO0FBY0QsS0FmRCxDQWVFLE9BQU85QyxDQUFQLEVBQVU7QUFDVixVQUFJLEtBQUtnQyxPQUFMLENBQWFwQyxTQUFqQixFQUE0QjtBQUUxQixjQUFNLEtBQUtvQyxPQUFMLENBQWFILElBQWIsRUFBTjtBQUNEOztBQUNELFVBQUksa0JBQWtCa0IsSUFBbEIsQ0FBdUIvQyxDQUFDLENBQUM0QyxPQUF6QixDQUFKLEVBQXVDO0FBQ3JDLGNBQU0sSUFBSTNDLEtBQUosQ0FBVywrQ0FBOENoQyxrQkFBbUIsY0FBbEUsR0FDYix3REFERyxDQUFOO0FBRUQ7O0FBQ0QsWUFBTStCLENBQU47QUFDRDs7QUFDRCxVQUFNa0MsR0FBRyxHQUFHLEtBQUtGLE9BQUwsQ0FBYXJDLElBQWIsQ0FBa0J1QyxHQUE5QjtBQUNBSCxJQUFBQSxtQkFBbUIsQ0FBQ3BCLElBQXBCLENBQXlCdUIsR0FBekI7QUFDQSxTQUFLRixPQUFMLENBQWFyQyxJQUFiLENBQWtCcUIsRUFBbEIsQ0FBcUIsTUFBckIsRUFBNkIsTUFBTSxLQUFLVixnQkFBRTBDLElBQUYsQ0FBT2pCLG1CQUFQLEVBQTRCRyxHQUE1QixDQUF4QztBQUVBLFVBQU0sS0FBS0ksS0FBTCxDQUFXSCxPQUFYLENBQW1CLFVBQW5CLEVBQStCLE1BQS9CLEVBQXVDO0FBQzNDYyxNQUFBQSxZQUFZLEVBQUU7QUFDWkMsUUFBQUEsVUFBVSxFQUFFLENBQUMsRUFBRCxDQURBO0FBRVpDLFFBQUFBLFdBQVcsRUFBRVo7QUFGRDtBQUQ2QixLQUF2QyxDQUFOO0FBTUQ7O0FBRUQsUUFBTVgsSUFBTixHQUFjO0FBQUE7O0FBQ1osUUFBSSxDQUFDLEtBQUtoQyxTQUFWLEVBQXFCO0FBQ25CakMsTUFBQUEsR0FBRyxDQUFDNkQsSUFBSixDQUFVLDJFQUFWO0FBQ0E7QUFDRDs7QUFFRCx1QkFBSSxLQUFLYyxLQUFULGdEQUFJLFlBQVljLFNBQWhCLEVBQTJCO0FBQ3pCLFVBQUk7QUFDRixjQUFNLEtBQUtkLEtBQUwsQ0FBV0gsT0FBWCxDQUFvQixZQUFXLEtBQUtHLEtBQUwsQ0FBV2MsU0FBVSxFQUFwRCxFQUF1RCxRQUF2RCxDQUFOO0FBQ0QsT0FGRCxDQUVFLE9BQU9wRCxDQUFQLEVBQVU7QUFDVnJDLFFBQUFBLEdBQUcsQ0FBQzZELElBQUosQ0FBVSwyREFBMER4QixDQUFDLENBQUM0QyxPQUFRLEVBQTlFO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJO0FBQ0YsWUFBTSxLQUFLWixPQUFMLENBQWFKLElBQWIsRUFBTjtBQUNELEtBRkQsQ0FFRSxPQUFPNUIsQ0FBUCxFQUFVO0FBQ1ZyQyxNQUFBQSxHQUFHLENBQUMwRixJQUFKLENBQVUsMkNBQTBDckQsQ0FBQyxDQUFDNEMsT0FBUSwwQkFBOUQ7QUFDQSxZQUFNLEtBQUtaLE9BQUwsQ0FBYUgsSUFBYixFQUFOO0FBQ0Q7QUFDRjs7QUFsRnFCOztlQXFGVE8saUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHV0aWwsIHN5c3RlbSB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IFZFUkJPU0lUWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignR2Vja29Ecml2ZXJTZXJ2ZXInKTtcblxuY29uc3QgR0RfQklOQVJZID0gYGdlY2tvZHJpdmVyJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgU1RBUlRVUF9USU1FT1VUX01TID0gMTAwMDA7IC8vIDEwIHNlY29uZHNcbmNvbnN0IEdFQ0tPX1BPUlRfUkFOR0UgPSBbNTIwMCwgNTMwMF07XG5jb25zdCBHRUNLT19TRVJWRVJfR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2dlY2tvX3NlcnZlcl9ndWFyZC5sb2NrJyksXG4gIHt0aW1lb3V0OiA1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cblxuY2xhc3MgR2Vja29Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZFByb2Nlc3NFeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gR2Vja28gRHJpdmVyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAnaXRzIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiBDaGVjayB0aGUgQXBwaXVtIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIEdlY2tvRHJpdmVyUHJvY2VzcyB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgWydub1Jlc2V0JywgJ3ZlcmJvc2l0eScsICdhbmRyb2lkU3RvcmFnZSddKSB7XG4gICAgICB0aGlzW29wdE5hbWVdID0gb3B0c1tvcHROYW1lXTtcbiAgICB9XG4gICAgdGhpcy5wb3J0ID0gb3B0cy5zeXN0ZW1Qb3J0O1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gIH1cblxuICBnZXQgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEodGhpcy5wcm9jPy5pc1J1bm5pbmcpO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBvcnQpIHtcbiAgICAgIGF3YWl0IEdFQ0tPX1NFUlZFUl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gR0VDS09fUE9SVF9SQU5HRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBgICtcbiAgICAgICAgICAgIGBEb3VibGUgY2hlY2sgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBsb2NraW5nIHBvcnRzIHdpdGhpbiB0aGlzIHJhbmdlIGFuZCB0ZXJtaW5hdGUgYCArXG4gICAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZSBvciBzZXQgYW55IGZyZWUgcG9ydCBudW1iZXIgdG8gdGhlICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkcml2ZXJCaW47XG4gICAgdHJ5IHtcbiAgICAgIGRyaXZlckJpbiA9IGF3YWl0IGZzLndoaWNoKEdEX0JJTkFSWSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0dEX0JJTkFSWX0gYmluYXJ5IGNhbm5vdCBiZSBmb3VuZCBpbiBQQVRILiBgICtcbiAgICAgICAgYFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgcHJlc2VudCBvbiB5b3VyIHN5c3RlbWApO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgLyogI3JlZ2lvbiBPcHRpb25zICovXG4gICAgc3dpdGNoIChfLnRvTG93ZXIodGhpcy52ZXJib3NpdHkpKSB7XG4gICAgICBjYXNlIFZFUkJPU0lUWS5ERUJVRzpcbiAgICAgICAgYXJncy5wdXNoKCctdicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVkVSQk9TSVRZLlRSQUNFOlxuICAgICAgICBhcmdzLnB1c2goJy12dicpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMubm9SZXNldCkge1xuICAgICAgYXJncy5wdXNoKCctLWNvbm5lY3QtZXhpc3RpbmcnKTtcbiAgICB9XG4gICAgLyogI2VuZHJlZ2lvbiAqL1xuXG4gICAgYXJncy5wdXNoKCctcCcsIHRoaXMucG9ydCk7XG4gICAgaWYgKHRoaXMuYW5kcm9pZFN0b3JhZ2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1hbmRyb2lkLXN0b3JhZ2UnLCB0aGlzLmFuZHJvaWRTdG9yYWdlKTtcbiAgICB9XG4gICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3MoZHJpdmVyQmluLCBhcmdzKTtcbiAgICB0aGlzLnByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgWyR7R0RfQklOQVJZfV0gJHtsaW5lfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucHJvYy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGxvZy5pbmZvKGAke0dEX0JJTkFSWX0gaGFzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgIH0pO1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyAnJHtkcml2ZXJCaW59JyB3aXRoIGFyZ3MgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoMCk7XG4gIH1cblxuICBhc3luYyBzdG9wICgpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBSVU5OSU5HX1BST0NFU1NfSURTID0gW107XG5wcm9jZXNzLm9uY2UoJ2V4aXQnLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgcGlkIG9mIFJVTk5JTkdfUFJPQ0VTU19JRFMpIHtcbiAgICBjb25zdCBjb21tYW5kID0gc3lzdGVtLmlzV2luZG93cygpID8gYHRhc2traWxsLmV4ZSAvUElEICR7cGlkfWAgOiBga2lsbCAke3BpZH1gO1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhjb21tYW5kKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbn0pO1xuXG5jbGFzcyBHZWNrb0RyaXZlclNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChjYXBzKSB7XG4gICAgdGhpcy5wcm9jZXNzID0gbmV3IEdlY2tvRHJpdmVyUHJvY2VzcyhjYXBzKTtcbiAgICB0aGlzLnByb3h5ID0gbnVsbDtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLnByb2Nlc3M/LmlzUnVubmluZyk7XG4gIH1cblxuICBhc3luYyBzdGFydCAoZ2Vja29DYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5wcm9jZXNzLmluaXQoKTtcblxuICAgIHRoaXMucHJveHkgPSBuZXcgR2Vja29Qcm94eSh7XG4gICAgICBzZXJ2ZXI6ICcxMjcuMC4wLjEnLFxuICAgICAgcG9ydDogdGhpcy5wcm9jZXNzLnBvcnQsXG4gICAgICBiYXNlOiAnJyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gZmFsc2U7XG4gICAgdGhpcy5wcm9jZXNzLnByb2Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICh0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgICAvLyBhdm9pZCBcImZyb3plblwiIHByb2Nlc3NlcyxcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmtpbGwoKTtcbiAgICAgIH1cbiAgICAgIGlmICgvQ29uZGl0aW9uIHVubWV0Ly50ZXN0KGUubWVzc2FnZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZWNrbyBEcml2ZXIgc2VydmVyIGlzIG5vdCBsaXN0ZW5pbmcgd2l0aGluICR7U1RBUlRVUF9USU1FT1VUX01TfW1zIHRpbWVvdXQuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgaXQgY291bGQgYmUgc3RhcnRlZCBtYW51YWxseSBmcm9tIGEgdGVybWluYWxgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHBpZCA9IHRoaXMucHJvY2Vzcy5wcm9jLnBpZDtcbiAgICBSVU5OSU5HX1BST0NFU1NfSURTLnB1c2gocGlkKTtcbiAgICB0aGlzLnByb2Nlc3MucHJvYy5vbignZXhpdCcsICgpID0+IHZvaWQgXy5wdWxsKFJVTk5JTkdfUFJPQ0VTU19JRFMsIHBpZCkpO1xuXG4gICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgICAgIGFsd2F5c01hdGNoOiBnZWNrb0NhcHMsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdG9wICgpIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICBsb2cuaW5mbyhgR2Vja28gRHJpdmVyIHNlc3Npb24gY2Fubm90IGJlIHN0b3BwZWQsIGJlY2F1c2UgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZ2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3h5Py5zZXNzaW9uSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJveHkuY29tbWFuZChgL3Nlc3Npb24vJHt0aGlzLnByb3h5LnNlc3Npb25JZH1gLCAnREVMRVRFJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgZGVsZXRlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3Muc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBHZWNrbyBEcml2ZXIgcHJvY2VzcyBjYW5ub3QgYmUgc3RvcHBlZCAoJHtlLm1lc3NhZ2V9KS4gS2lsbGluZyBpdCBmb3JjZWZ1bGx5YCk7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHZWNrb0RyaXZlclNlcnZlcjtcbiJdLCJmaWxlIjoibGliL2dlY2tvLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9nZWNrby5qcyJdLCJuYW1lcyI6WyJHRF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJHRUNLT19QT1JUX1JBTkdFIiwiR0VDS09fU0VSVkVSX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVGQVVMVF9NQVJJT05FVFRFX1BPUlQiLCJQUk9DRVNTX1NQRUNJRklDX09QVElPTl9OQU1FU19NQVAiLCJPYmplY3QiLCJmcmVlemUiLCJub1Jlc2V0IiwidmVyYm9zaXR5IiwiYW5kcm9pZFN0b3JhZ2UiLCJtYXJpb25ldHRlUG9ydCIsInN5c3RlbVBvcnQiLCJHZWNrb1Byb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRQcm9jZXNzRXhpdCIsImVycm9ycyIsIkludmFsaWRDb250ZXh0RXJyb3IiLCJHZWNrb0RyaXZlclByb2Nlc3MiLCJjb25zdHJ1Y3RvciIsImxvZyIsIm9wdHMiLCJvcHROYW1lIiwicHJvcE5hbWUiLCJfIiwidG9QYWlycyIsInByb2MiLCJpc1J1bm5pbmciLCJpbml0IiwicG9ydCIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJlIiwiRXJyb3IiLCJkcml2ZXJCaW4iLCJmcyIsIndoaWNoIiwiYXJncyIsInRvTG93ZXIiLCJWRVJCT1NJVFkiLCJERUJVRyIsInB1c2giLCJUUkFDRSIsImlzTmlsIiwiaW5mbyIsIlN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImxpbmUiLCJ0cmltIiwiZGVidWciLCJjb2RlIiwic2lnbmFsIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0Iiwic3RvcCIsImtpbGwiLCJpZ24iLCJSVU5OSU5HX1BST0NFU1NfSURTIiwicHJvY2VzcyIsIm9uY2UiLCJpc0VtcHR5IiwiY29tbWFuZCIsIm1hcCIsInBpZCIsImpvaW4iLCJHZWNrb0RyaXZlclNlcnZlciIsImNhcHMiLCJwcm94eSIsImdlY2tvQ2FwcyIsInNlcnZlciIsImJhc2UiLCJrZWVwQWxpdmUiLCJlcnIiLCJtZXNzYWdlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsInRlc3QiLCJwdWxsIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwic2Vzc2lvbklkIiwid2FybiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxTQUFTLEdBQUksY0FBYUMsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUFqRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEtBQTNCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBR0MsY0FBS0MsZ0JBQUwsQ0FDekJDLGNBQUtDLE9BQUwsQ0FBYUMsWUFBR0MsTUFBSCxFQUFiLEVBQTBCLHlCQUExQixDQUR5QixFQUV6QjtBQUFDQyxFQUFBQSxPQUFPLEVBQUUsQ0FBVjtBQUFhQyxFQUFBQSxXQUFXLEVBQUU7QUFBMUIsQ0FGeUIsQ0FBM0I7O0FBSUEsTUFBTUMsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyxpQ0FBaUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDdERDLEVBQUFBLE9BQU8sRUFBRSxTQUQ2QztBQUV0REMsRUFBQUEsU0FBUyxFQUFFLFdBRjJDO0FBR3REQyxFQUFBQSxjQUFjLEVBQUUsZ0JBSHNDO0FBSXREQyxFQUFBQSxjQUFjLEVBQUUsZ0JBSnNDO0FBS3REQyxFQUFBQSxVQUFVLEVBQUU7QUFMMEMsQ0FBZCxDQUExQzs7QUFTQSxNQUFNQyxVQUFOLFNBQXlCQyxtQkFBekIsQ0FBaUM7QUFDYixRQUFaQyxZQUFZLENBQUVD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QUFDRixZQUFNLEtBQUtmLE9BQUwsQ0FBYUosSUFBYixFQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU96QixDQUFQLEVBQVU7QUFDVixXQUFLWixHQUFMLENBQVNpRSxJQUFULENBQWUsMkNBQTBDckQsQ0FBQyxDQUFDNEMsT0FBUSwwQkFBbkU7QUFDQSxZQUFNLEtBQUtmLE9BQUwsQ0FBYUgsSUFBYixFQUFOO0FBQ0Q7QUFDRjs7QUFwRnFCOztlQXVGVFUsaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgc3lzdGVtIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IFZFUkJPU0lUWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgR0RfQklOQVJZID0gYGdlY2tvZHJpdmVyJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgU1RBUlRVUF9USU1FT1VUX01TID0gMTAwMDA7IC8vIDEwIHNlY29uZHNcbmNvbnN0IEdFQ0tPX1BPUlRfUkFOR0UgPSBbNTIwMCwgNTMwMF07XG5jb25zdCBHRUNLT19TRVJWRVJfR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2dlY2tvX3NlcnZlcl9ndWFyZC5sb2NrJyksXG4gIHt0aW1lb3V0OiA1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5jb25zdCBERUZBVUxUX01BUklPTkVUVEVfUE9SVCA9IDI4Mjg7XG5jb25zdCBQUk9DRVNTX1NQRUNJRklDX09QVElPTl9OQU1FU19NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgbm9SZXNldDogJ25vUmVzZXQnLFxuICB2ZXJib3NpdHk6ICd2ZXJib3NpdHknLFxuICBhbmRyb2lkU3RvcmFnZTogJ2FuZHJvaWRTdG9yYWdlJyxcbiAgbWFyaW9uZXR0ZVBvcnQ6ICdtYXJpb25ldHRlUG9ydCcsXG4gIHN5c3RlbVBvcnQ6ICdwb3J0Jyxcbn0pO1xuXG5cbmNsYXNzIEdlY2tvUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRQcm9jZXNzRXhpdCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQ29udGV4dEVycm9yKFxuICAgICAgICBgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIEdlY2tvIERyaXZlciBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgJ2l0cyBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gQ2hlY2sgdGhlIEFwcGl1bSBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBHZWNrb0RyaXZlclByb2Nlc3Mge1xuICBjb25zdHJ1Y3RvciAobG9nLCBvcHRzID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IFtvcHROYW1lLCBwcm9wTmFtZV0gb2YgXy50b1BhaXJzKFBST0NFU1NfU1BFQ0lGSUNfT1BUSU9OX05BTUVTX01BUCkpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gb3B0c1tvcHROYW1lXTtcbiAgICB9XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLnByb2M/LmlzUnVubmluZyk7XG4gIH1cblxuICBhc3luYyBpbml0ICgpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9ydCkge1xuICAgICAgYXdhaXQgR0VDS09fU0VSVkVSX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBHRUNLT19QT1JUX1JBTkdFO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH0uIGAgK1xuICAgICAgICAgICAgYERvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICAgIGB0aGVzZSB3aGljaCBhcmUgbm90IG5lZWRlZCBhbnltb3JlIG9yIHNldCBhbnkgZnJlZSBwb3J0IG51bWJlciB0byB0aGUgJ3N5c3RlbVBvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGRyaXZlckJpbjtcbiAgICB0cnkge1xuICAgICAgZHJpdmVyQmluID0gYXdhaXQgZnMud2hpY2goR0RfQklOQVJZKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0RfQklOQVJZfSBiaW5hcnkgY2Fubm90IGJlIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBwcmVzZW50IG9uIHlvdXIgc3lzdGVtYCk7XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICAvKiAjcmVnaW9uIE9wdGlvbnMgKi9cbiAgICBzd2l0Y2ggKF8udG9Mb3dlcih0aGlzLnZlcmJvc2l0eSkpIHtcbiAgICAgIGNhc2UgVkVSQk9TSVRZLkRFQlVHOlxuICAgICAgICBhcmdzLnB1c2goJy12Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWRVJCT1NJVFkuVFJBQ0U6XG4gICAgICAgIGFyZ3MucHVzaCgnLXZ2Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5ub1Jlc2V0KSB7XG4gICAgICBhcmdzLnB1c2goJy0tY29ubmVjdC1leGlzdGluZycpO1xuICAgICAgLy8gaHR0cHM6Ly9maXJlZm94LXNvdXJjZS1kb2NzLm1vemlsbGEub3JnL3Rlc3RpbmcvZ2Vja29kcml2ZXIvRmxhZ3MuaHRtbCNjb2RlLWNvbm5lY3QtZXhpc3RpbmctY29kZVxuICAgICAgaWYgKF8uaXNOaWwodGhpcy5tYXJpb25ldHRlUG9ydCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgJ21hcmlvbmV0dGVQb3J0JyBjYXBhYmlsaXR5IHZhbHVlIGlzIG5vdCBwcm92aWRlZCB3aGlsZSAnbm9SZXNldCcgaXMgZW5hYmxlZGApO1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBc3NpZ25pbmcgJ21hcmlvbmV0dGVQb3J0JyB0byB0aGUgZGVmYXVsdCB2YWx1ZSAoJHtERUZBVUxUX01BUklPTkVUVEVfUE9SVH0pYCk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2goJy0tbWFyaW9uZXR0ZS1wb3J0JywgdGhpcy5tYXJpb25ldHRlUG9ydCA/PyBERUZBVUxUX01BUklPTkVUVEVfUE9SVCk7XG4gICAgfSBlbHNlIGlmICghXy5pc05pbCh0aGlzLm1hcmlvbmV0dGVQb3J0KSkge1xuICAgICAgYXJncy5wdXNoKCctLW1hcmlvbmV0dGUtcG9ydCcsIHRoaXMubWFyaW9uZXR0ZVBvcnQpO1xuICAgIH1cbiAgICAvKiAjZW5kcmVnaW9uICovXG5cbiAgICBhcmdzLnB1c2goJy1wJywgdGhpcy5wb3J0KTtcbiAgICBpZiAodGhpcy5hbmRyb2lkU3RvcmFnZSkge1xuICAgICAgYXJncy5wdXNoKCctLWFuZHJvaWQtc3RvcmFnZScsIHRoaXMuYW5kcm9pZFN0b3JhZ2UpO1xuICAgIH1cbiAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyhkcml2ZXJCaW4sIGFyZ3MpO1xuICAgIHRoaXMucHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gXy50cmltKHN0ZG91dCB8fCBzdGRlcnIpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFske0dEX0JJTkFSWX1dICR7bGluZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAke0dEX0JJTkFSWX0gaGFzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgIH0pO1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke2RyaXZlckJpbn0nIHdpdGggYXJncyAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsICgpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IFJVTk5JTkdfUFJPQ0VTU19JRFMgPSBbXTtcbnByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgaWYgKF8uaXNFbXB0eShSVU5OSU5HX1BST0NFU1NfSURTKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSBzeXN0ZW0uaXNXaW5kb3dzKClcbiAgICA/ICgndGFza2tpbGwuZXhlICcgKyBSVU5OSU5HX1BST0NFU1NfSURTLm1hcCgocGlkKSA9PiBgL1BJRCAke3BpZH1gKS5qb2luKCcgJykpXG4gICAgOiBga2lsbCAke1JVTk5JTkdfUFJPQ0VTU19JRFMuam9pbignICcpfWA7XG4gIHRyeSB7XG4gICAgZXhlY1N5bmMoY29tbWFuZCk7XG4gIH0gY2F0Y2ggKGlnbikge31cbn0pO1xuXG5jbGFzcyBHZWNrb0RyaXZlclNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChsb2csIGNhcHMpIHtcbiAgICB0aGlzLnByb2Nlc3MgPSBuZXcgR2Vja29Ecml2ZXJQcm9jZXNzKGxvZywgY2Fwcyk7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5wcm94eSA9IG51bGw7XG4gIH1cblxuICBnZXQgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEodGhpcy5wcm9jZXNzPy5pc1J1bm5pbmcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGdlY2tvQ2Fwcykge1xuICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5pbml0KCk7XG5cbiAgICB0aGlzLnByb3h5ID0gbmV3IEdlY2tvUHJveHkoe1xuICAgICAgc2VydmVyOiAnMTI3LjAuMC4xJyxcbiAgICAgIHBvcnQ6IHRoaXMucHJvY2Vzcy5wb3J0LFxuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIGJhc2U6ICcnLFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQgPSBmYWxzZTtcbiAgICB0aGlzLnByb2Nlc3MucHJvYy5vbignZXhpdCcsICgpID0+IHtcbiAgICAgIHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnByb2Nlc3MuaXNSdW5uaW5nKSB7XG4gICAgICAgIC8vIGF2b2lkIFwiZnJvemVuXCIgcHJvY2Vzc2VzLFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgICAgfVxuICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdlY2tvIERyaXZlciBzZXJ2ZXIgaXMgbm90IGxpc3RlbmluZyB3aXRoaW4gJHtTVEFSVFVQX1RJTUVPVVRfTVN9bXMgdGltZW91dC4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBpdCBjb3VsZCBiZSBzdGFydGVkIG1hbnVhbGx5IGZyb20gYSB0ZXJtaW5hbGApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgY29uc3QgcGlkID0gdGhpcy5wcm9jZXNzLnByb2MucGlkO1xuICAgIFJVTk5JTkdfUFJPQ0VTU19JRFMucHVzaChwaWQpO1xuICAgIHRoaXMucHJvY2Vzcy5wcm9jLm9uKCdleGl0JywgKCkgPT4gdm9pZCBfLnB1bGwoUlVOTklOR19QUk9DRVNTX0lEUywgcGlkKSk7XG5cbiAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IGdlY2tvQ2FwcyxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYEdlY2tvIERyaXZlciBzZXNzaW9uIGNhbm5vdCBiZSBzdG9wcGVkLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmdgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm94eT8uc2Vzc2lvbklkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoYC9zZXNzaW9uLyR7dGhpcy5wcm94eS5zZXNzaW9uSWR9YCwgJ0RFTEVURScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgZGVsZXRlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3Muc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEdlY2tvIERyaXZlciBwcm9jZXNzIGNhbm5vdCBiZSBzdG9wcGVkICgke2UubWVzc2FnZX0pLiBLaWxsaW5nIGl0IGZvcmNlZnVsbHlgKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5raWxsKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlY2tvRHJpdmVyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvZ2Vja28uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/logger.js
CHANGED
|
@@ -7,12 +7,12 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
11
|
|
|
12
|
-
const log =
|
|
12
|
+
const log = _support.logger.getLogger('GeckoDriver');
|
|
13
13
|
|
|
14
14
|
var _default = log;
|
|
15
15
|
exports.default = _default;require('source-map-support').install();
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLGFBQWpCLENBQVo7O2VBRWVGLEciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdHZWNrb0RyaXZlcicpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7XG4iXSwiZmlsZSI6ImxpYi9sb2dnZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/server.js
CHANGED
|
@@ -11,7 +11,7 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
15
15
|
|
|
16
16
|
var _driver = _interopRequireDefault(require("./driver"));
|
|
17
17
|
|
|
@@ -20,8 +20,8 @@ async function startServer(port, address) {
|
|
|
20
20
|
port,
|
|
21
21
|
address
|
|
22
22
|
});
|
|
23
|
-
let routeConfiguringFunction = (0,
|
|
24
|
-
let server = await (0,
|
|
23
|
+
let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(d);
|
|
24
|
+
let server = await (0, _baseDriver.server)({
|
|
25
25
|
routeConfiguringFunction,
|
|
26
26
|
port,
|
|
27
27
|
hostname: address
|
|
@@ -33,4 +33,4 @@ async function startServer(port, address) {
|
|
|
33
33
|
}require('source-map-support').install();
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXIuanMiXSwibmFtZXMiOlsic3RhcnRTZXJ2ZXIiLCJwb3J0IiwiYWRkcmVzcyIsImQiLCJHZWNrb0RyaXZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlcnZlciIsImhvc3RuYW1lIiwibG9nIiwiaW5mbyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHQTs7QUFFQSxlQUFlQSxXQUFmLENBQTRCQyxJQUE1QixFQUFrQ0MsT0FBbEMsRUFBMkM7QUFDekMsTUFBSUMsQ0FBQyxHQUFHLElBQUlDLGVBQUosQ0FBZ0I7QUFBQ0gsSUFBQUEsSUFBRDtBQUFPQyxJQUFBQTtBQUFQLEdBQWhCLENBQVI7QUFDQSxNQUFJRyx3QkFBd0IsR0FBRywwQ0FBV0YsQ0FBWCxDQUEvQjtBQUNBLE1BQUlHLE1BQU0sR0FBRyxNQUFNLHdCQUFXO0FBQUNELElBQUFBLHdCQUFEO0FBQTJCSixJQUFBQSxJQUEzQjtBQUFpQ00sSUFBQUEsUUFBUSxFQUFFTDtBQUEzQyxHQUFYLENBQW5COztBQUNBTSxrQkFBSUMsSUFBSixDQUFVLDJDQUEwQ1AsT0FBUSxJQUFHRCxJQUFLLEVBQXBFOztBQUNBLFNBQU9LLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgc2VydmVyIGFzIGJhc2VTZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyXG59IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IEdlY2tvRHJpdmVyIGZyb20gJy4vZHJpdmVyJztcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIgKHBvcnQsIGFkZHJlc3MpIHtcbiAgbGV0IGQgPSBuZXcgR2Vja29Ecml2ZXIoe3BvcnQsIGFkZHJlc3N9KTtcbiAgbGV0IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiA9IG1ha2VSb3V0ZXIoZCk7XG4gIGxldCBzZXJ2ZXIgPSBhd2FpdCBiYXNlU2VydmVyKHtyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sIHBvcnQsIGhvc3RuYW1lOiBhZGRyZXNzfSk7XG4gIGxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2VydmVyIGxpc3RlbmluZyBvbiBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9YCk7XG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbmV4cG9ydCB7IHN0YXJ0U2VydmVyIH07XG4iXSwiZmlsZSI6ImxpYi9zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
|
|
5
5
|
require("source-map-support/register");
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _webdriverio = require("webdriverio");
|
|
8
8
|
|
|
9
9
|
var _ = require("../..");
|
|
10
10
|
|
|
@@ -36,21 +36,24 @@ describe('Desktop Gecko Driver', function () {
|
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
38
|
beforeEach(async function () {
|
|
39
|
-
driver =
|
|
40
|
-
|
|
39
|
+
driver = await (0, _webdriverio.remote)({
|
|
40
|
+
hostname: _utils.HOST,
|
|
41
|
+
port: _utils.PORT,
|
|
42
|
+
capabilities: CAPS
|
|
43
|
+
});
|
|
41
44
|
});
|
|
42
45
|
afterEach(async function () {
|
|
43
46
|
if (driver) {
|
|
44
|
-
await driver.
|
|
47
|
+
await driver.deleteSession();
|
|
45
48
|
driver = null;
|
|
46
49
|
}
|
|
47
50
|
});
|
|
48
51
|
it('should start and stop a session', async function () {
|
|
49
|
-
await driver.
|
|
50
|
-
const button = await driver
|
|
51
|
-
await button.
|
|
52
|
+
await driver.url('https://appium.io/');
|
|
53
|
+
const button = await driver.$('#downloadLink');
|
|
54
|
+
await button.getText().should.eventually.eql('Download Appium');
|
|
52
55
|
});
|
|
53
56
|
});require('source-map-support').install();
|
|
54
57
|
|
|
55
58
|
|
|
56
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9kZXNrdG9wLWRyaXZlci1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiY2hhaSIsInNob3VsZCIsInVzZSIsImNoYWlBc1Byb21pc2VkIiwiQ0FQUyIsImJyb3dzZXJOYW1lIiwicGxhdGZvcm1OYW1lIiwiZGVzY3JpYmUiLCJ0aW1lb3V0IiwiTU9DSEFfVElNRU9VVCIsInNlcnZlciIsImRyaXZlciIsImJlZm9yZSIsIlBPUlQiLCJIT1NUIiwiYWZ0ZXIiLCJjbG9zZSIsImJlZm9yZUVhY2giLCJob3N0bmFtZSIsInBvcnQiLCJjYXBhYmlsaXRpZXMiLCJhZnRlckVhY2giLCJkZWxldGVTZXNzaW9uIiwiaXQiLCJ1cmwiLCJidXR0b24iLCIkIiwiZ2V0VGV4dCIsImV2ZW50dWFsbHkiLCJlcWwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxjQUFLQyxNQUFMOztBQUNBRCxjQUFLRSxHQUFMLENBQVNDLHVCQUFUOztBQUVBLE1BQU1DLElBQUksR0FBRztBQUNYQyxFQUFBQSxXQUFXLEVBQUUsZ0JBREY7QUFFWEMsRUFBQUEsWUFBWSxFQUFFO0FBRkgsQ0FBYjtBQUtBQyxRQUFRLENBQUMsc0JBQUQsRUFBeUIsWUFBWTtBQUMzQyxPQUFLQyxPQUFMLENBQWFDLG9CQUFiO0FBRUEsTUFBSUMsTUFBSjtBQUNBLE1BQUlDLE1BQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkYsSUFBQUEsTUFBTSxHQUFHLE1BQU0sbUJBQVlHLFdBQVosRUFBa0JDLFdBQWxCLENBQWY7QUFDRCxHQUZLLENBQU47QUFHQUMsRUFBQUEsS0FBSyxDQUFDLGtCQUFrQjtBQUN0QixRQUFJTCxNQUFKLEVBQVk7QUFDVixZQUFNQSxNQUFNLENBQUNNLEtBQVAsRUFBTjtBQUNBTixNQUFBQSxNQUFNLEdBQUcsSUFBVDtBQUNEO0FBQ0YsR0FMSSxDQUFMO0FBTUFPLEVBQUFBLFVBQVUsQ0FBQyxrQkFBa0I7QUFDM0JOLElBQUFBLE1BQU0sR0FBRyxNQUFNLHlCQUFPO0FBQ3BCTyxNQUFBQSxRQUFRLEVBQUVKLFdBRFU7QUFFcEJLLE1BQUFBLElBQUksRUFBRU4sV0FGYztBQUdwQk8sTUFBQUEsWUFBWSxFQUFFaEI7QUFITSxLQUFQLENBQWY7QUFLRCxHQU5TLENBQVY7QUFPQWlCLEVBQUFBLFNBQVMsQ0FBQyxrQkFBa0I7QUFDMUIsUUFBSVYsTUFBSixFQUFZO0FBQ1YsWUFBTUEsTUFBTSxDQUFDVyxhQUFQLEVBQU47QUFDQVgsTUFBQUEsTUFBTSxHQUFHLElBQVQ7QUFDRDtBQUNGLEdBTFEsQ0FBVDtBQU9BWSxFQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBb0Msa0JBQWtCO0FBQ3RELFVBQU1aLE1BQU0sQ0FBQ2EsR0FBUCxDQUFXLG9CQUFYLENBQU47QUFDQSxVQUFNQyxNQUFNLEdBQUcsTUFBTWQsTUFBTSxDQUFDZSxDQUFQLENBQVMsZUFBVCxDQUFyQjtBQUNBLFVBQU1ELE1BQU0sQ0FBQ0UsT0FBUCxHQUFpQjFCLE1BQWpCLENBQXdCMkIsVUFBeEIsQ0FBbUNDLEdBQW5DLENBQXVDLGlCQUF2QyxDQUFOO0FBQ0QsR0FKQyxDQUFGO0FBS0QsQ0FqQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbW90ZSB9IGZyb20gJ3dlYmRyaXZlcmlvJztcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyBIT1NULCBQT1JULCBNT0NIQV9USU1FT1VUIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5jb25zdCBDQVBTID0ge1xuICBicm93c2VyTmFtZTogJ01vemlsbGFGaXJlZm94JyxcbiAgcGxhdGZvcm1OYW1lOiAnbGludXgnLFxufTtcblxuZGVzY3JpYmUoJ0Rlc2t0b3AgR2Vja28gRHJpdmVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnRpbWVvdXQoTU9DSEFfVElNRU9VVCk7XG5cbiAgbGV0IHNlcnZlcjtcbiAgbGV0IGRyaXZlcjtcbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcihQT1JULCBIT1NUKTtcbiAgfSk7XG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHNlcnZlciA9IG51bGw7XG4gICAgfVxuICB9KTtcbiAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZHJpdmVyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGhvc3RuYW1lOiBIT1NULFxuICAgICAgcG9ydDogUE9SVCxcbiAgICAgIGNhcGFiaWxpdGllczogQ0FQUyxcbiAgICB9KTtcbiAgfSk7XG4gIGFmdGVyRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRyaXZlcikge1xuICAgICAgYXdhaXQgZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGRyaXZlciA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHN0YXJ0IGFuZCBzdG9wIGEgc2Vzc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBkcml2ZXIudXJsKCdodHRwczovL2FwcGl1bS5pby8nKTtcbiAgICBjb25zdCBidXR0b24gPSBhd2FpdCBkcml2ZXIuJCgnI2Rvd25sb2FkTGluaycpO1xuICAgIGF3YWl0IGJ1dHRvbi5nZXRUZXh0KCkuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKCdEb3dubG9hZCBBcHBpdW0nKTtcbiAgfSk7XG59KTtcblxuXG4iXSwiZmlsZSI6InRlc3QvZnVuY3Rpb25hbC9kZXNrdG9wLWRyaXZlci1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|