appium 2.0.0-beta.25 → 2.0.0-beta.26

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.
Files changed (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +2 -4
  11. package/build/lib/config.js +7 -6
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +40 -68
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +55 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +3 -3
  39. package/lib/config.js +5 -4
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +51 -88
  49. package/lib/schema/arg-spec.js +2 -2
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +60 -28
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -191
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -258
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium",
3
- "version": "2.0.0-beta.25",
3
+ "version": "2.0.0-beta.26",
4
4
  "description": "Automation for Apps.",
5
5
  "keywords": [
6
6
  "automation",
@@ -12,12 +12,14 @@
12
12
  "firefoxos",
13
13
  "testing"
14
14
  ],
15
+ "homepage": "https://appium.io",
15
16
  "bugs": {
16
17
  "url": "https://github.com/appium/appium/issues"
17
18
  },
18
19
  "repository": {
19
20
  "type": "git",
20
- "url": "https://github.com/appium/appium.git"
21
+ "url": "https://github.com/appium/appium.git",
22
+ "directory": "packages/appium"
21
23
  },
22
24
  "license": "Apache-2.0",
23
25
  "author": "https://github.com/appium",
@@ -28,45 +30,52 @@
28
30
  "lib": "./lib"
29
31
  },
30
32
  "files": [
31
- "bin",
32
33
  "lib",
33
34
  "build",
34
35
  "index.js",
35
- "postinstall.js",
36
+ "scripts/postinstall.js",
36
37
  "types"
37
38
  ],
38
39
  "scripts": {
39
- "generate-docs": "gulp transpile && node ./build/commands-yml/parse.js",
40
- "postinstall": "node ./postinstall.js",
41
- "upload": "gulp github-upload",
42
- "zip": "zip -qr appium.zip .",
43
- "zip-and-upload": "npm run zip && npm run upload"
40
+ "build": "babel lib --root-mode=upward --delete-dir-on-start --out-dir=build/lib",
41
+ "postbuild": "npm run generate-schema-json",
42
+ "dev": "npm run build -- --watch",
43
+ "fix": "npm run lint -- --fix",
44
+ "generate-docs": "node ./scripts/parse-yml-commands.js",
45
+ "generate-schema-json": "node ./scripts/generate-schema-json.js",
46
+ "generate-schema-declarations": "node ./scripts/generate-schema-declarations.js",
47
+ "postinstall": "node ./scripts/postinstall.js",
48
+ "lint": "eslint -c ../../.eslintrc --ignore-path ../../.eslintignore .",
49
+ "test": "npm run test:unit",
50
+ "test:e2e": "mocha --require ../../test/setup-babel.js --timeout 20s --slow 10s \"./test/e2e/**/*.spec.js\"",
51
+ "test:unit": "mocha --require ../../test/setup-babel.js \"./test/unit/**/*.spec.js\""
44
52
  },
45
53
  "dependencies": {
46
- "@appium/base-driver": "^8.2.4",
47
- "@appium/base-plugin": "1.8.0",
48
- "@appium/support": "^2.55.4",
49
- "@babel/runtime": "7.16.3",
50
- "@sidvind/better-ajv-errors": "0.9.2",
51
- "ajv": "8.8.2",
54
+ "@appium/base-driver": "^8.3.0",
55
+ "@appium/base-plugin": "1.8.1",
56
+ "@appium/support": "^2.56.0",
57
+ "@babel/runtime": "7.17.8",
58
+ "@sidvind/better-ajv-errors": "1.1.1",
59
+ "ajv": "8.10.0",
52
60
  "ajv-formats": "2.1.1",
53
61
  "argparse": "2.0.1",
54
- "async-lock": "1.3.0",
62
+ "async-lock": "1.3.1",
55
63
  "asyncbox": "2.9.2",
56
- "axios": "0.24.0",
64
+ "axios": "0.26.1",
57
65
  "bluebird": "3.7.2",
58
66
  "continuation-local-storage": "3.2.1",
59
67
  "find-up": "5.0.0",
60
68
  "lilconfig": "2.0.4",
61
69
  "lodash": "4.17.21",
62
70
  "longjohn": "0.2.12",
63
- "npmlog": "5.0.1",
71
+ "npmlog": "6.0.1",
64
72
  "ora": "5.4.1",
73
+ "package-changed": "1.9.0",
65
74
  "resolve-from": "5.0.0",
66
75
  "semver": "7.3.5",
67
76
  "source-map-support": "0.5.21",
68
77
  "teen_process": "1.16.0",
69
- "winston": "3.3.3",
78
+ "winston": "3.6.0",
70
79
  "word-wrap": "1.2.3",
71
80
  "yaml": "1.10.2"
72
81
  },
