appium 2.0.0-beta.4 → 2.0.0-beta.40

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 (151) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +257 -131
  5. package/build/lib/cli/args.d.ts +20 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +36 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +25 -18
  11. package/build/lib/cli/extension-command.d.ts +372 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +286 -156
  14. package/build/lib/cli/extension.d.ts +18 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +30 -17
  17. package/build/lib/cli/parser.d.ts +80 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +152 -95
  20. package/build/lib/cli/plugin-command.d.ts +33 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +24 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +41 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +92 -67
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +74 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +68 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +189 -90
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +180 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +452 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +112 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +517 -186
  99. package/lib/cli/args.js +269 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +612 -260
  102. package/lib/cli/extension.js +34 -16
  103. package/lib/cli/parser.js +241 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +210 -91
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +679 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +303 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +75 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +177 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/types/appium-manifest.ts +73 -0
  133. package/types/cli.ts +146 -0
  134. package/types/extension-manifest.ts +64 -0
  135. package/types/index.ts +21 -0
  136. package/CHANGELOG.md +0 -3515
  137. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  138. package/build/lib/cli/npm.js +0 -206
  139. package/build/lib/cli/parser-helpers.js +0 -82
  140. package/build/lib/driver-config.js +0 -77
  141. package/build/lib/drivers.js +0 -96
  142. package/build/lib/extension-config.js +0 -253
  143. package/build/lib/plugin-config.js +0 -59
  144. package/build/lib/plugins.js +0 -14
  145. package/lib/cli/npm.js +0 -183
  146. package/lib/cli/parser-helpers.js +0 -79
  147. package/lib/driver-config.js +0 -46
  148. package/lib/drivers.js +0 -81
  149. package/lib/extension-config.js +0 -209
  150. package/lib/plugin-config.js +0 -34
  151. package/lib/plugins.js +0 -10
package/build/lib/main.js CHANGED
@@ -1,14 +1,38 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
5
-
6
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
7
5
 
8
6
  Object.defineProperty(exports, "__esModule", {
9
7
  value: true
10
8
  });
9
+ Object.defineProperty(exports, "finalizeSchema", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _schema.finalizeSchema;
13
+ }
14
+ });
15
+ Object.defineProperty(exports, "getSchema", {
16
+ enumerable: true,
17
+ get: function () {
18
+ return _schema.getSchema;
19
+ }
20
+ });
21
+ exports.init = init;
11
22
  exports.main = main;
23
+ Object.defineProperty(exports, "readConfigFile", {
24
+ enumerable: true,
25
+ get: function () {
26
+ return _configFile.readConfigFile;
27
+ }
28
+ });
29
+ exports.resolveAppiumHome = void 0;
30
+ Object.defineProperty(exports, "validate", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _schema.validate;
34
+ }
35
+ });
12
36
 
13
37
  require("source-map-support/register");
14
38
 
@@ -16,41 +40,40 @@ var _logsink = require("./logsink");
16
40
 
17
41
  var _logger = _interopRequireDefault(require("./logger"));
18
42
 
19
- var _lodash = _interopRequireDefault(require("lodash"));
43
+ var _baseDriver = require("@appium/base-driver");
20
44
 
21
- var _appiumBaseDriver = require("appium-base-driver");
45
+ var _support = require("@appium/support");
22
46
 
23
47
  var _asyncbox = require("asyncbox");
24
48
 
25
- var _parser = _interopRequireWildcard(require("./cli/parser"));
49
+ var _lodash = _interopRequireDefault(require("lodash"));
50
+
51
+ var _appium = require("./appium");
26
52
 
27
- var _args = require("./cli/args");
53
+ var _extension = require("./cli/extension");
28
54
 
29
- var _appiumSupport = require("appium-support");
55
+ var _parser = require("./cli/parser");
30
56
 
31
57
  var _config = require("./config");
32
58
 
33
- var _driverConfig = _interopRequireDefault(require("./driver-config"));
59
+ var _configFile = require("./config-file");
34
60
 
35
- var _pluginConfig = _interopRequireDefault(require("./plugin-config"));
61
+ var _extension2 = require("./extension");
36
62
 
37
- var _extensionConfig = require("./extension-config");
38
-
39
- var _extension = require("./cli/extension");
40
-
41
- var _appium = require("./appium");
63
+ var _constants = require("./constants");
42
64
 
43
65
  var _gridRegister = _interopRequireDefault(require("./grid-register"));
44
66
 
67
+ var _schema = require("./schema/schema");
68
+
45
69
  var _utils = require("./utils");
46
70
 
