@appium/test-support 1.5.0 → 2.0.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.
@@ -1,19 +0,0 @@
1
- /**
2
- * Default test host
3
- */
4
- export const TEST_HOST: "127.0.0.1";
5
- /**
6
- * Returns a free port; one per process
7
- * @param {boolean} [force] - If true, do not reuse the port (if it already exists)
8
- * @returns {Promise<number>} a free port
9
- */
10
- export function getTestPort(force?: boolean | undefined): Promise<number>;
11
- /**
12
- * Build an Appium URL from components.
13
- *
14
- * **All** parameters are required. Provide an empty string (`''`) if you don't need one.
15
- * To rearrange arguments (if needed), use the placeholder from Lodash (`_`).
16
- *
17
- */
18
- export const createAppiumURL: import("lodash").CurriedFunction4<string, string | number, string | null, string, string>;
19
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,oCAA8B;AAI9B;;;;GAIG;AACH,0DAFa,QAAQ,MAAM,CAAC,CAW3B;AAED;;;;;;GAMG;AACH,wHAgCE"}
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.createAppiumURL = exports.TEST_HOST = void 0;
9
- exports.getTestPort = getTestPort;
10
-
11
- require("source-map-support/register");
12
-
13
- var _getPort = _interopRequireDefault(require("get-port"));
14
-
15
- var _lodash = require("lodash");
16
-
17
- const TEST_HOST = '127.0.0.1';
18
- exports.TEST_HOST = TEST_HOST;
19
- let testPort;
20
-
21
- async function getTestPort(force = false) {
22
- if (force || !testPort) {
23
- let port = await (0, _getPort.default)();
24
-
25
- if (!testPort) {
26
- testPort = port;
27
- }
28
-
29
- return port;
30
- }
31
-
32
- return testPort;
33
- }
34
-
35
- const createAppiumURL = (0, _lodash.curry)((address, port, session, pathname) => {
36
- if (!/^https?:\/\//.test(address)) {
37
- address = `http://${address}`;
38
- }
39
-
40
- let path = session ? `session/${session}` : '';
41
-
42
- if (pathname) {
43
- path = `${path}/${pathname}`;
44
- }
45
-
46
- return new URL(path, `${address}:${port}`).href;
47
- });
48
- exports.createAppiumURL = createAppiumURL;
49
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJURVNUX0hPU1QiLCJ0ZXN0UG9ydCIsImdldFRlc3RQb3J0IiwiZm9yY2UiLCJwb3J0IiwiZ2V0UG9ydCIsImNyZWF0ZUFwcGl1bVVSTCIsImN1cnJ5IiwiYWRkcmVzcyIsInNlc3Npb24iLCJwYXRobmFtZSIsInRlc3QiLCJwYXRoIiwiVVJMIiwiaHJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0JztcbmltcG9ydCB7Y3Vycnl9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGhvc3RcbiAqL1xuY29uc3QgVEVTVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbmxldCB0ZXN0UG9ydDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJlZSBwb3J0OyBvbmUgcGVyIHByb2Nlc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSAtIElmIHRydWUsIGRvIG5vdCByZXVzZSB0aGUgcG9ydCAoaWYgaXQgYWxyZWFkeSBleGlzdHMpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBhIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUZXN0UG9ydChmb3JjZSA9IGZhbHNlKSB7XG4gIGlmIChmb3JjZSB8fCAhdGVzdFBvcnQpIHtcbiAgICBsZXQgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBpZiAoIXRlc3RQb3J0KSB7XG4gICAgICB0ZXN0UG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xuICB9XG4gIHJldHVybiB0ZXN0UG9ydDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBBcHBpdW0gVVJMIGZyb20gY29tcG9uZW50cy5cbiAqXG4gKiAqKkFsbCoqIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLiAgUHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApIGlmIHlvdSBkb24ndCBuZWVkIG9uZS5cbiAqIFRvIHJlYXJyYW5nZSBhcmd1bWVudHMgKGlmIG5lZWRlZCksIHVzZSB0aGUgcGxhY2Vob2xkZXIgZnJvbSBMb2Rhc2ggKGBfYCkuXG4gKlxuICovXG5jb25zdCBjcmVhdGVBcHBpdW1VUkwgPSBjdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQmFzZSBhZGRyZXNzICh3LyBvcHRpb25hbCBwcm90b2NvbClcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwb3J0IC0gUG9ydCBudW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uIC0gU2Vzc2lvbiBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBFeHRyYSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE5ldyBVUkxcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbiAgICpcbiAgICogLy8gaHR0cDovLzEyNy4wLjAuMTozMTMzNy9zZXNzaW9uXG4gICAqIGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICcnLCAnc2Vzc2lvbicpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbFxuICAgKiBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVVJMKCcxMjcuMC4wLjEnLCAzMTMzNywgXywgJ3Nlc3Npb24nKVxuICAgKiBjcmVhdGVTZXNzaW9uVVJMKCdhc2RmZ2prbCcpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbC9hcHBpdW0vZXhlY3V0ZVxuICAgKiBjb25zdCBjcmVhdGVVUkxXaXRoUGF0aCA9IGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICdhc2RmZ2prbCcpO1xuICAgKiBjcmVhdGVVUkxXaXRoUGF0aCgnYXBwaXVtL2V4ZWN1dGUnKVxuICAgKi9cbiAgKGFkZHJlc3MsIHBvcnQsIHNlc3Npb24sIHBhdGhuYW1lKSA9PiB7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgIGFkZHJlc3MgPSBgaHR0cDovLyR7YWRkcmVzc31gO1xuICAgIH1cbiAgICBsZXQgcGF0aCA9IHNlc3Npb24gPyBgc2Vzc2lvbi8ke3Nlc3Npb259YCA6ICcnO1xuICAgIGlmIChwYXRobmFtZSkge1xuICAgICAgcGF0aCA9IGAke3BhdGh9LyR7cGF0aG5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCwgYCR7YWRkcmVzc306JHtwb3J0fWApLmhyZWY7XG4gIH1cbik7XG5cbmV4cG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydCwgY3JlYXRlQXBwaXVtVVJMfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBS0EsTUFBTUEsU0FBUyxHQUFHLFdBQWxCOztBQUVBLElBQUlDLFFBQUo7O0FBT0EsZUFBZUMsV0FBZixDQUEyQkMsS0FBSyxHQUFHLEtBQW5DLEVBQTBDO0VBQ3hDLElBQUlBLEtBQUssSUFBSSxDQUFDRixRQUFkLEVBQXdCO0lBQ3RCLElBQUlHLElBQUksR0FBRyxNQUFNLElBQUFDLGdCQUFBLEdBQWpCOztJQUNBLElBQUksQ0FBQ0osUUFBTCxFQUFlO01BQ2JBLFFBQVEsR0FBR0csSUFBWDtJQUNEOztJQUNELE9BQU9BLElBQVA7RUFDRDs7RUFDRCxPQUFPSCxRQUFQO0FBQ0Q7O0FBU0QsTUFBTUssZUFBZSxHQUFHLElBQUFDLGFBQUEsRUFzQnRCLENBQUNDLE9BQUQsRUFBVUosSUFBVixFQUFnQkssT0FBaEIsRUFBeUJDLFFBQXpCLEtBQXNDO0VBQ3BDLElBQUksQ0FBQyxlQUFlQyxJQUFmLENBQW9CSCxPQUFwQixDQUFMLEVBQW1DO0lBQ2pDQSxPQUFPLEdBQUksVUFBU0EsT0FBUSxFQUE1QjtFQUNEOztFQUNELElBQUlJLElBQUksR0FBR0gsT0FBTyxHQUFJLFdBQVVBLE9BQVEsRUFBdEIsR0FBMEIsRUFBNUM7O0VBQ0EsSUFBSUMsUUFBSixFQUFjO0lBQ1pFLElBQUksR0FBSSxHQUFFQSxJQUFLLElBQUdGLFFBQVMsRUFBM0I7RUFDRDs7RUFDRCxPQUFPLElBQUlHLEdBQUosQ0FBUUQsSUFBUixFQUFlLEdBQUVKLE9BQVEsSUFBR0osSUFBSyxFQUFqQyxFQUFvQ1UsSUFBM0M7QUFDRCxDQS9CcUIsQ0FBeEIifQ==
@@ -1,67 +0,0 @@
1
- /**
2
- * Creates hooks to install a driver and a plugin and starts an Appium server w/ the given extensions.
3
- * @param {E2ESetupOpts} opts
4
- * @returns {void}
5
- */
6
- export function pluginE2EHarness(opts: E2ESetupOpts): void;
7
- export type E2ESetupOpts = {
8
- /**
9
- * - Path to Appium home directory
10
- */
11
- appiumHome?: string | undefined;
12
- /**
13
- * - Mocha "before all" hook function
14
- */
15
- before: Mocha.HookFunction;
16
- /**
17
- * - Mocha "after all" hook function
18
- */
19
- after: Mocha.HookFunction;
20
- /**
21
- * - Arguments to pass to Appium server
22
- */
23
- serverArgs?: any;
24
- /**
25
- * - Source of driver to install
26
- */
27
- driverSource: import('appium/types').InstallType & string;
28
- /**
29
- * - Package name of driver to install
30
- */
31
- driverPackage?: string | undefined;
32
- /**
33
- * - Name of driver to install
34
- */
35
- driverName: string;
36
- /**
37
- * - Spec of driver to install
38
- */
39
- driverSpec: string;
40
- /**
41
- * - Source of plugin to install
42
- */
43
- pluginSource: import('appium/types').InstallType & string;
44
- /**
45
- * - Package name of plugin to install
46
- */
47
- pluginPackage?: string | undefined;
48
- /**
49
- * - Spec of plugin to install
50
- */
51
- pluginSpec: string;
52
- /**
53
- * - Name of plugin to install
54
- */
55
- pluginName: string;
56
- /**
57
- * - Port to use for Appium server
58
- */
59
- port?: number | undefined;
60
- /**
61
- * - Host to use for Appium server
62
- */
63
- host?: string | undefined;
64
- };
65
- export type AppiumServer = import('@appium/types').AppiumServer;
66
- export type AppiumEnv = import('appium/types').AppiumEnv;
67
- //# sourceMappingURL=plugin-e2e-harness.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-e2e-harness.d.ts","sourceRoot":"","sources":["../../lib/plugin-e2e-harness.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,uCAHW,YAAY,GACV,IAAI,CA4HhB;;;;;;;;;;;;;;;;;;;;;kBAQa,OAAO,cAAc,EAAE,WAAW,GAAG,MAAM;;;;;;;;gBAE3C,MAAM;;;;gBACN,MAAM;;;;kBACN,OAAO,cAAc,EAAE,WAAW,GAAG,MAAM;;;;;;;;gBAE3C,MAAM;;;;gBACN,MAAM;;;;;;;;;;2BAMP,OAAO,eAAe,EAAE,YAAY;wBAIpC,OAAO,cAAc,EAAE,SAAS"}
@@ -1,144 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.pluginE2EHarness = pluginE2EHarness;
9
-
10
- require("source-map-support/register");
11
-
12
- var _support = require("appium/support");
13
-
14
- var _appium = require("appium");
15
-
16
- var _getPort = _interopRequireDefault(require("get-port"));
17
-
18
- var _logSymbols = require("log-symbols");
19
-
20
- var _teen_process = require("teen_process");
21
-
22
- const APPIUM_BIN = require.resolve('appium');
23
-
24
- function pluginE2EHarness(opts) {
25
- let {
26
- appiumHome,
27
- before,
28
- after,
29
- serverArgs = {},
30
- driverSource,
31
- driverPackage,
32
- driverName,
33
- driverSpec,
34
- pluginSource,
35
- pluginPackage,
36
- pluginSpec,
37
- pluginName,
38
- port,
39
- host
40
- } = opts;
41
- let server;
42
- before(async function () {
43
- const setupAppiumHome = async () => {
44
- const env = { ...process.env
45
- };
46
-
47
- if (appiumHome) {
48
- env.APPIUM_HOME = appiumHome;
49
- await _support.fs.mkdirp(appiumHome);
50
- console.log(`${_logSymbols.info} Set \`APPIUM_HOME\` to ${appiumHome}`);
51
- }
52
-
53
- return env;
54
- };
55
-
56
- const installDriver = async env => {
57
- var _installedDrivers$dri;
58
-
59
- console.log(`${_logSymbols.info} Checking if driver "${driverName}" is installed...`);
60
- const driverListArgs = [APPIUM_BIN, 'driver', 'list', '--json'];
61
- console.log(`${_logSymbols.info} Running: ${process.execPath} ${driverListArgs.join(' ')}`);
62
- const {
63
- stdout: driverListJson
64
- } = await (0, _teen_process.exec)(process.execPath, driverListArgs, {
65
- env
66
- });
67
- const installedDrivers = JSON.parse(driverListJson);
68
-
69
- if (!((_installedDrivers$dri = installedDrivers[driverName]) !== null && _installedDrivers$dri !== void 0 && _installedDrivers$dri.installed)) {
70
- console.log(`${_logSymbols.warning} Driver "${driverName}" not installed; installing...`);
71
- const driverArgs = [APPIUM_BIN, 'driver', 'install', '--source', driverSource, driverSpec];
72
-
73
- if (driverPackage) {
74
- driverArgs.push('--package', driverPackage);
75
- }
76
-
77
- console.log(`${_logSymbols.info} Running: ${process.execPath} ${driverArgs.join(' ')}`);
78
- await (0, _teen_process.exec)(process.execPath, driverArgs, {
79
- env
80
- });
81
- }
82
-
83
- console.log(`${_logSymbols.success} Installed driver "${driverName}"`);
84
- };
85
-
86
- const installPlugin = async env => {
87
- var _installedPlugins$plu;
88
-
89
- console.log(`${_logSymbols.info} Checking if plugin "${pluginName}" is installed...`);
90
- const pluginListArgs = [APPIUM_BIN, 'plugin', 'list', '--json'];
91
- const {
92
- stdout: pluginListJson
93
- } = await (0, _teen_process.exec)(process.execPath, pluginListArgs, {
94
- env
95
- });
96
- const installedPlugins = JSON.parse(pluginListJson);
97
-
98
- if (!((_installedPlugins$plu = installedPlugins[pluginName]) !== null && _installedPlugins$plu !== void 0 && _installedPlugins$plu.installed)) {
99
- console.log(`${_logSymbols.warning} Plugin "${pluginName}" not installed; installing...`);
100
- const pluginArgs = [APPIUM_BIN, 'plugin', 'install', '--source', pluginSource, pluginSpec];
101
-
102
- if (pluginPackage) {
103
- pluginArgs.push('--package', pluginPackage);
104
- }
105
-
106
- console.log(`${_logSymbols.info} Running: ${process.execPath} ${pluginArgs.join(' ')}`);
107
- await (0, _teen_process.exec)(process.execPath, pluginArgs, {
108
- env
109
- });
110
- }
111
-
112
- console.log(`${_logSymbols.success} Installed plugin "${pluginName}"`);
113
- };
114
-
115
- const createServer = async () => {
116
- if (!port) {
117
- port = await (0, _getPort.default)();
118
- }
119
-
120
- console.log(`${_logSymbols.info} Will use port ${port} for Appium server`);
121
- this.port = port;
122
- const args = {
123
- port,
124
- address: host,
125
- usePlugins: [pluginName],
126
- useDrivers: [driverName],
127
- appiumHome,
128
- ...serverArgs
129
- };
130
- server = await (0, _appium.main)(args);
131
- };
132
-
133
- const env = await setupAppiumHome();
134
- await installDriver(env);
135
- await installPlugin(env);
136
- await createServer();
137
- });
138
- after(async function () {
139
- if (server) {
140
- await server.close();
141
- }
142
- });
143
- }
144
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBJVU1fQklOIiwicmVxdWlyZSIsInJlc29sdmUiLCJwbHVnaW5FMkVIYXJuZXNzIiwib3B0cyIsImFwcGl1bUhvbWUiLCJiZWZvcmUiLCJhZnRlciIsInNlcnZlckFyZ3MiLCJkcml2ZXJTb3VyY2UiLCJkcml2ZXJQYWNrYWdlIiwiZHJpdmVyTmFtZSIsImRyaXZlclNwZWMiLCJwbHVnaW5Tb3VyY2UiLCJwbHVnaW5QYWNrYWdlIiwicGx1Z2luU3BlYyIsInBsdWdpbk5hbWUiLCJwb3J0IiwiaG9zdCIsInNlcnZlciIsInNldHVwQXBwaXVtSG9tZSIsImVudiIsInByb2Nlc3MiLCJBUFBJVU1fSE9NRSIsImZzIiwibWtkaXJwIiwiY29uc29sZSIsImxvZyIsImluZm8iLCJpbnN0YWxsRHJpdmVyIiwiZHJpdmVyTGlzdEFyZ3MiLCJleGVjUGF0aCIsImpvaW4iLCJzdGRvdXQiLCJkcml2ZXJMaXN0SnNvbiIsImV4ZWMiLCJpbnN0YWxsZWREcml2ZXJzIiwiSlNPTiIsInBhcnNlIiwiaW5zdGFsbGVkIiwid2FybmluZyIsImRyaXZlckFyZ3MiLCJwdXNoIiwic3VjY2VzcyIsImluc3RhbGxQbHVnaW4iLCJwbHVnaW5MaXN0QXJncyIsInBsdWdpbkxpc3RKc29uIiwiaW5zdGFsbGVkUGx1Z2lucyIsInBsdWdpbkFyZ3MiLCJjcmVhdGVTZXJ2ZXIiLCJnZXRQb3J0IiwiYXJncyIsImFkZHJlc3MiLCJ1c2VQbHVnaW5zIiwidXNlRHJpdmVycyIsImFwcGl1bVNlcnZlciIsImNsb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3BsdWdpbi1lMmUtaGFybmVzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQge2ZzfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge21haW4gYXMgYXBwaXVtU2VydmVyfSBmcm9tICdhcHBpdW0nO1xuaW1wb3J0IGdldFBvcnQgZnJvbSAnZ2V0LXBvcnQnO1xuaW1wb3J0IHtpbmZvLCBzdWNjZXNzLCB3YXJuaW5nfSBmcm9tICdsb2ctc3ltYm9scyc7XG5pbXBvcnQge2V4ZWN9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cbmNvbnN0IEFQUElVTV9CSU4gPSByZXF1aXJlLnJlc29sdmUoJ2FwcGl1bScpO1xuXG4vKipcbiAqIENyZWF0ZXMgaG9va3MgdG8gaW5zdGFsbCBhIGRyaXZlciBhbmQgYSBwbHVnaW4gYW5kIHN0YXJ0cyBhbiBBcHBpdW0gc2VydmVyIHcvIHRoZSBnaXZlbiBleHRlbnNpb25zLlxuICogQHBhcmFtIHtFMkVTZXR1cE9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luRTJFSGFybmVzcyhvcHRzKSB7XG4gIGxldCB7XG4gICAgYXBwaXVtSG9tZSxcbiAgICBiZWZvcmUsXG4gICAgYWZ0ZXIsXG4gICAgc2VydmVyQXJncyA9IHt9LFxuICAgIGRyaXZlclNvdXJjZSxcbiAgICBkcml2ZXJQYWNrYWdlLFxuICAgIGRyaXZlck5hbWUsXG4gICAgZHJpdmVyU3BlYyxcbiAgICBwbHVnaW5Tb3VyY2UsXG4gICAgcGx1Z2luUGFja2FnZSxcbiAgICBwbHVnaW5TcGVjLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcG9ydCxcbiAgICBob3N0LFxuICB9ID0gb3B0cztcblxuICAvKipcbiAgICogQHR5cGUge0FwcGl1bVNlcnZlcn1cbiAgICovXG4gIGxldCBzZXJ2ZXI7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzZXR1cEFwcGl1bUhvbWUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtBcHBpdW1FbnZ9XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVudiA9IHsuLi5wcm9jZXNzLmVudn07XG5cbiAgICAgIGlmIChhcHBpdW1Ib21lKSB7XG4gICAgICAgIGVudi5BUFBJVU1fSE9NRSA9IGFwcGl1bUhvbWU7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChhcHBpdW1Ib21lKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7aW5mb30gU2V0IFxcYEFQUElVTV9IT01FXFxgIHRvICR7YXBwaXVtSG9tZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FwcGl1bUVudn0gZW52XG4gICAgICovXG4gICAgY29uc3QgaW5zdGFsbERyaXZlciA9IGFzeW5jIChlbnYpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAke2luZm99IENoZWNraW5nIGlmIGRyaXZlciBcIiR7ZHJpdmVyTmFtZX1cIiBpcyBpbnN0YWxsZWQuLi5gKTtcbiAgICAgIGNvbnN0IGRyaXZlckxpc3RBcmdzID0gW0FQUElVTV9CSU4sICdkcml2ZXInLCAnbGlzdCcsICctLWpzb24nXTtcbiAgICAgIGNvbnNvbGUubG9nKGAke2luZm99IFJ1bm5pbmc6ICR7cHJvY2Vzcy5leGVjUGF0aH0gJHtkcml2ZXJMaXN0QXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBjb25zdCB7c3Rkb3V0OiBkcml2ZXJMaXN0SnNvbn0gPSBhd2FpdCBleGVjKHByb2Nlc3MuZXhlY1BhdGgsIGRyaXZlckxpc3RBcmdzLCB7XG4gICAgICAgIGVudixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaW5zdGFsbGVkRHJpdmVycyA9IEpTT04ucGFyc2UoZHJpdmVyTGlzdEpzb24pO1xuXG4gICAgICBpZiAoIWluc3RhbGxlZERyaXZlcnNbZHJpdmVyTmFtZV0/Lmluc3RhbGxlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHt3YXJuaW5nfSBEcml2ZXIgXCIke2RyaXZlck5hbWV9XCIgbm90IGluc3RhbGxlZDsgaW5zdGFsbGluZy4uLmApO1xuICAgICAgICBjb25zdCBkcml2ZXJBcmdzID0gW0FQUElVTV9CSU4sICdkcml2ZXInLCAnaW5zdGFsbCcsICctLXNvdXJjZScsIGRyaXZlclNvdXJjZSwgZHJpdmVyU3BlY107XG4gICAgICAgIGlmIChkcml2ZXJQYWNrYWdlKSB7XG4gICAgICAgICAgZHJpdmVyQXJncy5wdXNoKCctLXBhY2thZ2UnLCBkcml2ZXJQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJHtpbmZvfSBSdW5uaW5nOiAke3Byb2Nlc3MuZXhlY1BhdGh9ICR7ZHJpdmVyQXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAgIGF3YWl0IGV4ZWMocHJvY2Vzcy5leGVjUGF0aCwgZHJpdmVyQXJncywge1xuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhgJHtzdWNjZXNzfSBJbnN0YWxsZWQgZHJpdmVyIFwiJHtkcml2ZXJOYW1lfVwiYCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcHBpdW1FbnZ9IGVudlxuICAgICAqL1xuICAgIGNvbnN0IGluc3RhbGxQbHVnaW4gPSBhc3luYyAoZW52KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtpbmZvfSBDaGVja2luZyBpZiBwbHVnaW4gXCIke3BsdWdpbk5hbWV9XCIgaXMgaW5zdGFsbGVkLi4uYCk7XG4gICAgICBjb25zdCBwbHVnaW5MaXN0QXJncyA9IFtBUFBJVU1fQklOLCAncGx1Z2luJywgJ2xpc3QnLCAnLS1qc29uJ107XG4gICAgICBjb25zdCB7c3Rkb3V0OiBwbHVnaW5MaXN0SnNvbn0gPSBhd2FpdCBleGVjKHByb2Nlc3MuZXhlY1BhdGgsIHBsdWdpbkxpc3RBcmdzLCB7XG4gICAgICAgIGVudixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaW5zdGFsbGVkUGx1Z2lucyA9IEpTT04ucGFyc2UocGx1Z2luTGlzdEpzb24pO1xuXG4gICAgICBpZiAoIWluc3RhbGxlZFBsdWdpbnNbcGx1Z2luTmFtZV0/Lmluc3RhbGxlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHt3YXJuaW5nfSBQbHVnaW4gXCIke3BsdWdpbk5hbWV9XCIgbm90IGluc3RhbGxlZDsgaW5zdGFsbGluZy4uLmApO1xuICAgICAgICBjb25zdCBwbHVnaW5BcmdzID0gW0FQUElVTV9CSU4sICdwbHVnaW4nLCAnaW5zdGFsbCcsICctLXNvdXJjZScsIHBsdWdpblNvdXJjZSwgcGx1Z2luU3BlY107XG4gICAgICAgIGlmIChwbHVnaW5QYWNrYWdlKSB7XG4gICAgICAgICAgcGx1Z2luQXJncy5wdXNoKCctLXBhY2thZ2UnLCBwbHVnaW5QYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJHtpbmZvfSBSdW5uaW5nOiAke3Byb2Nlc3MuZXhlY1BhdGh9ICR7cGx1Z2luQXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAgIGF3YWl0IGV4ZWMocHJvY2Vzcy5leGVjUGF0aCwgcGx1Z2luQXJncywge1xuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhgJHtzdWNjZXNzfSBJbnN0YWxsZWQgcGx1Z2luIFwiJHtwbHVnaW5OYW1lfVwiYCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZVNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghcG9ydCkge1xuICAgICAgICBwb3J0ID0gYXdhaXQgZ2V0UG9ydCgpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCR7aW5mb30gV2lsbCB1c2UgcG9ydCAke3BvcnR9IGZvciBBcHBpdW0gc2VydmVyYCk7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0O1xuXG4gICAgICAvKiogQHR5cGUge2ltcG9ydCgnYXBwaXVtJykuQXJnc30gKi9cbiAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGFkZHJlc3M6IGhvc3QsXG4gICAgICAgIHVzZVBsdWdpbnM6IFtwbHVnaW5OYW1lXSxcbiAgICAgICAgdXNlRHJpdmVyczogW2RyaXZlck5hbWVdLFxuICAgICAgICBhcHBpdW1Ib21lLFxuICAgICAgICAuLi5zZXJ2ZXJBcmdzLFxuICAgICAgfTtcbiAgICAgIHNlcnZlciA9IC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqLyAoYXdhaXQgYXBwaXVtU2VydmVyKGFyZ3MpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZW52ID0gYXdhaXQgc2V0dXBBcHBpdW1Ib21lKCk7XG4gICAgYXdhaXQgaW5zdGFsbERyaXZlcihlbnYpO1xuICAgIGF3YWl0IGluc3RhbGxQbHVnaW4oZW52KTtcbiAgICBhd2FpdCBjcmVhdGVTZXJ2ZXIoKTtcbiAgfSk7XG5cbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgRTJFU2V0dXBPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGl1bUhvbWVdIC0gUGF0aCB0byBBcHBpdW0gaG9tZSBkaXJlY3RvcnlcbiAqIEBwcm9wZXJ0eSB7TW9jaGEuYmVmb3JlfSBiZWZvcmUgLSBNb2NoYSBcImJlZm9yZSBhbGxcIiBob29rIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge01vY2hhLmFmdGVyfSBhZnRlciAtIE1vY2hhIFwiYWZ0ZXIgYWxsXCIgaG9vayBmdW5jdGlvblxuICogQHByb3BlcnR5IHtQYXJ0aWFsPGltcG9ydCgnYXBwaXVtJykuQXJncz59IFtzZXJ2ZXJBcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIEFwcGl1bSBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5JbnN0YWxsVHlwZSAmIHN0cmluZ30gZHJpdmVyU291cmNlIC0gU291cmNlIG9mIGRyaXZlciB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RyaXZlclBhY2thZ2VdIC0gUGFja2FnZSBuYW1lIG9mIGRyaXZlciB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZHJpdmVyTmFtZSAtIE5hbWUgb2YgZHJpdmVyIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkcml2ZXJTcGVjIC0gU3BlYyBvZiBkcml2ZXIgdG8gaW5zdGFsbFxuICogQHByb3BlcnR5IHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkluc3RhbGxUeXBlICYgc3RyaW5nfSBwbHVnaW5Tb3VyY2UgLSBTb3VyY2Ugb2YgcGx1Z2luIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGx1Z2luUGFja2FnZV0gLSBQYWNrYWdlIG5hbWUgb2YgcGx1Z2luIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVnaW5TcGVjIC0gU3BlYyBvZiBwbHVnaW4gdG8gaW5zdGFsbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsdWdpbk5hbWUgLSBOYW1lIG9mIHBsdWdpbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCB0byB1c2UgZm9yIEFwcGl1bSBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0IHRvIHVzZSBmb3IgQXBwaXVtIHNlcnZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gQXBwaXVtU2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5BcHBpdW1FbnZ9IEFwcGl1bUVudlxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsUUFBaEIsQ0FBbkI7O0FBT08sU0FBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDO0VBQ3JDLElBQUk7SUFDRkMsVUFERTtJQUVGQyxNQUZFO0lBR0ZDLEtBSEU7SUFJRkMsVUFBVSxHQUFHLEVBSlg7SUFLRkMsWUFMRTtJQU1GQyxhQU5FO0lBT0ZDLFVBUEU7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