@@ -78,6 +87,5 @@
78
87
  "access": "public",
79
88
  "tag": "next"
80
89
  },
81
- "homepage": "https://appium.io",
82
- "gitHead": "42f4a2de2d763d57cf0bdb6fb6c9a3bc9c3d232f"
90
+ "gitHead": "f5cce0f29d31699decea63ed94c4506f7af469df"
83
91
  }
@@ -12,7 +12,7 @@ async function main () {
12
12
 
13
13
  let extension;
14
14
  try {
15
- extension = require('./build/lib/cli/extension');
15
+ extension = require('../build/lib/cli/extension');
16
16
  } catch (e) {
17
17
  throw new Error(`Could not load extension CLI file; has the project been transpiled? ` +
18
18
  `(${e.message})`);
package/types/types.d.ts CHANGED
@@ -1,10 +1,15 @@
1
- import {transformers} from '../lib/schema/cli-transformers';
2
- import {SERVER_SUBCOMMAND} from '../lib/cli/parser';
3
1
  import {
4
2
  DRIVER_TYPE as DRIVER_SUBCOMMAND,
3
+ EXT_SUBCOMMAND_INSTALL,
4
+ EXT_SUBCOMMAND_UPDATE,
5
+ EXT_SUBCOMMAND_RUN,
6
+ EXT_SUBCOMMAND_LIST,
7
+ EXT_SUBCOMMAND_UNINSTALL,
5
8
  PLUGIN_TYPE as PLUGIN_SUBCOMMAND,
6
- } from '../lib/ext-config-io';
9
+ SERVER_SUBCOMMAND,
10
+ } from '../lib/constants';
7
11
  import appiumConfigSchema from '../lib/schema/appium-config-schema';
12
+ import {transformers} from '../lib/schema/cli-transformers';
8
13
  import {AppiumConfiguration, ServerConfig} from './appium-config';
9
14
 
10
15
  /**
@@ -124,14 +129,14 @@ type DefaultForProp<Prop extends keyof ServerConfigMapping> =
124
129
  /**
125
130
  * The final shape of the parsed CLI arguments.
126
131
  */
127
- type ParsedArgsFromConfig = {
132
+ type ArgsFromConfig = {
128
133
  [Prop in keyof ServerConfigMapping as SetKeyForProp<Prop>]: DefaultForProp<Prop>;
129
134
  };
130
135
 
131
136
  /**
132
137
  * Possible subcommands for the `appium` CLI.
133
138
  */
134
- type CliSubCommands =
139
+ type CliSubcommand =
135
140
  | typeof SERVER_SUBCOMMAND
136
141
  | typeof DRIVER_SUBCOMMAND
137
142
  | typeof PLUGIN_SUBCOMMAND;
@@ -140,12 +145,12 @@ type CliSubCommands =
140
145
  * Possible subcommands of {@link DRIVER_SUBCOMMAND} or
141
146
  * {@link PLUGIN_SUBCOMMAND}.
142
147
  */
143
- type CliExtensionSubcommands =
144
- | 'list'
145
- | 'install'
146
- | 'uninstall'
147
- | 'update'
148
- | 'run';
148
+ export type CliExtensionSubcommand =
149
+ | typeof EXT_SUBCOMMAND_INSTALL
150
+ | typeof EXT_SUBCOMMAND_LIST
151
+ | typeof EXT_SUBCOMMAND_RUN
152
+ | typeof EXT_SUBCOMMAND_UPDATE
153
+ | typeof EXT_SUBCOMMAND_UNINSTALL;
149
154
 
150
155
  /**
151
156
  * Random stuff that may appear in the parsed args which has no equivalent in a
@@ -153,31 +158,64 @@ type CliExtensionSubcommands =
153
158
  */
154
159
  interface MoreArgs {
155
160
  /**
156
- * Path to config file, if any
161
+ * Path to config file, if any. Does not make sense for this to be allowed in a config file!
157
162
  */
158
- configFile: string;
163
+ configFile?: string;
159
164
 
160
165
  /**
161
- * If true, show the build info and exit
166
+ * If true, show the config and exit
162
167
  */
163
- showBuildInfo: boolean;
168
+ showConfig?: boolean;
164
169
 
165
170
  /**
166
- * If true, show config and exit
171
+ * If true, open a REPL
167
172
  */
168
- showConfig: boolean;
173
+ shell?: boolean;
174
+ }
169
175
 
176
+ /**
177
+ * These arguments are _not_ supported by the CLI, but only via programmatic usage / tests.
178
+ */
179
+ interface ProgrammaticArgs {
170
180
  /**
171
- * If true, open a REPL
181
+ * Subcommands of `driver` subcommand
182
+ */
183
+ driverCommand?: CliExtensionSubcommand;
184
+
185
+ /**
186
+ * Subcommands of `plugin` subcommand
172
187
  */
173
- shell: boolean;
188
+ pluginCommand?: CliExtensionSubcommand;
174
189
 
175
190
  /**
176
- * If true, throw on error instead of exit. Not supported via CLI, but rather
177
- * only programmatic usage.
191
+ * If true, throw on error instead of exit.
178
192
  */
179
- throwInsteadOfExit: boolean;
193
+ throwInsteadOfExit?: boolean;
180
194
 
195
+ /**
196
+ * Seems to only be used in tests or standalone driver calls
197
+ */
198
+ logHandler?: (...args: any[]) => void;
199
+
200
+ /**
201
+ * Alternate way to set `APPIUM_HOME` for tests. Since we don't want to muck about
202
+ * with the environment, we just set it here.
203
+ */
204
+ appiumHome?: string;
205
+
206
+ /**
207
+ * If true, show the build info and exit
208
+ */
209
+ showBuildInfo: boolean;
210
+
211
+ /**
212
+ * If true, show config and exit
213
+ */
214
+ showConfig: boolean;
215
+
216
+ }
217
+
218
+ interface SubcommandArgs {
181
219
  /**
182
220
  * Possible subcommands
183
221
  */
@@ -185,17 +223,15 @@ interface MoreArgs {
185
223
  | typeof DRIVER_SUBCOMMAND
186
224
  | typeof PLUGIN_SUBCOMMAND
187
225
  | typeof SERVER_SUBCOMMAND;
226
+ }
188
227
 
189
228
  /**
190
- * Subcommands of `driver` subcommand
191
- */
192
- driverCommand: CliExtensionSubcommands;
193
-
194
- /**
195
- * Subcommands of `plugin` subcommand
229
+ * The same as {@link ParsedArgs} but with a nullable `subcommand`.
196
230
  */
197
- pluginCommand: CliExtensionSubcommands;
198
- }
231
+ export type PartialArgs = ArgsFromConfig &
232
+ MoreArgs &
233
+ ProgrammaticArgs &
234
+ Partial<SubcommandArgs>;
199
235
 
200
236
  /**
201
237
  * The Appium configuration as a flattened object, parsed via CLI args _and_ any
@@ -203,4 +239,7 @@ interface MoreArgs {
203
239
  * @todo Does not make any assumptions about property names derived from
204
240
  * extensions.
205
241
  */
206
- export type ParsedArgs = ParsedArgsFromConfig & Partial<MoreArgs>;
242
+ export type ParsedArgs = ArgsFromConfig &
243
+ MoreArgs &
244
+ ProgrammaticArgs &
245
+ SubcommandArgs;
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* eslint no-console:0 */
4
-
5
- /*
6
- * Small tool, launching and monitoring ios-web-kit-proxy, and relaunching
7
- * on predefined errors.
8
- *
9
- * Usage:
10
- * ./bin/ios-webkit-debug-proxy-launcher.js [args]
11
- * args: ios-webkit-debug-proxy args (they will be passed over)
12
- *
13
- * Example:
14
- * ./bin/ios-webkit-debug-proxy-launcher.js -c <UDID>:27753 -d
15
- *
16
- * Note:
17
- * For iOS8.1 try this first:
18
- * brew install --HEAD ideviceinstaller
19
- */
20
-
21
- 'use strict';
22
-
23
- const spawn = require('child_process').spawn;
24
- const _ = require('lodash');
25
-
26
- const args = process.argv.slice(2);
27
-
28
- const RESTART_ON_MESSAGES = [
29
- 'Invalid message _rpc_applicationUpdated',
30
- 'Invalid message _rpc_applicationSentListing'];
31
-
32
- const PROXY_CMD = 'ios_webkit_debug_proxy';
33
- let proxy;
34
-
35
- const handleKillProcess = function (exitCode) {
36
- console.log('\nKilling proxy process!');
37
- proxy.kill('SIGTERM');
38
- process.exit((exitCode || 0));
39
- };
40
-
41
- const startProxy = function () {
42
- console.log(`RUNNING: ${PROXY_CMD} ${args.join(' ')}`);
43
-
44
- proxy = spawn(PROXY_CMD, args);
45
-
46
- proxy.stdout.on('data', function onStdout (data) {
47
- console.log(`stdout: ${data}`);
48
- });
49
-
50
- proxy.stderr.on('data', function onStderr (data) {
51
- console.log(`stderr: ${data}`);
52
- const restartMessage = _(RESTART_ON_MESSAGES).find(function findMessage (message) {
53
- return ('' + data).indexOf(message) >= 0;
54
- });
55
- if (restartMessage) {
56
- console.log(`Detected error message: ${restartMessage}`);
57
- console.log('Killing proxy!');
58
- proxy.kill('SIGTERM');
59
- process.nextTick(startProxy);
60
- }
61
- });
62
-
63
- proxy.on('close', function onClose (code) {
64
- console.log(`Child process exited with code ${code}`);
65
- });
66
- };
67
-
68
- process.on('SIGINT', handleKillProcess);
69
- process.on('SIGTERM', handleKillProcess);
70
-
71
- startProxy();
@@ -1,23 +0,0 @@
1
- "use strict";
2
-
3
- require("source-map-support/register");
4
-
5
- const childProcess = require('child_process');
6
-
7
- const _ = require('lodash');
8
-
9
- const res = JSON.parse(childProcess.execSync('npm pack --dry-run --json --ignore-scripts', {
10
- encoding: 'utf8'
11
- }))[0];
12
- const testFiles = ['LICENSE', 'build/lib/appium.js'];
13
-
14
- const missingFiles = _.without(testFiles, ..._.map(res.files, 'path'));
15
-
16
- if (!_.isEmpty(missingFiles)) {
17
- throw new Error(`Files [${missingFiles.join(', ')}] are not included in package.json "files". ` + `Please make sure these files are included before publishing.`);
18
- }
19
-
20
- process.exit(0);require('source-map-support').install();
21
-
22
-
23
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNoZWNrLW5wbS1wYWNrLWZpbGVzLmpzIl0sIm5hbWVzIjpbImNoaWxkUHJvY2VzcyIsInJlcXVpcmUiLCJfIiwicmVzIiwiSlNPTiIsInBhcnNlIiwiZXhlY1N5bmMiLCJlbmNvZGluZyIsInRlc3RGaWxlcyIsIm1pc3NpbmdGaWxlcyIsIndpdGhvdXQiLCJtYXAiLCJmaWxlcyIsImlzRW1wdHkiLCJFcnJvciIsImpvaW4iLCJwcm9jZXNzIiwiZXhpdCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU1BLFlBQVksR0FBR0MsT0FBTyxDQUFDLGVBQUQsQ0FBNUI7O0FBQ0EsTUFBTUMsQ0FBQyxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUFqQjs7QUFFQSxNQUFNRSxHQUFHLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxZQUFZLENBQUNNLFFBQWIsQ0FBc0IsNENBQXRCLEVBQW9FO0FBQUNDLEVBQUFBLFFBQVEsRUFBRTtBQUFYLENBQXBFLENBQVgsRUFBb0csQ0FBcEcsQ0FBWjtBQUdBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixTQURnQixFQUVoQixxQkFGZ0IsQ0FBbEI7O0FBTUEsTUFBTUMsWUFBWSxHQUFHUCxDQUFDLENBQUNRLE9BQUYsQ0FBVUYsU0FBVixFQUFxQixHQUFHTixDQUFDLENBQUNTLEdBQUYsQ0FBTVIsR0FBRyxDQUFDUyxLQUFWLEVBQWlCLE1BQWpCLENBQXhCLENBQXJCOztBQUVBLElBQUksQ0FBQ1YsQ0FBQyxDQUFDVyxPQUFGLENBQVVKLFlBQVYsQ0FBTCxFQUE4QjtBQUM1QixRQUFNLElBQUlLLEtBQUosQ0FBVyxVQUFTTCxZQUFZLENBQUNNLElBQWIsQ0FBa0IsSUFBbEIsQ0FBd0IsOENBQWxDLEdBQ2IsOERBREcsQ0FBTjtBQUVEOztBQUVEQyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG5jb25zdCByZXMgPSBKU09OLnBhcnNlKGNoaWxkUHJvY2Vzcy5leGVjU3luYygnbnBtIHBhY2sgLS1kcnktcnVuIC0tanNvbiAtLWlnbm9yZS1zY3JpcHRzJywge2VuY29kaW5nOiAndXRmOCd9KSlbMF07XG5cbi8vIExpc3Qgb2YgZmlsZXMgd2UgYXJlIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGluY2x1ZGVkIGluIHBhY2thZ2VcbmNvbnN0IHRlc3RGaWxlcyA9IFtcbiAgJ0xJQ0VOU0UnLCAvLyBDaGVjayB0aGF0IGxpY2Vuc2UgaXMgaW5jbHVkZWRcbiAgJ2J1aWxkL2xpYi9hcHBpdW0uanMnLCAvLyBTYW5pdHkgY2hlY2sgdGhhdCBidWlsZCBmaWxlcyBhcmUgYmVpbmcgaW5jbHVkZWQgYnkgdGVzdGluZyBqdXN0IG9uZSBmaWxlXG5dO1xuXG4vLyBHZXQgbGlzdCBvZiBmaWxlcyBpbiBgdGVzdEZpbGVzYCB0aGF0IGFyZW4ndCBpbiB0aGUgbGlzdCBvZiBwYWNrYWdlZCBmaWxlTmFtZXNcbmNvbnN0IG1pc3NpbmdGaWxlcyA9IF8ud2l0aG91dCh0ZXN0RmlsZXMsIC4uLl8ubWFwKHJlcy5maWxlcywgJ3BhdGgnKSk7XG5cbmlmICghXy5pc0VtcHR5KG1pc3NpbmdGaWxlcykpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBGaWxlcyBbJHttaXNzaW5nRmlsZXMuam9pbignLCAnKX1dIGFyZSBub3QgaW5jbHVkZWQgaW4gcGFja2FnZS5qc29uIFwiZmlsZXNcIi4gYCArXG4gICAgYFBsZWFzZSBtYWtlIHN1cmUgdGhlc2UgZmlsZXMgYXJlIGluY2x1ZGVkIGJlZm9yZSBwdWJsaXNoaW5nLmApO1xufVxuXG5wcm9jZXNzLmV4aXQoMCk7XG4iXSwiZmlsZSI6ImNoZWNrLW5wbS1wYWNrLWZpbGVzLmpzIiwic291cmNlUm9vdCI6Ii4uIn0=