47
- async function preflightChecks({
48
- parser,
49
- args,
50
- driverConfig,
51
- pluginConfig,
52
- throwInsteadOfExit = false
53
- }) {
71
+ const {
72
+ resolveAppiumHome
73
+ } = _support.env;
74
+ exports.resolveAppiumHome = resolveAppiumHome;
75
+
76
+ async function preflightChecks(args, throwInsteadOfExit = false) {
54
77
  try {
55
78
  (0, _config.checkNodeOk)();
56
79
 
@@ -58,15 +81,13 @@ async function preflightChecks({
58
81
  require('longjohn').async_trace_limit = -1;
59
82
  }
60
83
 
61
- if (args.showConfig) {
62
- await (0, _config.showConfig)();
84
+ if (args.showBuildInfo) {
85
+ await (0, _config.showBuildInfo)();
63
86
  process.exit(0);
64
87
  }
65
88
 
66
89
  (0, _config.warnNodeDeprecations)();
67
- (0, _config.validateServerArgs)(parser, args);
68
- await driverConfig.read();
69
- await pluginConfig.read();
90
+ (0, _schema.validate)(args);
70
91
 
71
92
  if (args.tmpDir) {
72
93
  await (0, _config.validateTmpDir)(args.tmpDir);
@@ -85,16 +106,16 @@ async function preflightChecks({
85
106
  function logNonDefaultArgsWarning(args) {
86
107
  _logger.default.info('Non-default server args:');
87
108
 
88
- (0, _utils.inspectObject)(args);
109
+ (0, _utils.inspect)(args);
89
110
  }
90
111
 
91
112
  function logDefaultCapabilitiesWarning(caps) {
92
113
  _logger.default.info('Default capabilities, which will be added to each request ' + 'unless overridden by desired capabilities:');
93
114
 
94
- (0, _utils.inspectObject)(caps);
115
+ (0, _utils.inspect)(caps);
95
116
  }
96
117
 
97
- async function logStartupInfo(parser, args) {
118
+ async function logStartupInfo(args) {
98
119
  let welcome = `Welcome to Appium v${_config.APPIUM_VER}`;
99
120
  let appiumRev = await (0, _config.getGitRev)();
100
121
 
@@ -104,7 +125,7 @@ async function logStartupInfo(parser, args) {
104
125
 
105
126
  _logger.default.info(welcome);
106
127
 
107
- let showArgs = (0, _config.getNonDefaultArgs)(parser, args);
128
+ let showArgs = (0, _config.getNonDefaultServerArgs)(args);
108
129
 
109
130
  if (_lodash.default.size(showArgs)) {
110
131
  logNonDefaultArgsWarning(showArgs);
@@ -121,88 +142,168 @@ function logServerPort(address, port) {
121
142
  _logger.default.info(logMessage);
122
143
  }
123
144
 
124
- async function main(args = null) {
125
- let parser = (0, _parser.default)();
145
+ function getServerUpdaters(driverClasses, pluginClasses) {
146
+ return _lodash.default.compact(_lodash.default.map([...driverClasses.keys(), ...pluginClasses.keys()], 'updateServer'));
147
+ }
148
+
149
+ function getExtraMethodMap(driverClasses, pluginClasses) {
150
+ return [...driverClasses.keys(), ...pluginClasses.keys()].reduce((map, klass) => {
151
+ var _klass$newMethodMap;
152
+
153
+ return { ...map,
154
+ ...((_klass$newMethodMap = klass.newMethodMap) !== null && _klass$newMethodMap !== void 0 ? _klass$newMethodMap : {})
155
+ };
156
+ }, {});
157
+ }
158
+
159
+ function areServerCommandArgs(args) {
160
+ return args.subcommand === _constants.SERVER_SUBCOMMAND;
161
+ }
162
+
163
+ async function init(args) {
164
+ var _args$appiumHome;
165
+
166
+ const appiumHome = (_args$appiumHome = args === null || args === void 0 ? void 0 : args.appiumHome) !== null && _args$appiumHome !== void 0 ? _args$appiumHome : await resolveAppiumHome();
167
+ const {
168
+ driverConfig,
169
+ pluginConfig
170
+ } = await (0, _extension2.loadExtensions)(appiumHome);
171
+ const parser = (0, _parser.getParser)();
126
172
  let throwInsteadOfExit = false;
173
+ let preConfigArgs;
127
174
 
128
175
  if (args) {
129
- args = Object.assign({}, (0, _parser.getDefaultServerArgs)(), args);
176
+ var _args$subcommand;
130
177
 
131
178
  if (args.throwInsteadOfExit) {
132
179
  throwInsteadOfExit = true;
133
180
  delete args.throwInsteadOfExit;
134
181
  }
182
+
183
+ preConfigArgs = { ...args,
184
+ subcommand: (_args$subcommand = args.subcommand) !== null && _args$subcommand !== void 0 ? _args$subcommand : _constants.SERVER_SUBCOMMAND
185
+ };
135
186
  } else {
136
- args = parser.parseArgs();
187
+ preConfigArgs = parser.parseArgs();
137
188
  }
138
189
 
139
- await (0, _logsink.init)(args);
190
+ const configResult = await (0, _configFile.readConfigFile)(preConfigArgs.configFile);
191
+
192
+ if (!_lodash.default.isEmpty(configResult.errors)) {
193
+ var _configResult$reason;
140
194
 
141
- if (args.subcommand === _extensionConfig.DRIVER_TYPE || args.subcommand === _extensionConfig.PLUGIN_TYPE) {
142
- await (0, _extension.runExtensionCommand)(args, args.subcommand);
143
- process.exit();
195
+ throw new Error(`Errors in config file ${configResult.filepath}:\n ${(_configResult$reason = configResult.reason) !== null && _configResult$reason !== void 0 ? _configResult$reason : configResult.errors}`);
144
196
  }
145
197
 
146
- if (args.logFilters) {
147
- const {
148
- issues,
149
- rules
150
- } = await _appiumSupport.logger.loadSecureValuesPreprocessingRules(args.logFilters);
198
+ if (!areServerCommandArgs(preConfigArgs)) {
199
+ if (preConfigArgs.subcommand === _constants.DRIVER_TYPE) {
200
+ await (0, _extension.runExtensionCommand)(preConfigArgs, driverConfig);
201
+ return {};
202
+ }
203
+
204
+ if (preConfigArgs.subcommand === _constants.PLUGIN_TYPE) {
205
+ await (0, _extension.runExtensionCommand)(preConfigArgs, pluginConfig);
206
+ return {};
207
+ }
208
+
209
+ return {};
210
+ } else {
211
+ var _configResult$config;
212
+
213
+ const defaults = (0, _schema.getDefaultsForSchema)(false);
151
214
 
152
- if (!_lodash.default.isEmpty(issues)) {
153
- throw new Error(`The log filtering rules config '${args.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
215
+ const serverArgs = _lodash.default.defaultsDeep(preConfigArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, defaults);
216
+
217
+ if (preConfigArgs.showConfig) {
218
+ (0, _config.showConfig)((0, _config.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
219
+ return {};
154
220
  }
155
221
 
156
- if (_lodash.default.isEmpty(rules)) {
157
- _logger.default.warn(`Found no log filtering rules in '${args.logFilters}'. Is that expected?`);
158
- } else {
159
- _logger.default.info(`Loaded ${_appiumSupport.util.pluralize('filtering rule', rules.length, true)} from '${args.logFilters}'`);
222
+ await (0, _logsink.init)(serverArgs);
223
+
224
+ if (serverArgs.logFilters) {
225
+ const {
226
+ issues,
227
+ rules
228
+ } = await _support.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
229
+
230
+ if (!_lodash.default.isEmpty(issues)) {
231
+ throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
232
+ }
233
+
234
+ if (_lodash.default.isEmpty(rules)) {
235
+ _logger.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
236
+ } else {
237
+ _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
238
+ }
160
239
  }
240
+
241
+ const appiumDriver = new _appium.AppiumDriver(serverArgs);
242
+ appiumDriver.driverConfig = driverConfig;
243
+ await preflightChecks(serverArgs, throwInsteadOfExit);
244
+ return {
245
+ appiumDriver,
246
+ parsedArgs: serverArgs,
247
+ driverConfig,
248
+ pluginConfig
249
+ };
161
250
  }
251
+ }
162
252
 
163
- let appiumDriver = new _appium.AppiumDriver(args);
164
- const driverConfig = new _driverConfig.default(args.appiumHome);
165
- const pluginConfig = new _pluginConfig.default(args.appiumHome);
166
- appiumDriver.driverConfig = driverConfig;
167
- await preflightChecks({
168
- parser,
169
- args,
170
- driverConfig,
253
+ async function main(args) {
254
+ const {
255
+ appiumDriver,
256
+ parsedArgs,
171
257
  pluginConfig,
172
- throwInsteadOfExit
173
- });
174
- await logStartupInfo(parser, args);
175
- let routeConfiguringFunction = (0, _appiumBaseDriver.routeConfiguringFunction)(appiumDriver);
176
- const plugins = Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(args.plugins, pluginName) || args.plugins.length === 1 && args.plugins[0] === _args.USE_ALL_PLUGINS).map(pluginName => {
177
- try {
178
- const PluginClass = pluginConfig.require(pluginName);
179
-
180
- return new PluginClass(pluginName);
181
- } catch (err) {
182
- _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err}`);
183
-
184
- return false;
185
- }
186
- }).filter(Boolean);
187
- appiumDriver.plugins = plugins;
188
- let server = await (0, _appiumBaseDriver.server)({
258
+ driverConfig
259
+ } = await init(args);
260
+
261
+ if (!appiumDriver || !parsedArgs || !pluginConfig || !driverConfig) {
262
+ return;
263
+ }
264
+
265
+ const pluginClasses = (0, _extension2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
266
+ appiumDriver.pluginClasses = pluginClasses;
267
+ await logStartupInfo(parsedArgs);
268
+ let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
269
+ const driverClasses = (0, _extension2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
270
+ const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
271
+ const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
272
+ const serverOpts = {
189
273
  routeConfiguringFunction,
190
- port: args.port,
191
- hostname: args.address,
192
- allowCors: args.allowCors,
193
- basePath: args.basePath,
194
- plugins
195
- });
196
-
197
- if (args.allowCors) {
274
+ port: parsedArgs.port,
275
+ hostname: parsedArgs.address,
276
+ allowCors: parsedArgs.allowCors,
277
+ basePath: parsedArgs.basePath,
278
+ serverUpdaters,
279
+ extraMethodMap
280
+ };
281
+
282
+ if (parsedArgs.keepAliveTimeout) {
283
+ serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
284
+ }
285
+
286
+ let server;
287
+
288
+ try {
289
+ server = await (0, _baseDriver.server)(serverOpts);
290
+ } catch (err) {
291
+ _logger.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` + `to update the server and failed. Original error: ${err.message}`);
292
+
293
+ _logger.default.debug(err.stack);
294
+
295
+ return process.exit(1);
296
+ }
297
+
298
+ if (parsedArgs.allowCors) {
198
299
  _logger.default.warn('You have enabled CORS requests from any host. Be careful not ' + 'to visit sites which could maliciously try to start Appium ' + 'sessions on your machine');
199
300
  }
200
301
 
201
302
  appiumDriver.server = server;
202
303
 
203
304
  try {
204
- if (args.nodeconfig !== null) {
205
- await (0, _gridRegister.default)(args.nodeconfig, args.address, args.port, args.basePath);
305
+ if (parsedArgs.nodeconfig) {
306
+ await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
206
307
  }
207
308
  } catch (err) {
208
309
  await server.close();
@@ -228,15 +329,13 @@ async function main(args = null) {
228
329
  });
229
330
  }
230
331
 
231
- logServerPort(args.address, args.port);
332
+ logServerPort(parsedArgs.address, parsedArgs.port);
232
333
  driverConfig.print();
233
- pluginConfig.print(plugins);
334
+ pluginConfig.print([...pluginClasses.values()]);
234
335
  return server;
235
336
  }
236
337
 
237
338
  if (require.main === module) {
238
339
  (0, _asyncbox.asyncify)(main);
239
- }require('source-map-support').install();
240
-
241
-
242
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsInBhcnNlciIsImFyZ3MiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInJlYWQiLCJ0bXBEaXIiLCJlcnIiLCJsb2dnZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWQiLCJsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmciLCJpbmZvIiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsInNob3dBcmdzIiwiXyIsInNpemUiLCJpc0VtcHR5IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImxvZ1NlcnZlclBvcnQiLCJhZGRyZXNzIiwicG9ydCIsImxvZ01lc3NhZ2UiLCJtYWluIiwiT2JqZWN0IiwiYXNzaWduIiwicGFyc2VBcmdzIiwic3ViY29tbWFuZCIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwiYXBwaXVtRHJpdmVyIiwiQXBwaXVtRHJpdmVyIiwiRHJpdmVyQ29uZmlnIiwiYXBwaXVtSG9tZSIsIlBsdWdpbkNvbmZpZyIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInBsdWdpbnMiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImZpbHRlciIsInBsdWdpbk5hbWUiLCJpbmNsdWRlcyIsIlVTRV9BTExfUExVR0lOUyIsIm1hcCIsIlBsdWdpbkNsYXNzIiwiQm9vbGVhbiIsInNlcnZlciIsImhvc3RuYW1lIiwiYWxsb3dDb3JzIiwiYmFzZVBhdGgiLCJub2RlY29uZmlnIiwiY2xvc2UiLCJzaWduYWwiLCJvbmNlIiwib25TaWduYWwiLCJkZWxldGVBbGxTZXNzaW9ucyIsImZvcmNlIiwicmVhc29uIiwiZSIsInByaW50IiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxlQUFlQSxlQUFmLENBQWdDO0FBQUNDLEVBQUFBLE1BQUQ7QUFBU0MsRUFBQUEsSUFBVDtBQUFlQyxFQUFBQSxZQUFmO0FBQTZCQyxFQUFBQSxZQUE3QjtBQUEyQ0MsRUFBQUEsa0JBQWtCLEdBQUc7QUFBaEUsQ0FBaEMsRUFBd0c7QUFDdEcsTUFBSTtBQUNGOztBQUNBLFFBQUlILElBQUksQ0FBQ0ksY0FBVCxFQUF5QjtBQUN2QkMsTUFBQUEsT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQkMsaUJBQXBCLEdBQXdDLENBQUMsQ0FBekM7QUFDRDs7QUFDRCxRQUFJTixJQUFJLENBQUNPLFVBQVQsRUFBcUI7QUFDbkIsWUFBTSx5QkFBTjtBQUNBQyxNQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0FBQ0Q7O0FBQ0Q7QUFDQSxvQ0FBbUJWLE1BQW5CLEVBQTJCQyxJQUEzQjtBQUNBLFVBQU1DLFlBQVksQ0FBQ1MsSUFBYixFQUFOO0FBQ0EsVUFBTVIsWUFBWSxDQUFDUSxJQUFiLEVBQU47O0FBQ0EsUUFBSVYsSUFBSSxDQUFDVyxNQUFULEVBQWlCO0FBQ2YsWUFBTSw0QkFBZVgsSUFBSSxDQUFDVyxNQUFwQixDQUFOO0FBQ0Q7QUFDRixHQWhCRCxDQWdCRSxPQUFPQyxHQUFQLEVBQVk7QUFDWkMsb0JBQU9DLEtBQVAsQ0FBYUYsR0FBRyxDQUFD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akQsSUFBVDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHsgaW5pdCBhcyBsb2dzaW5rSW5pdCB9IGZyb20gJy4vbG9nc2luayc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJzsgLy8gbG9nZ2VyIG5lZWRzIHRvIHJlbWFpbiBmaXJzdCBvZiBpbXBvcnRzXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2VydmVyIGFzIGJhc2VTZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGFzeW5jaWZ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBnZXRQYXJzZXIsIGdldERlZmF1bHRTZXJ2ZXJBcmdzIH0gZnJvbSAnLi9jbGkvcGFyc2VyJztcbmltcG9ydCB7IFVTRV9BTExfUExVR0lOUyB9IGZyb20gJy4vY2xpL2FyZ3MnO1xuaW1wb3J0IHsgbG9nZ2VyIGFzIGxvZ0ZhY3RvcnksIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQge1xuICBzaG93Q29uZmlnLCBjaGVja05vZGVPaywgdmFsaWRhdGVTZXJ2ZXJBcmdzLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucywgdmFsaWRhdGVUbXBEaXIsIGdldE5vbkRlZmF1bHRBcmdzLFxuICBnZXRHaXRSZXYsIEFQUElVTV9WRVJcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IERyaXZlckNvbmZpZyBmcm9tICcuL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuL3BsdWdpbi1jb25maWcnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7IHJ1bkV4dGVuc2lvbkNvbW1hbmQgfSBmcm9tICcuL2NsaS9leHRlbnNpb24nO1xuaW1wb3J0IHsgQXBwaXVtRHJpdmVyIH0gZnJvbSAnLi9hcHBpdW0nO1xuaW1wb3J0IHJlZ2lzdGVyTm9kZSBmcm9tICcuL2dyaWQtcmVnaXN0ZXInO1xuaW1wb3J0IHsgaW5zcGVjdE9iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHByZWZsaWdodENoZWNrcyAoe3BhcnNlciwgYXJncywgZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWcsIHRocm93SW5zdGVhZE9mRXhpdCA9IGZhbHNlfSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgaWYgKGFyZ3MubG9uZ1N0YWNrdHJhY2UpIHtcbiAgICAgIHJlcXVpcmUoJ2xvbmdqb2huJykuYXN5bmNfdHJhY2VfbGltaXQgPSAtMTtcbiAgICB9XG4gICAgaWYgKGFyZ3Muc2hvd0NvbmZpZykge1xuICAgICAgYXdhaXQgc2hvd0NvbmZpZygpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuICAgIHZhbGlkYXRlU2VydmVyQXJncyhwYXJzZXIsIGFyZ3MpO1xuICAgIGF3YWl0IGRyaXZlckNvbmZpZy5yZWFkKCk7XG4gICAgYXdhaXQgcGx1Z2luQ29uZmlnLnJlYWQoKTtcbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlVG1wRGlyKGFyZ3MudG1wRGlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZS5yZWQpO1xuICAgIGlmICh0aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nIChhcmdzKSB7XG4gIGxvZ2dlci5pbmZvKCdOb24tZGVmYXVsdCBzZXJ2ZXIgYXJnczonKTtcbiAgaW5zcGVjdE9iamVjdChhcmdzKTtcbn1cblxuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcgKGNhcHMpIHtcbiAgbG9nZ2VyLmluZm8oJ0RlZmF1bHQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGVhY2ggcmVxdWVzdCAnICtcbiAgICAgICAgICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOicpO1xuICBpbnNwZWN0T2JqZWN0KGNhcHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dTdGFydHVwSW5mbyAocGFyc2VyLCBhcmdzKSB7XG4gIGxldCB3ZWxjb21lID0gYFdlbGNvbWUgdG8gQXBwaXVtIHYke0FQUElVTV9WRVJ9YDtcbiAgbGV0IGFwcGl1bVJldiA9IGF3YWl0IGdldEdpdFJldigpO1xuICBpZiAoYXBwaXVtUmV2KSB7XG4gICAgd2VsY29tZSArPSBgIChSRVYgJHthcHBpdW1SZXZ9KWA7XG4gIH1cbiAgbG9nZ2VyLmluZm8od2VsY29tZSk7XG5cbiAgbGV0IHNob3dBcmdzID0gZ2V0Tm9uRGVmYXVsdEFyZ3MocGFyc2VyLCBhcmdzKTtcbiAgaWYgKF8uc2l6ZShzaG93QXJncykpIHtcbiAgICBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoc2hvd0FyZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICB9XG4gIC8vIFRPRE86IGJyaW5nIGJhY2sgbG9nbGV2ZWwgcmVwb3J0aW5nIGJlbG93IG9uY2UgbG9nZ2VyIGlzIGZsdXNoZWQgb3V0XG4gIC8vIGxvZ2dlci5pbmZvKCdDb25zb2xlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuY29uc29sZS5sZXZlbCk7XG4gIC8vIGlmIChsb2dnZXIudHJhbnNwb3J0cy5maWxlKSB7XG4gIC8vICAgbG9nZ2VyLmluZm8oJ0ZpbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5maWxlLmxldmVsKTtcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0IChhZGRyZXNzLCBwb3J0KSB7XG4gIGxldCBsb2dNZXNzYWdlID0gYEFwcGl1bSBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyIHN0YXJ0ZWQgb24gYCArXG4gICAgICAgICAgICAgICAgICAgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluIChhcmdzID0gbnVsbCkge1xuICBsZXQgcGFyc2VyID0gZ2V0UGFyc2VyKCk7XG4gIGxldCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZTtcbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBhIGNvbnRhaW5pbmcgcGFja2FnZSBwYXNzZWQgaW4gdGhlaXIgb3duIGFyZ3MsIGxldCdzIGZpbGwgdGhlbSBvdXRcbiAgICAvLyB3aXRoIGRlZmF1bHRzXG4gICAgYXJncyA9IE9iamVjdC5hc3NpZ24oe30sIGdldERlZmF1bHRTZXJ2ZXJBcmdzKCksIGFyZ3MpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbnRhaW5pbmcgcGFja2FnZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBDTEkgcHJvY2VzcyxcbiAgICAvLyB0aGF0IHBhY2thZ2UgbWlnaHQgbm90IGFwcHJlY2lhdGUgdXMgY2FsbGluZyAncHJvY2Vzcy5leGl0JyB3aWxseS1cbiAgICAvLyBuaWxseSwgc28gZ2l2ZSBpdCB0aGUgb3B0aW9uIHRvIGhhdmUgdXMgdGhyb3cgaW5zdGVhZCBvZiBleGl0XG4gICAgaWYgKGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvd0luc3RlYWRPZkV4aXQgPSB0cnVlO1xuICAgICAgLy8gYnV0IHJlbW92ZSBpdCBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgc2VydmVyIGFyZyBwZXIgc2VcbiAgICAgIGRlbGV0ZSBhcmdzLnRocm93SW5zdGVhZE9mRXhpdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZUFyZ3MoKTtcbiAgfVxuICBhd2FpdCBsb2dzaW5rSW5pdChhcmdzKTtcblxuICAvLyBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIHRoZSAnZHJpdmVyJyBDTEksIGRvbid0IHJ1biB0aGUgbm9ybWFsIHNlcnZlcixcbiAgLy8gYnV0IGluc3RlYWQgcGFzcyBjb250cm9sIHRvIHRoZSBkcml2ZXIgQ0xJXG4gIGlmIChhcmdzLnN1YmNvbW1hbmQgPT09IERSSVZFUl9UWVBFIHx8IGFyZ3Muc3ViY29tbWFuZCA9PT0gUExVR0lOX1RZUEUpIHtcbiAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKGFyZ3MsIGFyZ3Muc3ViY29tbWFuZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH1cblxuICBpZiAoYXJncy5sb2dGaWx0ZXJzKSB7XG4gICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKGFyZ3MubG9nRmlsdGVycyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoaXNzdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbG9nIGZpbHRlcmluZyBydWxlcyBjb25maWcgJyR7YXJncy5sb2dGaWx0ZXJzfScgaGFzIGlzc3VlczogYCArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGlzc3VlcywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJ1bGVzKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7YXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb2FkZWQgJHt1dGlsLnBsdXJhbGl6ZSgnZmlsdGVyaW5nIHJ1bGUnLCBydWxlcy5sZW5ndGgsIHRydWUpfSBmcm9tICcke2FyZ3MubG9nRmlsdGVyc30nYCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFwcGl1bURyaXZlciA9IG5ldyBBcHBpdW1Ecml2ZXIoYXJncyk7XG4gIGNvbnN0IGRyaXZlckNvbmZpZyA9IG5ldyBEcml2ZXJDb25maWcoYXJncy5hcHBpdW1Ib21lKTtcbiAgY29uc3QgcGx1Z2luQ29uZmlnID0gbmV3IFBsdWdpbkNvbmZpZyhhcmdzLmFwcGl1bUhvbWUpO1xuICBhcHBpdW1Ecml2ZXIuZHJpdmVyQ29uZmlnID0gZHJpdmVyQ29uZmlnO1xuICBhd2FpdCBwcmVmbGlnaHRDaGVja3Moe3BhcnNlciwgYXJncywgZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWcsIHRocm93SW5zdGVhZE9mRXhpdH0pO1xuICBhd2FpdCBsb2dTdGFydHVwSW5mbyhwYXJzZXIsIGFyZ3MpO1xuICBsZXQgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uID0gbWFrZVJvdXRlcihhcHBpdW1Ecml2ZXIpO1xuXG4gIC8vIGZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICAvLyB1c2luZyB0aGUgLS1wbHVnaW5zIGZsYWcsIGFuZCB0dXJuIGVhY2ggb25lIGludG8gYW4gaW5zdGFudGlhdGVkIHBsdWdpbiBvYmplY3QsIHNvIHdlIGNhbiBzZW5kXG4gIC8vIHRoZW0gYXMgb2JqZWN0cyB0byB0aGUgc2VydmVyIGluaXQuIHdlIGFsc28gd2FudCB0byBzZW5kL2Fzc2lnbiB0aGVtIHRvIHRoZSB1bWJyZWxsYSBkcml2ZXIgc29cbiAgLy8gaXQgY2FuIHVzZSB0aGVtIHRvIHdyYXAgY29tbWFuZCBleGVjdXRpb25cbiAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKHBsdWdpbkNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKS5maWx0ZXIoKHBsdWdpbk5hbWUpID0+XG4gICAgXy5pbmNsdWRlcyhhcmdzLnBsdWdpbnMsIHBsdWdpbk5hbWUpIHx8XG4gICAgKGFyZ3MucGx1Z2lucy5sZW5ndGggPT09IDEgJiYgYXJncy5wbHVnaW5zWzBdID09PSBVU0VfQUxMX1BMVUdJTlMpXG4gICkubWFwKChwbHVnaW5OYW1lKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFBsdWdpbkNsYXNzID0gcGx1Z2luQ29uZmlnLnJlcXVpcmUocGx1Z2luTmFtZSk7XG4gICAgICByZXR1cm4gbmV3IFBsdWdpbkNsYXNzKHBsdWdpbk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBDb3VsZCBub3QgbG9hZCBwbHVnaW4gJyR7cGx1Z2luTmFtZX0nLCBzbyBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEVycm9yIGAgK1xuICAgICAgICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vycn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgYXBwaXVtRHJpdmVyLnBsdWdpbnMgPSBwbHVnaW5zO1xuXG4gIGxldCBzZXJ2ZXIgPSBhd2FpdCBiYXNlU2VydmVyKHtcbiAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gICAgcG9ydDogYXJncy5wb3J0LFxuICAgIGhvc3RuYW1lOiBhcmdzLmFkZHJlc3MsXG4gICAgYWxsb3dDb3JzOiBhcmdzLmFsbG93Q29ycyxcbiAgICBiYXNlUGF0aDogYXJncy5iYXNlUGF0aCxcbiAgICBwbHVnaW5zLFxuICB9KTtcbiAgaWYgKGFyZ3MuYWxsb3dDb3JzKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIGVuYWJsZWQgQ09SUyByZXF1ZXN0cyBmcm9tIGFueSBob3N0LiBCZSBjYXJlZnVsIG5vdCAnICtcbiAgICAgICAgICAgICAgICAndG8gdmlzaXQgc2l0ZXMgd2hpY2ggY291bGQgbWFsaWNpb3VzbHkgdHJ5IHRvIHN0YXJ0IEFwcGl1bSAnICtcbiAgICAgICAgICAgICAgICAnc2Vzc2lvbnMgb24geW91ciBtYWNoaW5lJyk7XG4gIH1cbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBUT0RPIHByZWxhdW5jaCBpZiBhcmdzLmxhdW5jaCBpcyBzZXRcbiAgICAvLyBUT0RPOiBzdGFydEFsZXJ0U29ja2V0KHNlcnZlciwgYXBwaXVtU2VydmVyKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBhcyBub2RlIG9uIGdyaWQsIGlmIG5lY2Vzc2FyeVxuICAgIGlmIChhcmdzLm5vZGVjb25maWcgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyTm9kZShhcmdzLm5vZGVjb25maWcsIGFyZ3MuYWRkcmVzcywgYXJncy5wb3J0LCBhcmdzLmJhc2VQYXRoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nXSkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIGFzeW5jIGZ1bmN0aW9uIG9uU2lnbmFsICgpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWNlaXZlZCAke3NpZ25hbH0gLSBzaHV0dGluZyBkb3duYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBpdW1Ecml2ZXIuZGVsZXRlQWxsU2Vzc2lvbnMoe1xuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYFRoZSBwcm9jZXNzIGhhcyByZWNlaXZlZCAke3NpZ25hbH0gc2lnbmFsYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dTZXJ2ZXJQb3J0KGFyZ3MuYWRkcmVzcywgYXJncy5wb3J0KTtcbiAgZHJpdmVyQ29uZmlnLnByaW50KCk7XG4gIHBsdWdpbkNvbmZpZy5wcmludChwbHVnaW5zKTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbmV4cG9ydCB7IG1haW4gfTtcbiJdLCJmaWxlIjoibGliL21haW4uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
340
+ }
341
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvbHZlQXBwaXVtSG9tZSIsImVudiIsInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJjaGVja05vZGVPayIsImxvbmdTdGFja3RyYWNlIiwicmVxdWlyZSIsImFzeW5jX3RyYWNlX2xpbWl0Iiwic2hvd0J1aWxkSW5mbyIsInByb2Nlc3MiLCJleGl0Iiwid2Fybk5vZGVEZXByZWNhdGlvbnMiLCJ2YWxpZGF0ZSIsInRtcERpciIsInZhbGlkYXRlVG1wRGlyIiwiZXJyIiwibG9nZ2VyIiwiZXJyb3IiLCJtZXNzYWdlIiwicmVkIiwibG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nIiwiaW5mbyIsImluc3BlY3QiLCJsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyIsImNhcHMiLCJsb2dTdGFydHVwSW5mbyIsIndlbGNvbWUiLCJBUFBJVU1fVkVSIiwiYXBwaXVtUmV2IiwiZ2V0R2l0UmV2Iiwic2hvd0FyZ3MiLCJnZXROb25EZWZhdWx0U2VydmVyQXJncyIsIl8iLCJzaXplIiwiaXNFbXB0eSIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJsb2dTZXJ2ZXJQb3J0IiwiYWRkcmVzcyIsInBvcnQiLCJsb2dNZXNzYWdlIiwiZ2V0U2VydmVyVXBkYXRlcnMiLCJkcml2ZXJDbGFzc2VzIiwicGx1Z2luQ2xhc3NlcyIsImNvbXBhY3QiLCJtYXAiLCJrZXlzIiwiZ2V0RXh0cmFNZXRob2RNYXAiLCJyZWR1Y2UiLCJrbGFzcyIsIm5ld01ldGhvZE1hcCIsImFyZVNlcnZlckNvbW1hbmRBcmdzIiwic3ViY29tbWFuZCIsIlNFUlZFUl9TVUJDT01NQU5EIiwiaW5pdCIsImFwcGl1bUhvbWUiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJsb2FkRXh0ZW5zaW9ucyIsInBhcnNlciIsImdldFBhcnNlciIsInByZUNvbmZpZ0FyZ3MiLCJwYXJzZUFyZ3MiLCJjb25maWdSZXN1bHQiLCJyZWFkQ29uZmlnRmlsZSIsImNvbmZpZ0ZpbGUiLCJlcnJvcnMiLCJFcnJvciIsImZpbGVwYXRoIiwicmVhc29uIiwiRFJJVkVSX1RZUEUiLCJydW5FeHRlbnNpb25Db21tYW5kIiwiUExVR0lOX1RZUEUiLCJkZWZhdWx0cyIsImdldERlZmF1bHRzRm9yU2NoZW1hIiwic2VydmVyQXJncyIsImRlZmF1bHRzRGVlcCIsImNvbmZpZyIsInNlcnZlciIsInNob3dDb25maWciLCJsb2dzaW5rSW5pdCIsImxvZ0ZpbHRlcnMiLCJpc3N1ZXMiLCJydWxlcyIsImxvZ0ZhY3RvcnkiLCJsb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwiYXBwaXVtRHJpdmVyIiwiQXBwaXVtRHJpdmVyIiwicGFyc2VkQXJncyIsIm1haW4iLCJnZXRBY3RpdmVQbHVnaW5zIiwidXNlUGx1Z2lucyIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsIm1ha2VSb3V0ZXIiLCJnZXRBY3RpdmVEcml2ZXJzIiwidXNlRHJpdmVycyIsInNlcnZlclVwZGF0ZXJzIiwiZXh0cmFNZXRob2RNYXAiLCJzZXJ2ZXJPcHRzIiwiaG9zdG5hbWUiLCJhbGxvd0NvcnMiLCJiYXNlUGF0aCIsImtlZXBBbGl2ZVRpbWVvdXQiLCJiYXNlU2VydmVyIiwiZGVidWciLCJzdGFjayIsIm5vZGVjb25maWciLCJyZWdpc3Rlck5vZGUiLCJjbG9zZSIsInNpZ25hbCIsIm9uY2UiLCJvblNpZ25hbCIsImRlbGV0ZUFsbFNlc3Npb25zIiwiZm9yY2UiLCJlIiwicHJpbnQiLCJ2YWx1ZXMiLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHtpbml0IGFzIGxvZ3NpbmtJbml0fSBmcm9tICcuL2xvZ3NpbmsnOyAvLyB0aGlzIGltcG9ydCBuZWVkcyB0byBjb21lIGZpcnN0IHNpbmNlIGl0IHNldHMgdXAgZ2xvYmFsIG5wbWxvZ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7IC8vIGxvZ2dlciBuZWVkcyB0byByZW1haW4gc2Vjb25kXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyLCBzZXJ2ZXIgYXMgYmFzZVNlcnZlcn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge2xvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsLCBlbnZ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge2FzeW5jaWZ5fSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBcHBpdW1Ecml2ZXJ9IGZyb20gJy4vYXBwaXVtJztcbmltcG9ydCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7Z2V0UGFyc2VyfSBmcm9tICcuL2NsaS9wYXJzZXInO1xuaW1wb3J0IHtcbiAgQVBQSVVNX1ZFUixcbiAgY2hlY2tOb2RlT2ssXG4gIGdldEdpdFJldixcbiAgZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MsXG4gIHNob3dDb25maWcsXG4gIHNob3dCdWlsZEluZm8sXG4gIHZhbGlkYXRlVG1wRGlyLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucyxcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtyZWFkQ29uZmlnRmlsZX0gZnJvbSAnLi9jb25maWctZmlsZSc7XG5pbXBvcnQge2xvYWRFeHRlbnNpb25zLCBnZXRBY3RpdmVQbHVnaW5zLCBnZXRBY3RpdmVEcml2ZXJzfSBmcm9tICcuL2V4dGVuc2lvbic7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkR9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCByZWdpc3Rlck5vZGUgZnJvbSAnLi9ncmlkLXJlZ2lzdGVyJztcbmltcG9ydCB7Z2V0RGVmYXVsdHNGb3JTY2hlbWEsIHZhbGlkYXRlfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHtpbnNwZWN0fSBmcm9tICcuL3V0aWxzJztcblxuY29uc3Qge3Jlc29sdmVBcHBpdW1Ib21lfSA9IGVudjtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBhcmdzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd0luc3RlYWRPZkV4aXRdXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZWZsaWdodENoZWNrcyhhcmdzLCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgaWYgKGFyZ3MubG9uZ1N0YWNrdHJhY2UpIHtcbiAgICAgIHJlcXVpcmUoJ2xvbmdqb2huJykuYXN5bmNfdHJhY2VfbGltaXQgPSAtMTtcbiAgICB9XG4gICAgaWYgKGFyZ3Muc2hvd0J1aWxkSW5mbykge1xuICAgICAgYXdhaXQgc2hvd0J1aWxkSW5mbygpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuXG4gICAgdmFsaWRhdGUoYXJncyk7XG5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlVG1wRGlyKGFyZ3MudG1wRGlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZS5yZWQpO1xuICAgIGlmICh0aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0FyZ3N9IGFyZ3NcbiAqL1xuZnVuY3Rpb24gbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nKGFyZ3MpIHtcbiAgbG9nZ2VyLmluZm8oJ05vbi1kZWZhdWx0IHNlcnZlciBhcmdzOicpO1xuICBpbnNwZWN0KGFyZ3MpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJnc1snZGVmYXVsdENhcGFiaWxpdGllcyddfSBjYXBzXG4gKi9cbmZ1bmN0aW9uIGxvZ0RlZmF1bHRDYXBhYmlsaXRpZXNXYXJuaW5nKGNhcHMpIHtcbiAgbG9nZ2VyLmluZm8oXG4gICAgJ0RlZmF1bHQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGVhY2ggcmVxdWVzdCAnICtcbiAgICAgICd1bmxlc3Mgb3ZlcnJpZGRlbiBieSBkZXNpcmVkIGNhcGFiaWxpdGllczonXG4gICk7XG4gIGluc3BlY3QoY2Fwcyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBhcmdzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvZ1N0YXJ0dXBJbmZvKGFyZ3MpIHtcbiAgbGV0IHdlbGNvbWUgPSBgV2VsY29tZSB0byBBcHBpdW0gdiR7QVBQSVVNX1ZFUn1gO1xuICBsZXQgYXBwaXVtUmV2ID0gYXdhaXQgZ2V0R2l0UmV2KCk7XG4gIGlmIChhcHBpdW1SZXYpIHtcbiAgICB3ZWxjb21lICs9IGAgKFJFViAke2FwcGl1bVJldn0pYDtcbiAgfVxuICBsb2dnZXIuaW5mbyh3ZWxjb21lKTtcblxuICBsZXQgc2hvd0FyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgaWYgKF8uc2l6ZShzaG93QXJncykpIHtcbiAgICBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoc2hvd0FyZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICB9XG4gIC8vIFRPRE86IGJyaW5nIGJhY2sgbG9nbGV2ZWwgcmVwb3J0aW5nIGJlbG93IG9uY2UgbG9nZ2VyIGlzIGZsdXNoZWQgb3V0XG4gIC8vIGxvZ2dlci5pbmZvKCdDb25zb2xlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuY29uc29sZS5sZXZlbCk7XG4gIC8vIGlmIChsb2dnZXIudHJhbnNwb3J0cy5maWxlKSB7XG4gIC8vICAgbG9nZ2VyLmluZm8oJ0ZpbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5maWxlLmxldmVsKTtcbiAgLy8gfVxufVxuXG4vKipcbiAqIExvZ3MgdGhlIGFkZHJlc3MgYW5kIHBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQWRkcmVzc1xuICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBQb3J0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbG9nU2VydmVyUG9ydChhZGRyZXNzLCBwb3J0KSB7XG4gIGxldCBsb2dNZXNzYWdlID0gYEFwcGl1bSBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyIHN0YXJ0ZWQgb24gYCArIGAke2FkZHJlc3N9OiR7cG9ydH1gO1xuICBsb2dnZXIuaW5mbyhsb2dNZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGlzdCBvZiBgdXBkYXRlU2VydmVyYCBmdW5jdGlvbnMgZnJvbSBhbGwgZXh0ZW5zaW9uc1xuICogQHBhcmFtIHtEcml2ZXJOYW1lTWFwfSBkcml2ZXJDbGFzc2VzXG4gKiBAcGFyYW0ge1BsdWdpbk5hbWVNYXB9IHBsdWdpbkNsYXNzZXNcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5VcGRhdGVTZXJ2ZXJDYWxsYmFja1tdfVxuICovXG5mdW5jdGlvbiBnZXRTZXJ2ZXJVcGRhdGVycyhkcml2ZXJDbGFzc2VzLCBwbHVnaW5DbGFzc2VzKSB7XG4gIHJldHVybiBfLmNvbXBhY3QoXy5tYXAoWy4uLmRyaXZlckNsYXNzZXMua2V5cygpLCAuLi5wbHVnaW5DbGFzc2VzLmtleXMoKV0sICd1cGRhdGVTZXJ2ZXInKSk7XG59XG5cbi8qKlxuICogTWFrZXMgYSBiaWcgYE1ldGhvZE1hcGAgZnJvbSBhbGwgdGhlIGxpdHRsZSBgTWV0aG9kTWFwYHMgaW4gdGhlIGV4dGVuc2lvbnNcbiAqIEBwYXJhbSB7RHJpdmVyTmFtZU1hcH0gZHJpdmVyQ2xhc3Nlc1xuICogQHBhcmFtIHtQbHVnaW5OYW1lTWFwfSBwbHVnaW5DbGFzc2VzXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuTWV0aG9kTWFwfVxuICovXG5mdW5jdGlvbiBnZXRFeHRyYU1ldGhvZE1hcChkcml2ZXJDbGFzc2VzLCBwbHVnaW5DbGFzc2VzKSB7XG4gIHJldHVybiBbLi4uZHJpdmVyQ2xhc3Nlcy5rZXlzKCksIC4uLnBsdWdpbkNsYXNzZXMua2V5cygpXS5yZWR1Y2UoXG4gICAgKG1hcCwga2xhc3MpID0+ICh7XG4gICAgICAuLi5tYXAsXG4gICAgICAuLi4oa2xhc3MubmV3TWV0aG9kTWFwID8/IHt9KSxcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gYXJnc1xuICogQHJldHVybnMge2FyZ3MgaXMgQXJnczxXaXRoU2VydmVyU3ViY29tbWFuZD59XG4gKi9cbmZ1bmN0aW9uIGFyZVNlcnZlckNvbW1hbmRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc3ViY29tbWFuZCA9PT0gU0VSVkVSX1NVQkNPTU1BTkQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtLCBidXQgZG9lcyBub3Qgc3RhcnQgdGhlIHNlcnZlci5cbiAqXG4gKiBVc2UgdGhpcyB0byBnZXQgYXQgdGhlIGNvbmZpZ3VyYXRpb24gc2NoZW1hLlxuICpcbiAqIElmIGBhcmdzYCBjb250YWlucyBhIG5vbi1lbXB0eSBgc3ViY29tbWFuZGAgd2hpY2ggaXMgbm90IGBzZXJ2ZXJgLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAcGFyYW0ge0FyZ3M8VD59IFthcmdzXSAtIFBhcnRpYWwgYXJncyAocHJvZ2FtbWF0aWMgdXNhZ2Ugb25seSlcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckluaXRSZXN1bHQgfCBFeHRDb21tYW5kSW5pdFJlc3VsdD59XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtpbml0LCBnZXRTY2hlbWF9IGZyb20gJ2FwcGl1bSc7XG4gKiBjb25zdCBvcHRpb25zID0ge307IC8vIGNvbmZpZyBvYmplY3RcbiAqIGF3YWl0IGluaXQob3B0aW9ucyk7XG4gKiBjb25zdCBzY2hlbWEgPSBnZXRTY2hlbWEoKTsgLy8gZW50aXJlIGNvbmZpZyBzY2hlbWEgaW5jbHVkaW5nIHBsdWdpbnMgYW5kIGRyaXZlcnNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdChhcmdzKSB7XG4gIGNvbnN0IGFwcGl1bUhvbWUgPSBhcmdzPy5hcHBpdW1Ib21lID8/IChhd2FpdCByZXNvbHZlQXBwaXVtSG9tZSgpKTtcblxuICBjb25zdCB7ZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWd9ID0gYXdhaXQgbG9hZEV4dGVuc2lvbnMoYXBwaXVtSG9tZSk7XG5cbiAgY29uc3QgcGFyc2VyID0gZ2V0UGFyc2VyKCk7XG4gIGxldCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZTtcbiAgLyoqIEB0eXBlIHtBcmdzPFQ+fSAqL1xuICBsZXQgcHJlQ29uZmlnQXJncztcblxuICBpZiAoYXJncykge1xuICAgIC8vIGlmIHdlIGhhdmUgYSBjb250YWluaW5nIHBhY2thZ2UgaW5zdGVhZCBvZiBydW5uaW5nIGFzIGEgQ0xJIHByb2Nlc3MsXG4gICAgLy8gdGhhdCBwYWNrYWdlIG1pZ2h0IG5vdCBhcHByZWNpYXRlIHVzIGNhbGxpbmcgJ3Byb2Nlc3MuZXhpdCcgd2lsbHktXG4gICAgLy8gbmlsbHksIHNvIGdpdmUgaXQgdGhlIG9wdGlvbiB0byBoYXZlIHVzIHRocm93IGluc3RlYWQgb2YgZXhpdFxuICAgIGlmIChhcmdzLnRocm93SW5zdGVhZE9mRXhpdCkge1xuICAgICAgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gdHJ1ZTtcbiAgICAgIC8vIGJ1dCByZW1vdmUgaXQgc2luY2UgaXQncyBub3QgYSByZWFsIHNlcnZlciBhcmcgcGVyIHNlXG4gICAgICBkZWxldGUgYXJncy50aHJvd0luc3RlYWRPZkV4aXQ7XG4gICAgfVxuICAgIHByZUNvbmZpZ0FyZ3MgPSB7Li4uYXJncywgc3ViY29tbWFuZDogYXJncy5zdWJjb21tYW5kID8/IFNFUlZFUl9TVUJDT01NQU5EfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBvdGhlcndpc2UgcGFyc2UgZnJvbSBDTElcbiAgICBwcmVDb25maWdBcmdzID0gLyoqIEB0eXBlIHtBcmdzPFQ+fSAqLyAocGFyc2VyLnBhcnNlQXJncygpKTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ1Jlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKHByZUNvbmZpZ0FyZ3MuY29uZmlnRmlsZSk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoY29uZmlnUmVzdWx0LmVycm9ycykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3JzIGluIGNvbmZpZyBmaWxlICR7Y29uZmlnUmVzdWx0LmZpbGVwYXRofTpcXG4gJHtcbiAgICAgICAgY29uZmlnUmVzdWx0LnJlYXNvbiA/PyBjb25maWdSZXN1bHQuZXJyb3JzXG4gICAgICB9YFxuICAgICk7XG4gIH1cblxuICAvLyBtZXJnZSBjb25maWcgYW5kIGFwcGx5IGRlZmF1bHRzLlxuICAvLyB0aGUgb3JkZXIgb2YgcHJlY2VuZGVjZSBpczpcbiAgLy8gMS4gY29tbWFuZCBsaW5lIGFyZ3NcbiAgLy8gMi4gY29uZmlnIGZpbGVcbiAgLy8gMy4gZGVmYXVsdHMgZnJvbSBjb25maWcgZmlsZS5cbiAgaWYgKCFhcmVTZXJ2ZXJDb21tYW5kQXJncyhwcmVDb25maWdBcmdzKSkge1xuICAgIC8vIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdGhlICdkcml2ZXInIENMSSwgZG9uJ3QgcnVuIHRoZSBub3JtYWwgc2VydmVyLFxuICAgIC8vIGJ1dCBpbnN0ZWFkIHBhc3MgY29udHJvbCB0byB0aGUgZHJpdmVyIENMSVxuICAgIGlmIChwcmVDb25maWdBcmdzLnN1YmNvbW1hbmQgPT09IERSSVZFUl9UWVBFKSB7XG4gICAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKHByZUNvbmZpZ0FyZ3MsIGRyaXZlckNvbmZpZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChwcmVDb25maWdBcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKHByZUNvbmZpZ0FyZ3MsIHBsdWdpbkNvbmZpZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHt9OyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvclNjaGVtYShmYWxzZSk7XG5cbiAgICAvKiogQHR5cGUge1BhcnNlZEFyZ3N9ICovXG4gICAgY29uc3Qgc2VydmVyQXJncyA9IF8uZGVmYXVsdHNEZWVwKHByZUNvbmZpZ0FyZ3MsIGNvbmZpZ1Jlc3VsdC5jb25maWc/LnNlcnZlciwgZGVmYXVsdHMpO1xuXG4gICAgaWYgKHByZUNvbmZpZ0FyZ3Muc2hvd0NvbmZpZykge1xuICAgICAgc2hvd0NvbmZpZyhnZXROb25EZWZhdWx0U2VydmVyQXJncyhwcmVDb25maWdBcmdzKSwgY29uZmlnUmVzdWx0LCBkZWZhdWx0cywgc2VydmVyQXJncyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgYXdhaXQgbG9nc2lua0luaXQoc2VydmVyQXJncyk7XG5cbiAgICBpZiAoc2VydmVyQXJncy5sb2dGaWx0ZXJzKSB7XG4gICAgICBjb25zdCB7aXNzdWVzLCBydWxlc30gPSBhd2FpdCBsb2dGYWN0b3J5LmxvYWRTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzaW5nUnVsZXMoXG4gICAgICAgIHNlcnZlckFyZ3MubG9nRmlsdGVyc1xuICAgICAgKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGlzc3VlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgbG9nIGZpbHRlcmluZyBydWxlcyBjb25maWcgJyR7c2VydmVyQXJncy5sb2dGaWx0ZXJzfScgaGFzIGlzc3VlczogYCArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpc3N1ZXMsIG51bGwsIDIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0VtcHR5KHJ1bGVzKSkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgRm91bmQgbm8gbG9nIGZpbHRlcmluZyBydWxlcyBpbiAnJHtzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnN9Jy4gSXMgdGhhdCBleHBlY3RlZD9gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgTG9hZGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZpbHRlcmluZyBydWxlJywgcnVsZXMubGVuZ3RoLCB0cnVlKX0gZnJvbSAnJHtcbiAgICAgICAgICAgIHNlcnZlckFyZ3MubG9nRmlsdGVyc1xuICAgICAgICAgIH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFwcGl1bURyaXZlciA9IG5ldyBBcHBpdW1Ecml2ZXIoc2VydmVyQXJncyk7XG4gICAgLy8gc2V0IHRoZSBjb25maWcgb24gdGhlIHVtYnJlbGxhIGRyaXZlciBzbyBpdCBjYW4gbWF0Y2ggZHJpdmVycyB0byBjYXBzXG4gICAgYXBwaXVtRHJpdmVyLmRyaXZlckNvbmZpZyA9IGRyaXZlckNvbmZpZztcbiAgICBhd2FpdCBwcmVmbGlnaHRDaGVja3Moc2VydmVyQXJncywgdGhyb3dJbnN0ZWFkT2ZFeGl0KTtcblxuICAgIHJldHVybiAvKiogQHR5cGUge1NlcnZlckluaXRSZXN1bHR9ICovICh7XG4gICAgICBhcHBpdW1Ecml2ZXIsXG4gICAgICBwYXJzZWRBcmdzOiBzZXJ2ZXJBcmdzLFxuICAgICAgZHJpdmVyQ29uZmlnLFxuICAgICAgcGx1Z2luQ29uZmlnLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtJ3MgY29uZmlnLiAgU3RhcnRzIHNlcnZlciBpZiBhcHByb3ByaWF0ZSBhbmQgcmVzb2x2ZXMgdGhlXG4gKiBzZXJ2ZXIgaW5zdGFuY2UgaWYgc287IG90aGVyd2lzZSByZXNvbHZlcyB3LyBgdW5kZWZpbmVkYC5cbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gQXJndW1lbnRzIGZyb20gQ0xJIG9yIG90aGVyd2lzZVxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfHVuZGVmaW5lZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJncykge1xuICBjb25zdCB7YXBwaXVtRHJpdmVyLCBwYXJzZWRBcmdzLCBwbHVnaW5Db25maWcsIGRyaXZlckNvbmZpZ30gPSAvKiogQHR5cGUge1NlcnZlckluaXRSZXN1bHR9ICovIChcbiAgICBhd2FpdCBpbml0KGFyZ3MpXG4gICk7XG5cbiAgaWYgKCFhcHBpdW1Ecml2ZXIgfHwgIXBhcnNlZEFyZ3MgfHwgIXBsdWdpbkNvbmZpZyB8fCAhZHJpdmVyQ29uZmlnKSB7XG4gICAgLy8gaWYgdGhpcyBicmFuY2ggaXMgdGFrZW4sIHdlJ3ZlIHJ1biBhIGRpZmZlcmVudCBzdWJjb21tYW5kLCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAvLyBsZWZ0IHRvIGRvIGhlcmUuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luQ2xhc3NlcyA9IGdldEFjdGl2ZVBsdWdpbnMocGx1Z2luQ29uZmlnLCBwYXJzZWRBcmdzLnVzZVBsdWdpbnMpO1xuICAvLyBzZXQgdGhlIGFjdGl2ZSBwbHVnaW5zIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtIGZvciBjb21tYW5kc1xuICBhcHBpdW1Ecml2ZXIucGx1Z2luQ2xhc3NlcyA9IHBsdWdpbkNsYXNzZXM7XG5cbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VkQXJncyk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGFwcGl1bURyaXZlcik7XG5cbiAgY29uc3QgZHJpdmVyQ2xhc3NlcyA9IGdldEFjdGl2ZURyaXZlcnMoZHJpdmVyQ29uZmlnLCBwYXJzZWRBcmdzLnVzZURyaXZlcnMpO1xuICBjb25zdCBzZXJ2ZXJVcGRhdGVycyA9IGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuICBjb25zdCBleHRyYU1ldGhvZE1hcCA9IGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICAgIHBvcnQ6IHBhcnNlZEFyZ3MucG9ydCxcbiAgICBob3N0bmFtZTogcGFyc2VkQXJncy5hZGRyZXNzLFxuICAgIGFsbG93Q29yczogcGFyc2VkQXJncy5hbGxvd0NvcnMsXG4gICAgYmFzZVBhdGg6IHBhcnNlZEFyZ3MuYmFzZVBhdGgsXG4gICAgc2VydmVyVXBkYXRlcnMsXG4gICAgZXh0cmFNZXRob2RNYXAsXG4gIH07XG4gIGlmIChwYXJzZWRBcmdzLmtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICBzZXJ2ZXJPcHRzLmtlZXBBbGl2ZVRpbWVvdXQgPSBwYXJzZWRBcmdzLmtlZXBBbGl2ZVRpbWVvdXQgKiAxMDAwO1xuICB9XG4gIGxldCBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgc2VydmVyID0gYXdhaXQgYmFzZVNlcnZlcihzZXJ2ZXJPcHRzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYENvdWxkIG5vdCBjb25maWd1cmUgQXBwaXVtIHNlcnZlci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgZHJpdmVyIG9yIHBsdWdpbiB0cmllZCBgICtcbiAgICAgICAgYHRvIHVwZGF0ZSB0aGUgc2VydmVyIGFuZCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWBcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhlcnIuc3RhY2spO1xuICAgIHJldHVybiBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocGFyc2VkQXJncy5hbGxvd0NvcnMpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdZb3UgaGF2ZSBlbmFibGVkIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgaG9zdC4gQmUgY2FyZWZ1bCBub3QgJyArXG4gICAgICAgICd0byB2aXNpdCBzaXRlcyB3aGljaCBjb3VsZCBtYWxpY2lvdXNseSB0cnkgdG8gc3RhcnQgQXBwaXVtICcgK1xuICAgICAgICAnc2Vzc2lvbnMgb24geW91ciBtYWNoaW5lJ1xuICAgICk7XG4gIH1cbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBjb25maWd1cmUgYXMgbm9kZSBvbiBncmlkLCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmYWxzeSB2YWx1ZXMgc2hvdWxkIG5vdCBjYXVzZSB0aGlzIHRvIHJ1blxuICAgIGlmIChwYXJzZWRBcmdzLm5vZGVjb25maWcpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyTm9kZShcbiAgICAgICAgcGFyc2VkQXJncy5ub2RlY29uZmlnLFxuICAgICAgICBwYXJzZWRBcmdzLmFkZHJlc3MsXG4gICAgICAgIHBhcnNlZEFyZ3MucG9ydCxcbiAgICAgICAgcGFyc2VkQXJncy5iYXNlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nXSkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIGFzeW5jIGZ1bmN0aW9uIG9uU2lnbmFsKCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFJlY2VpdmVkICR7c2lnbmFsfSAtIHNodXR0aW5nIGRvd25gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcGl1bURyaXZlci5kZWxldGVBbGxTZXNzaW9ucyh7XG4gICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBgVGhlIHByb2Nlc3MgaGFzIHJlY2VpdmVkICR7c2lnbmFsfSBzaWduYWxgLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oZSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvZ1NlcnZlclBvcnQocGFyc2VkQXJncy5hZGRyZXNzLCBwYXJzZWRBcmdzLnBvcnQpO1xuICBkcml2ZXJDb25maWcucHJpbnQoKTtcbiAgcGx1Z2luQ29uZmlnLnByaW50KFsuLi5wbHVnaW5DbGFzc2VzLnZhbHVlcygpXSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cblxuLy8gTk9URTogdGhpcyBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0IGZvciBhbnkgc2NyaXB0cyByZWZlcmVuY2luZyBgbWFpbi5qc2AgZGlyZWN0bHlcbi8vIChtb3JlIHNwZWNpZmljYWxseSwgYGJ1aWxkL2xpYi9tYWluLmpzYClcbi8vIHRoZSBleGVjdXRhYmxlIGlzIG5vdyBgLi4vaW5kZXguanNgLCBzbyB0aGF0IG1vZHVsZSB3aWxsIHR5cGljYWxseSBiZSBgcmVxdWlyZS5tYWluYC5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShtYWluKTtcbn1cblxuLy8gZXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIEFQSS5cbmV4cG9ydCB7cmVhZENvbmZpZ0ZpbGV9IGZyb20gJy4vY29uZmlnLWZpbGUnO1xuZXhwb3J0IHtmaW5hbGl6ZVNjaGVtYSwgZ2V0U2NoZW1hLCB2YWxpZGF0ZX0gZnJvbSAnLi9zY2hlbWEvc2NoZW1hJztcbmV4cG9ydCB7bWFpbiwgaW5pdCwgcmVzb2x2ZUFwcGl1bUhvbWV9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzfSBEcml2ZXJDbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuV2l0aFNlcnZlclN1YmNvbW1hbmR9IFdpdGhTZXJ2ZXJTdWJjb21tYW5kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbicpLkRyaXZlck5hbWVNYXB9IERyaXZlck5hbWVNYXBcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0ZW5zaW9uJykuUGx1Z2luTmFtZU1hcH0gUGx1Z2luTmFtZU1hcFxuICovXG5cbi8qKlxuICogTGl0ZXJhbGx5IGFuIGVtcHR5IG9iamVjdFxuICogQHR5cGVkZWYgeyB7fSB9IEV4dENvbW1hbmRJbml0UmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZXJ2ZXJJbml0RGF0YVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4vYXBwaXVtJykuQXBwaXVtRHJpdmVyfSBhcHBpdW1Ecml2ZXIgLSBUaGUgQXBwaXVtIGRyaXZlclxuICogQHByb3BlcnR5IHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLlBhcnNlZEFyZ3N9IHBhcnNlZEFyZ3MgLSBUaGUgcGFyc2VkIGFyZ3VtZW50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1NlcnZlckluaXREYXRhICYgaW1wb3J0KCcuL2V4dGVuc2lvbicpLkV4dGVuc2lvbkNvbmZpZ3N9IFNlcnZlckluaXRSZXN1bHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8VD59IEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLlBhcnNlZEFyZ3M8VD59IFBhcnNlZEFyZ3NcbiAqL1xuIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNO0VBQUNBO0FBQUQsSUFBc0JDLFlBQTVCOzs7QUFPQSxlQUFlQyxlQUFmLENBQStCQyxJQUEvQixFQUFxQ0Msa0JBQWtCLEdBQUcsS0FBMUQsRUFBaUU7RUFDL0QsSUFBSTtJQUNGLElBQUFDLG1CQUFBOztJQUNBLElBQUlGLElBQUksQ0FBQ0csY0FBVCxFQUF5QjtNQUN2QkMsT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQkMsaUJBQXBCLEdBQXdDLENBQUMsQ0FBekM7SUFDRDs7SUFDRCxJQUFJTCxJQUFJLENBQUNNLGFBQVQsRUFBd0I7TUFDdEIsTUFBTSxJQUFBQSxxQkFBQSxHQUFOO01BQ0FDLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLENBQWI7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
@@ -0,0 +1,143 @@
1
+ /**
2
+ * The original ID of the Appium config schema.
3
+ * We use this in the CLI to convert it to `argparse` options.
4
+ */
5
+ export const APPIUM_CONFIG_SCHEMA_ID: "appium.json";
6
+ /**
7
+ * The schema prop containing server-related options. Everything in here
8
+ * is "native" to Appium.
9
+ * Used by {@link flattenSchema} for transforming the schema into CLI args.
10
+ */
11
+ export const SERVER_PROP_NAME: "server";
12
+ /**
13
+ * An `ArgSpec` is a class representing metadata about an argument (or config
14
+ * option) used for cross-referencing.
15
+ *
16
+ * This class has no instance methods, and is basically just a read-only "struct".
17
+ * @template D
18
+ */
19
+ export class ArgSpec<D> {
20
+ /**
21
+ * Return the schema ID (`$id`) for the **argument** given the parameters.
22
+ *
23
+ * If you need the "root" or "base" schema ID, use {@link ArgSpec.toSchemaBaseRef} instead.
24
+ * @param {string} name - Argument name
25
+ * @param {ExtensionType} [extType] - Extension type
26
+ * @param {string} [extName] - Extension name
27
+ * @returns {string} Schema ID
28
+ */
29
+ static toSchemaRef(name: string, extType?: import("../../../types/build").ExtensionType | undefined, extName?: string | undefined): string;
30
+ /**
31
+ * Return the schema ID for an extension or the base schema ID.
32
+ * @param {ExtensionType} [extType] - Extension type
33
+ * @param {string} [extName] - Extension name
34
+ */
35
+ static toSchemaBaseRef(extType?: import("../../../types/build").ExtensionType | undefined, extName?: string | undefined): string;
36
+ /**
37
+ * Return the unique ID for the argument given the parameters.
38
+ * @param {string} name - Argument name
39
+ * @param {ExtensionType} [extType] - Extension type
40
+ * @param {string} [extName] - Extension name
41
+ * @returns {string} Unique ID
42
+ */
43
+ static toArg(name: string, extType?: import("../../../types/build").ExtensionType | undefined, extName?: string | undefined): string;
44
+ /**
45
+ * Normalizes a raw extension name (not including the type).
46
+ * @param {string} extName - Extension name
47
+ * @returns {string} Normalized extension name
48
+ */
49
+ static toNormalizedExtName(extName: string): string;
50
+ /**
51
+ * When given the root ID of a schema for an extension (`<extType>-<normalizedExtName>.json`) Returns an object containing the extension type and the _normalized_ extension name.
52
+ * @param {string} schemaId - Root schema ID
53
+ * @returns { {extType?: ExtensionType, normalizedExtName?: string} }
54
+ */
55
+ static extensionInfoFromRootSchemaId(schemaId: string): {
56
+ extType?: ExtensionType;
57
+ normalizedExtName?: string;
58
+ };
59
+ /**
60
+ * Creates an `ArgSpec`
61
+ *
62
+ * @param {string} name - The canonical name of the argument. Corresponds to a key in a schema's
63
+ * `properties` property.
64
+ * @template D
65
+ * @param {ArgSpecOptions<D>} [opts] - Options
66
+ * @returns {Readonly<ArgSpec>}
67
+ */
68
+ static create<D_1>(name: string, opts?: ArgSpecOptions<D_1> | undefined): Readonly<ArgSpec<any>>;
69
+ /**
70
+ * Builds some computed fields and assigns them to the instance.
71
+ *
72
+ * Undefined properties are not assigned.
73
+ *
74
+ * The _constructor_ is private. Use {@link ArgSpec.create} instead.
75
+ * @private
76
+ * @param {string} name
77
+ * @param {ArgSpecOptions<D>} [opts]
78
+ */
79
+ private constructor();
80
+ /**
81
+ * The canonical name of the argument. Corresponds to key in schema's `properties` prop.
82
+ * @type {string}
83
+ */
84
+ name: string;
85
+ /**
86
+ * The `ExtensionType` of the argument. This will be set if the arg came from an extension;
87
+ * otherwise it will be `undefined`.
88
+ * @type {ExtensionType|undefined}
89
+ */
90
+ extType: ExtensionType | undefined;
91
+ /**
92
+ * The name of the extension, if this argument came from an extension.
93
+ *
94
+ * Otherwise `undefined`.
95
+ * @type {string|undefined}
96
+ */
97
+ extName: string | undefined;
98
+ /**
99
+ * The schema ID (`$id`) for the argument. This is automatically determined, and any user-provided `$id`s will be overwritten.
100
+ *
101
+ * @type {string}
102
+ */
103
+ ref: string;
104
+ /**
105
+ * The CLI argument, sans leading dashes.
106
+ * @type {string}
107
+ */
108
+ arg: string;
109
+ /**
110
+ * The desired keypath for the argument after arguments have been parsed.
111
+ *
112
+ * Typically this is camelCased. If the arg came from an extension, it will be prefixed with
113
+ * `<extType>.<extName>.`
114
+ * @type {string}
115
+ */
116
+ dest: string;
117
+ /**
118
+ * The same as {@link ArgSpec.dest} but without the leading `<extType>.<extName>.` prefix.
119
+ */
120
+ rawDest: string;
121
+ /**
122
+ * Whatever the default value of this argument is, as specified by the
123
+ * `default` property of the schema.
124
+ * @type {D|undefined}
125
+ */
126
+ defaultValue: D | undefined;
127
+ /**
128
+ * String representation, useful for debugging
129
+ * @returns {string}
130
+ */
131
+ toString(): string;
132
+ }
133
+ /**
134
+ * Options for {@link ArgSpec.create }
135
+ */
136
+ export type ArgSpecOptions<D> = {
137
+ extName?: string | undefined;
138
+ extType?: import("../../../types/build").ExtensionType | undefined;
139
+ dest?: string | undefined;
140
+ defaultValue?: D | undefined;
141
+ };
142
+ export type ExtensionType = import('../extension/manifest').ExtensionType;
143
+ //# sourceMappingURL=arg-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arg-spec.d.ts","sourceRoot":"","sources":["../../../lib/schema/arg-spec.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,oDAAqD;AAErD;;;;GAIG;AACH,wCAAyC;AAYzC;;;;;;GAMG;AACH;IAyFE;;;;;;;;OAQG;IACH,yBALW,MAAM,qGAGJ,MAAM,CAQlB;IAED;;;;OAIG;IACH,iIAKC;IAED;;;;;;OAMG;IACH,mBALW,MAAM,qGAGJ,MAAM,CAQlB;IAED;;;;OAIG;IACH,oCAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;OAIG;IACH,+CAHW,MAAM,GACH;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,yBANW,MAAM,2CAIJ,sBAAiB,CAI7B;IAhHD;;;;;;;;;OASG;IACH,sBAqBC;IAtFD;;;OAGG;IACH,MAFU,MAAM,CAEX;IAEL;;;;OAIG;IACH,SAFU,aAAa,GAAC,SAAS,CAEzB;IAER;;;;;OAKG;IACH,SAFU,MAAM,GAAC,SAAS,CAElB;IAER;;;;OAIG;IACH,KAFU,MAAM,CAEZ;IAEJ;;;OAGG;IACH,KAFU,MAAM,CAEZ;IAEJ;;;;;;OAMG;IACH,MAFU,MAAM,CAEX;IAEL;;OAEG;IACH,gBAAQ;IAER;;;;OAIG;IACH,cAFU,CAAC,GAAC,SAAS,CAER;IAoHb;;;OAGG;IAEH,YAHa,MAAM,CASlB;CACF;;;;;;;;;;4BAaY,OAAO,uBAAuB,EAAE,aAAa"}