appium 2.0.0-beta.2 → 2.0.0-beta.20

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 (70) hide show
  1. package/README.md +9 -9
  2. package/build/lib/appium-config.schema.json +0 -0
  3. package/build/lib/appium.js +157 -53
  4. package/build/lib/cli/argparse-actions.js +104 -0
  5. package/build/lib/cli/args.js +115 -279
  6. package/build/lib/cli/driver-command.js +11 -1
  7. package/build/lib/cli/extension-command.js +60 -8
  8. package/build/lib/cli/extension.js +30 -7
  9. package/build/lib/cli/npm.js +17 -14
  10. package/build/lib/cli/parser.js +152 -89
  11. package/build/lib/cli/plugin-command.js +11 -1
  12. package/build/lib/cli/utils.js +29 -3
  13. package/build/lib/config-file.js +141 -0
  14. package/build/lib/config.js +76 -61
  15. package/build/lib/driver-config.js +42 -19
  16. package/build/lib/drivers.js +8 -4
  17. package/build/lib/ext-config-io.js +165 -0
  18. package/build/lib/extension-config.js +130 -61
  19. package/build/lib/grid-register.js +22 -24
  20. package/build/lib/logger.js +3 -3
  21. package/build/lib/logsink.js +11 -13
  22. package/build/lib/main.js +197 -77
  23. package/build/lib/plugin-config.js +20 -10
  24. package/build/lib/plugins.js +4 -2
  25. package/build/lib/schema/appium-config-schema.js +252 -0
  26. package/build/lib/schema/arg-spec.js +120 -0
  27. package/build/lib/schema/cli-args.js +173 -0
  28. package/build/lib/schema/cli-transformers.js +76 -0
  29. package/build/lib/schema/index.js +36 -0
  30. package/build/lib/schema/keywords.js +62 -0
  31. package/build/lib/schema/schema.js +357 -0
  32. package/build/lib/utils.js +44 -99
  33. package/lib/appium-config.schema.json +277 -0
  34. package/lib/appium.js +201 -65
  35. package/lib/cli/argparse-actions.js +77 -0
  36. package/lib/cli/args.js +174 -375
  37. package/lib/cli/driver-command.js +4 -0
  38. package/lib/cli/extension-command.js +70 -5
  39. package/lib/cli/extension.js +25 -5
  40. package/lib/cli/npm.js +18 -12
  41. package/lib/cli/parser.js +254 -79
  42. package/lib/cli/plugin-command.js +4 -0
  43. package/lib/cli/utils.js +21 -1
  44. package/lib/config-file.js +227 -0
  45. package/lib/config.js +109 -62
  46. package/lib/driver-config.js +66 -11
  47. package/lib/drivers.js +4 -1
  48. package/lib/ext-config-io.js +287 -0
  49. package/lib/extension-config.js +225 -67
  50. package/lib/grid-register.js +27 -24
  51. package/lib/logger.js +1 -1
  52. package/lib/logsink.js +10 -7
  53. package/lib/main.js +211 -77
  54. package/lib/plugin-config.js +34 -5
  55. package/lib/plugins.js +1 -0
  56. package/lib/schema/appium-config-schema.js +286 -0
  57. package/lib/schema/arg-spec.js +218 -0
  58. package/lib/schema/cli-args.js +273 -0
  59. package/lib/schema/cli-transformers.js +123 -0
  60. package/lib/schema/index.js +2 -0
  61. package/lib/schema/keywords.js +119 -0
  62. package/lib/schema/schema.js +577 -0
  63. package/lib/utils.js +42 -88
  64. package/package.json +55 -80
  65. package/postinstall.js +71 -0
  66. package/types/appium-config.d.ts +197 -0
  67. package/types/types.d.ts +201 -0
  68. package/CHANGELOG.md +0 -3515
  69. package/build/lib/cli/parser-helpers.js +0 -82
  70. package/lib/cli/parser-helpers.js +0 -79
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ const schema = {
11
+ $schema: 'http://json-schema.org/draft-07/schema',
12
+ additionalProperties: false,
13
+ description: 'A schema for Appium configuration files',
14
+ properties: {
15
+ server: {
16
+ additionalProperties: false,
17
+ description: 'Configuration when running Appium as a server',
18
+ properties: {
19
+ address: {
20
+ $comment: 'I think hostname covers both DNS and IPv4...could be wrong',
21
+ appiumCliAliases: ['a'],
22
+ default: '0.0.0.0',
23
+ description: 'IP address to listen on',
24
+ format: 'hostname',
25
+ title: 'address config',
26
+ type: 'string'
27
+ },
28
+ 'allow-cors': {
29
+ description: 'Whether the Appium server should allow web browser connections from any host',
30
+ title: 'allow-cors config',
31
+ type: 'boolean',
32
+ default: false
33
+ },
34
+ 'allow-insecure': {
35
+ appiumCliTransformer: 'csv',
36
+ default: [],
37
+ description: 'Set which insecure features are allowed to run in this server\'s sessions. Features are defined on a driver level; see documentation for more details. Note that features defined via "deny-insecure" will be disabled, even if also listed here. If string, a path to a text file containing policy or a comma-delimited list.',
38
+ items: {
39
+ type: 'string'
40
+ },
41
+ title: 'allow-insecure config',
42
+ type: 'array',
43
+ uniqueItems: true
44
+ },
45
+ 'base-path': {
46
+ appiumCliAliases: ['pa'],
47
+ default: '',
48
+ description: 'Base path to use as the prefix for all webdriver routes running on the server',
49
+ title: 'base-path config',
50
+ type: 'string'
51
+ },
52
+ 'callback-address': {
53
+ appiumCliAliases: ['ca'],
54
+ description: 'Callback IP address (default: same as "address")',
55
+ title: 'callback-address config',
56
+ type: 'string'
57
+ },
58
+ 'callback-port': {
59
+ appiumCliAliases: ['cp'],
60
+ default: 4723,
61
+ description: 'Callback port (default: same as "port")',
62
+ maximum: 65535,
63
+ minimum: 1,
64
+ title: 'callback-port config',
65
+ type: 'integer'
66
+ },
67
+ 'debug-log-spacing': {
68
+ default: false,
69
+ description: 'Add exaggerated spacing in logs to help with visual inspection',
70
+ title: 'debug-log-spacing config',
71
+ type: 'boolean'
72
+ },
73
+ 'default-capabilities': {
74
+ $comment: 'TODO',
75
+ appiumCliAliases: ['dc'],
76
+ description: 'Set the default desired capabilities, which will be set on each session unless overridden by received capabilities. If a string, a path to a JSON file containing the capabilities, or raw JSON.',
77
+ title: 'default-capabilities config',
78
+ type: 'object'
79
+ },
80
+ 'deny-insecure': {
81
+ $comment: 'Allowed values are defined by drivers',
82
+ appiumCliTransformer: 'csv',
83
+ default: [],
84
+ description: 'Set which insecure features are not allowed to run in this server\'s sessions. Features are defined on a driver level; see documentation for more details. Features listed here will not be enabled even if also listed in "allow-insecure", and even if "relaxed-security" is enabled. If string, a path to a text file containing policy or a comma-delimited list.',
85
+ items: {
86
+ type: 'string'
87
+ },
88
+ title: 'deny-insecure config',
89
+ type: 'array',
90
+ uniqueItems: true
91
+ },
92
+ driver: {
93
+ description: 'Driver-specific configuration. Keys should correspond to driver package names',
94
+ properties: {},
95
+ title: 'driver config',
96
+ type: 'object'
97
+ },
98
+ 'keep-alive-timeout': {
99
+ appiumCliAliases: ['ka'],
100
+ default: 600,
101
+ description: 'Number of seconds the Appium server should apply as both the keep-alive timeout and the connection timeout for all requests. A value of 0 disables the timeout.',
102
+ minimum: 0,
103
+ title: 'keep-alive-timeout config',
104
+ type: 'integer'
105
+ },
106
+ 'local-timezone': {
107
+ default: false,
108
+ description: 'Use local timezone for timestamps',
109
+ title: 'local-timezone config',
110
+ type: 'boolean'
111
+ },
112
+ log: {
113
+ appiumCliAliases: ['g'],
114
+ appiumCliDest: 'logFile',
115
+ description: 'Also send log output to this file',
116
+ title: 'log config',
117
+ type: 'string'
118
+ },
119
+ 'log-filters': {
120
+ $comment: 'TODO',
121
+ description: 'One or more log filtering rules',
122
+ items: {
123
+ type: 'string'
124
+ },
125
+ title: 'log-filters config',
126
+ type: 'array'
127
+ },
128
+ 'log-level': {
129
+ appiumCliDest: 'loglevel',
130
+ default: 'debug',
131
+ description: 'Log level (console[:file])',
132
+ enum: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'],
133
+ title: 'log-level config',
134
+ type: 'string'
135
+ },
136
+ 'log-no-colors': {
137
+ default: false,
138
+ description: 'Do not use color in console output',
139
+ title: 'log-no-colors config',
140
+ type: 'boolean'
141
+ },
142
+ 'log-timestamp': {
143
+ default: false,
144
+ description: 'Show timestamps in console output',
145
+ title: 'log-timestamp config',
146
+ type: 'boolean'
147
+ },
148
+ 'long-stacktrace': {
149
+ default: false,
150
+ description: 'Add long stack traces to log entries. Recommended for debugging only.',
151
+ title: 'long-stacktrace config',
152
+ type: 'boolean'
153
+ },
154
+ 'no-perms-check': {
155
+ default: false,
156
+ description: 'Do not check that needed files are readable and/or writable',
157
+ title: 'no-perms-check config',
158
+ type: 'boolean'
159
+ },
160
+ nodeconfig: {
161
+ $comment: 'Selenium Grid 3 is unmaintained and Selenium Grid 4 no longer supports this file.',
162
+ description: 'Path to configuration JSON file to register Appium as a node with Selenium Grid 3; otherwise the configuration itself',
163
+ title: 'nodeconfig config',
164
+ type: 'object'
165
+ },
166
+ plugin: {
167
+ description: 'Plugin-specific configuration. Keys should correspond to plugin package names',
168
+ properties: {},
169
+ title: 'plugin config',
170
+ type: 'object'
171
+ },
172
+ port: {
173
+ appiumCliAliases: ['p'],
174
+ default: 4723,
175
+ description: 'Port to listen on',
176
+ maximum: 65535,
177
+ minimum: 1,
178
+ title: 'port config',
179
+ type: 'integer'
180
+ },
181
+ 'relaxed-security': {
182
+ default: false,
183
+ description: 'Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it\'s not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using "deny-insecure"',
184
+ title: 'relaxed-security config',
185
+ type: 'boolean'
186
+ },
187
+ 'session-override': {
188
+ default: false,
189
+ description: 'Enables session override (clobbering)',
190
+ title: 'session-override config',
191
+ type: 'boolean'
192
+ },
193
+ 'strict-caps': {
194
+ default: false,
195
+ description: 'Cause sessions to fail if desired caps are sent in that Appium does not recognize as valid for the selected device',
196
+ title: 'strict-caps config',
197
+ type: 'boolean'
198
+ },
199
+ tmp: {
200
+ appiumCliDest: 'tmpDir',
201
+ description: 'Absolute path to directory Appium can use to manage temp files. Defaults to C:\\Windows\\Temp on Windows and /tmp otherwise.',
202
+ title: 'tmp config',
203
+ type: 'string'
204
+ },
205
+ 'trace-dir': {
206
+ description: 'Absolute path to directory Appium can use to save iOS instrument traces; defaults to <tmp>/appium-instruments',
207
+ title: 'trace-dir config',
208
+ type: 'string'
209
+ },
210
+ 'use-drivers': {
211
+ appiumCliDescription: 'A list of drivers to activate. Can be a comma-delimited string or path to CSV file. By default, all installed drivers will be activated.',
212
+ default: [],
213
+ description: 'A list of drivers to activate. By default, all installed drivers will be activated.',
214
+ items: {
215
+ type: 'string'
216
+ },
217
+ title: 'use-drivers config',
218
+ type: 'array',
219
+ uniqueItems: true
220
+ },
221
+ 'use-plugins': {
222
+ appiumCliDescription: 'A list of plugins to activate. Can be a comma-delimited string, path to CSV file, or the string "all" to use all installed plugins.',
223
+ default: [],
224
+ description: 'A list of plugins to activate. To activate all plugins, the value should be an array with a single item "all".',
225
+ items: {
226
+ type: 'string'
227
+ },
228
+ title: 'use-plugins config',
229
+ type: 'array',
230
+ uniqueItems: true
231
+ },
232
+ webhook: {
233
+ $comment: 'This should probably use a uri-template format to restrict the protocol to http/https',
234
+ appiumCliAliases: ['G'],
235
+ description: 'Also send log output to this http listener',
236
+ format: 'uri',
237
+ title: 'webhook config',
238
+ type: 'string'
239
+ }
240
+ },
241
+ title: 'server config',
242
+ type: 'object'
243
+ }
244
+ },
245
+ title: 'Appium Configuration',
246
+ type: 'object'
247
+ };
248
+ var _default = schema;
249
+ exports.default = _default;require('source-map-support').install();
250
+
251
+
252
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvYXBwaXVtLWNvbmZpZy1zY2hlbWEuanMiXSwibmFtZXMiOlsic2NoZW1hIiwiJHNjaGVtYSIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiZGVzY3JpcHRpb24iLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiYWRkcmVzcyIsIiRjb21tZW50IiwiYXBwaXVtQ2xpQWxpYXNlcyIsImRlZmF1bHQiLCJmb3JtYXQiLCJ0aXRsZSIsInR5cGUiLCJhcHBpdW1DbGlUcmFuc2Zvcm1lciIsIml0ZW1zIiwidW5pcXVlSXRlbXMiLCJtYXhpbXVtIiwibWluaW11bSIsImRyaXZlciIsImxvZyIsImFwcGl1bUNsaURlc3QiLCJlbnVtIiwibm9kZWNvbmZpZyIsInBsdWdpbiIsInBvcnQiLCJ0bXAiLCJhcHBpdW1DbGlEZXNjcmlwdGlvbiIsIndlYmhvb2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBLE1BQU1BLE1BQU0sR0FBeUI7QUFDbkNDLEVBQUFBLE9BQU8sRUFBRSx3Q0FEMEI7QUFFbkNDLEVBQUFBLG9CQUFvQixFQUFFLEtBRmE7QUFHbkNDLEVBQUFBLFdBQVcsRUFBRSx5Q0FIc0I7QUFJbkNDLEVBQUFBLFVBQVUsRUFBRTtBQUNWQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkgsTUFBQUEsb0JBQW9CLEVBQUUsS0FEaEI7QUFFTkMsTUFBQUEsV0FBVyxFQUFFLCtDQUZQO0FBR05DLE1BQUFBLFVBQVUsRUFBRTtBQUNWRSxRQUFBQSxPQUFPLEVBQUU7QUFDUEMsVUFBQUEsUUFBUSxFQUNOLDREQUZLO0FBR1BDLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsR0FBRCxDQUhYO0FBSVBDLFVBQUFBLE9BQU8sRUFBRSxTQUpGO0FBS1BOLFVBQUFBLFdBQVcsRUFBRSx5QkFMTjtBQU1QTyxVQUFBQSxNQUFNLEVBQUUsVUFORDtBQU9QQyxVQUFBQSxLQUFLLEVBQUUsZ0JBUEE7QUFRUEMsVUFBQUEsSUFBSSxFQUFFO0FBUkMsU0FEQztBQVdWLHNCQUFjO0FBQ1pU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QUFJLEVBQUU7QUFERCxXQU5NO0FBU2JELFVBQUFBLEtBQUssRUFBRSxvQkFUTTtBQVViQyxVQUFBQSxJQUFJLEVBQUUsT0FWTztBQVdiRyxVQUFBQSxXQUFXLEVBQUU7QUFYQSxTQXZPTDtBQW9QVix1QkFBZTtBQUNiVyxVQUFBQSxvQkFBb0IsRUFDbEIscUlBRlc7QUFHYmpCLFVBQUFBLE9BQU8sRUFBRSxFQUhJO0FBSWJOLFVBQUFBLFdBQVcsRUFDVCxnSEFMVztBQU1iVyxVQUFBQSxLQUFLLEVBQUU7QUFDTEYsWUFBQUEsSUFBSSxFQUFFO0FBREQsV0FOTTtBQVNiRCxVQUFBQSxLQUFLLEVBQUUsb0JBVE07QUFVYkMsVUFBQUEsSUFBSSxFQUFFLE9BVk87QUFXYkcsVUFBQUEsV0FBVyxFQUFFO0FBWEEsU0FwUEw7QUFpUVZZLFFBQUFBLE9BQU8sRUFBRTtBQUNQcEIsVUFBQUEsUUFBUSxFQUNOLHVGQUZLO0FBR1BDLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsR0FBRCxDQUhYO0FBSVBMLFVBQUFBLFdBQVcsRUFBRSw0Q0FKTjtBQUtQTyxVQUFBQSxNQUFNLEVBQUUsS0FMRDtBQU1QQyxVQUFBQSxLQUFLLEVBQUUsZ0JBTkE7QUFPUEMsVUFBQUEsSUFBSSxFQUFFO0FBUEM7QUFqUUMsT0FITjtBQThRTkQsTUFBQUEsS0FBSyxFQUFFLGVBOVFEO0FBK1FOQyxNQUFBQSxJQUFJLEVBQUU7QUEvUUE7QUFERSxHQUp1QjtBQXVSbkNELEVBQUFBLEtBQUssRUFBRSxzQkF2UjRCO0FBd1JuQ0MsRUFBQUEsSUFBSSxFQUFFO0FBeFI2QixDQUFyQztlQTJSZVosTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5jb25zdCBzY2hlbWEgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAkc2NoZW1hOiAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEnLFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiAnQSBzY2hlbWEgZm9yIEFwcGl1bSBjb25maWd1cmF0aW9uIGZpbGVzJyxcbiAgcHJvcGVydGllczoge1xuICAgIHNlcnZlcjoge1xuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgZGVzY3JpcHRpb246ICdDb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBBcHBpdW0gYXMgYSBzZXJ2ZXInLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgJGNvbW1lbnQ6XG4gICAgICAgICAgICAnSSB0aGluayBob3N0bmFtZSBjb3ZlcnMgYm90aCBETlMgYW5kIElQdjQuLi5jb3VsZCBiZSB3cm9uZycsXG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydhJ10sXG4gICAgICAgICAgZGVmYXVsdDogJzAuMC4wLjAnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSVAgYWRkcmVzcyB0byBsaXN0ZW4gb24nLFxuICAgICAgICAgIGZvcm1hdDogJ2hvc3RuYW1lJyxcbiAgICAgICAgICB0aXRsZTogJ2FkZHJlc3MgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2FsbG93LWNvcnMnOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnV2hldGhlciB0aGUgQXBwaXVtIHNlcnZlciBzaG91bGQgYWxsb3cgd2ViIGJyb3dzZXIgY29ubmVjdGlvbnMgZnJvbSBhbnkgaG9zdCcsXG4gICAgICAgICAgdGl0bGU6ICdhbGxvdy1jb3JzIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICAnYWxsb3ctaW5zZWN1cmUnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpVHJhbnNmb3JtZXI6ICdjc3YnLFxuICAgICAgICAgIGRlZmF1bHQ6IFtdLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1NldCB3aGljaCBpbnNlY3VyZSBmZWF0dXJlcyBhcmUgYWxsb3dlZCB0byBydW4gaW4gdGhpcyBzZXJ2ZXJcXCdzIHNlc3Npb25zLiBGZWF0dXJlcyBhcmUgZGVmaW5lZCBvbiBhIGRyaXZlciBsZXZlbDsgc2VlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gTm90ZSB0aGF0IGZlYXR1cmVzIGRlZmluZWQgdmlhIFwiZGVueS1pbnNlY3VyZVwiIHdpbGwgYmUgZGlzYWJsZWQsIGV2ZW4gaWYgYWxzbyBsaXN0ZWQgaGVyZS4gSWYgc3RyaW5nLCBhIHBhdGggdG8gYSB0ZXh0IGZpbGUgY29udGFpbmluZyBwb2xpY3kgb3IgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdC4nLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiAnYWxsb3ctaW5zZWN1cmUgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAnYmFzZS1wYXRoJzoge1xuICAgICAgICAgIGFwcGl1bUNsaUFsaWFzZXM6IFsncGEnXSxcbiAgICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdCYXNlIHBhdGggdG8gdXNlIGFzIHRoZSBwcmVmaXggZm9yIGFsbCB3ZWJkcml2ZXIgcm91dGVzIHJ1bm5pbmcgb24gdGhlIHNlcnZlcicsXG4gICAgICAgICAgdGl0bGU6ICdiYXNlLXBhdGggY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2NhbGxiYWNrLWFkZHJlc3MnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydjYSddLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ2FsbGJhY2sgSVAgYWRkcmVzcyAoZGVmYXVsdDogc2FtZSBhcyBcImFkZHJlc3NcIiknLFxuICAgICAgICAgIHRpdGxlOiAnY2FsbGJhY2stYWRkcmVzcyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgICAnY2FsbGJhY2stcG9ydCc6IHtcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ2NwJ10sXG4gICAgICAgICAgZGVmYXVsdDogNDcyMyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NhbGxiYWNrIHBvcnQgKGRlZmF1bHQ6IHNhbWUgYXMgXCJwb3J0XCIpJyxcbiAgICAgICAgICBtYXhpbXVtOiA2NTUzNSxcbiAgICAgICAgICBtaW5pbXVtOiAxLFxuICAgICAgICAgIHRpdGxlOiAnY2FsbGJhY2stcG9ydCBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2RlYnVnLWxvZy1zcGFjaW5nJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0FkZCBleGFnZ2VyYXRlZCBzcGFjaW5nIGluIGxvZ3MgdG8gaGVscCB3aXRoIHZpc3VhbCBpbnNwZWN0aW9uJyxcbiAgICAgICAgICB0aXRsZTogJ2RlYnVnLWxvZy1zcGFjaW5nIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICAnZGVmYXVsdC1jYXBhYmlsaXRpZXMnOiB7XG4gICAgICAgICAgJGNvbW1lbnQ6ICdUT0RPJyxcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ2RjJ10sXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnU2V0IHRoZSBkZWZhdWx0IGRlc2lyZWQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIHNldCBvbiBlYWNoIHNlc3Npb24gdW5sZXNzIG92ZXJyaWRkZW4gYnkgcmVjZWl2ZWQgY2FwYWJpbGl0aWVzLiBJZiBhIHN0cmluZywgYSBwYXRoIHRvIGEgSlNPTiBmaWxlIGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcywgb3IgcmF3IEpTT04uJyxcbiAgICAgICAgICB0aXRsZTogJ2RlZmF1bHQtY2FwYWJpbGl0aWVzIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIH0sXG4gICAgICAgICdkZW55LWluc2VjdXJlJzoge1xuICAgICAgICAgICRjb21tZW50OiAnQWxsb3dlZCB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgZHJpdmVycycsXG4gICAgICAgICAgYXBwaXVtQ2xpVHJhbnNmb3JtZXI6ICdjc3YnLFxuICAgICAgICAgIGRlZmF1bHQ6IFtdLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1NldCB3aGljaCBpbnNlY3VyZSBmZWF0dXJlcyBhcmUgbm90IGFsbG93ZWQgdG8gcnVuIGluIHRoaXMgc2VydmVyXFwncyBzZXNzaW9ucy4gRmVhdHVyZXMgYXJlIGRlZmluZWQgb24gYSBkcml2ZXIgbGV2ZWw7IHNlZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuIEZlYXR1cmVzIGxpc3RlZCBoZXJlIHdpbGwgbm90IGJlIGVuYWJsZWQgZXZlbiBpZiBhbHNvIGxpc3RlZCBpbiBcImFsbG93LWluc2VjdXJlXCIsIGFuZCBldmVuIGlmIFwicmVsYXhlZC1zZWN1cml0eVwiIGlzIGVuYWJsZWQuIElmIHN0cmluZywgYSBwYXRoIHRvIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgcG9saWN5IG9yIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QuJyxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZTogJ2RlbnktaW5zZWN1cmUgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkcml2ZXI6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdEcml2ZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gS2V5cyBzaG91bGQgY29ycmVzcG9uZCB0byBkcml2ZXIgcGFja2FnZSBuYW1lcycsXG4gICAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgICAgdGl0bGU6ICdkcml2ZXIgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2tlZXAtYWxpdmUtdGltZW91dCc6IHtcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ2thJ10sXG4gICAgICAgICAgZGVmYXVsdDogNjAwLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ051bWJlciBvZiBzZWNvbmRzIHRoZSBBcHBpdW0gc2VydmVyIHNob3VsZCBhcHBseSBhcyBib3RoIHRoZSBrZWVwLWFsaXZlIHRpbWVvdXQgYW5kIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgZm9yIGFsbCByZXF1ZXN0cy4gQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoZSB0aW1lb3V0LicsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0aXRsZTogJ2tlZXAtYWxpdmUtdGltZW91dCBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2xvY2FsLXRpbWV6b25lJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIGxvY2FsIHRpbWV6b25lIGZvciB0aW1lc3RhbXBzJyxcbiAgICAgICAgICB0aXRsZTogJ2xvY2FsLXRpbWV6b25lIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBsb2c6IHtcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ2cnXSxcbiAgICAgICAgICBhcHBpdW1DbGlEZXN0OiAnbG9nRmlsZScsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdBbHNvIHNlbmQgbG9nIG91dHB1dCB0byB0aGlzIGZpbGUnLFxuICAgICAgICAgIHRpdGxlOiAnbG9nIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICAgICdsb2ctZmlsdGVycyc6IHtcbiAgICAgICAgICAkY29tbWVudDogJ1RPRE8nLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT25lIG9yIG1vcmUgbG9nIGZpbHRlcmluZyBydWxlcycsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6ICdsb2ctZmlsdGVycyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIH0sXG4gICAgICAgICdsb2ctbGV2ZWwnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpRGVzdDogJ2xvZ2xldmVsJyxcbiAgICAgICAgICBkZWZhdWx0OiAnZGVidWcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTG9nIGxldmVsIChjb25zb2xlWzpmaWxlXSknLFxuICAgICAgICAgIGVudW06IFtcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgICdpbmZvOmRlYnVnJyxcbiAgICAgICAgICAgICdpbmZvOmluZm8nLFxuICAgICAgICAgICAgJ2luZm86d2FybicsXG4gICAgICAgICAgICAnaW5mbzplcnJvcicsXG4gICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAnd2FybjpkZWJ1ZycsXG4gICAgICAgICAgICAnd2FybjppbmZvJyxcbiAgICAgICAgICAgICd3YXJuOndhcm4nLFxuICAgICAgICAgICAgJ3dhcm46ZXJyb3InLFxuICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICdlcnJvcjpkZWJ1ZycsXG4gICAgICAgICAgICAnZXJyb3I6aW5mbycsXG4gICAgICAgICAgICAnZXJyb3I6d2FybicsXG4gICAgICAgICAgICAnZXJyb3I6ZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJyxcbiAgICAgICAgICAgICdkZWJ1ZzpkZWJ1ZycsXG4gICAgICAgICAgICAnZGVidWc6aW5mbycsXG4gICAgICAgICAgICAnZGVidWc6d2FybicsXG4gICAgICAgICAgICAnZGVidWc6ZXJyb3InLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGl0bGU6ICdsb2ctbGV2ZWwgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2xvZy1uby1jb2xvcnMnOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdEbyBub3QgdXNlIGNvbG9yIGluIGNvbnNvbGUgb3V0cHV0JyxcbiAgICAgICAgICB0aXRsZTogJ2xvZy1uby1jb2xvcnMgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgICdsb2ctdGltZXN0YW1wJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2hvdyB0aW1lc3RhbXBzIGluIGNvbnNvbGUgb3V0cHV0JyxcbiAgICAgICAgICB0aXRsZTogJ2xvZy10aW1lc3RhbXAgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgICdsb25nLXN0YWNrdHJhY2UnOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQWRkIGxvbmcgc3RhY2sgdHJhY2VzIHRvIGxvZyBlbnRyaWVzLiBSZWNvbW1lbmRlZCBmb3IgZGVidWdnaW5nIG9ubHkuJyxcbiAgICAgICAgICB0aXRsZTogJ2xvbmctc3RhY2t0cmFjZSBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ25vLXBlcm1zLWNoZWNrJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0RvIG5vdCBjaGVjayB0aGF0IG5lZWRlZCBmaWxlcyBhcmUgcmVhZGFibGUgYW5kL29yIHdyaXRhYmxlJyxcbiAgICAgICAgICB0aXRsZTogJ25vLXBlcm1zLWNoZWNrIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBub2RlY29uZmlnOiB7XG4gICAgICAgICAgJGNvbW1lbnQ6XG4gICAgICAgICAgICAnU2VsZW5pdW0gR3JpZCAzIGlzIHVubWFpbnRhaW5lZCBhbmQgU2VsZW5pdW0gR3JpZCA0IG5vIGxvbmdlciBzdXBwb3J0cyB0aGlzIGZpbGUuJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gSlNPTiBmaWxlIHRvIHJlZ2lzdGVyIEFwcGl1bSBhcyBhIG5vZGUgd2l0aCBTZWxlbml1bSBHcmlkIDM7IG90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBpdHNlbGYnLFxuICAgICAgICAgIHRpdGxlOiAnbm9kZWNvbmZpZyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVnaW46IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdQbHVnaW4tc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gS2V5cyBzaG91bGQgY29ycmVzcG9uZCB0byBwbHVnaW4gcGFja2FnZSBuYW1lcycsXG4gICAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgICAgdGl0bGU6ICdwbHVnaW4gY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgcG9ydDoge1xuICAgICAgICAgIGFwcGl1bUNsaUFsaWFzZXM6IFsncCddLFxuICAgICAgICAgIGRlZmF1bHQ6IDQ3MjMsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdQb3J0IHRvIGxpc3RlbiBvbicsXG4gICAgICAgICAgbWF4aW11bTogNjU1MzUsXG4gICAgICAgICAgbWluaW11bTogMSxcbiAgICAgICAgICB0aXRsZTogJ3BvcnQgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIH0sXG4gICAgICAgICdyZWxheGVkLXNlY3VyaXR5Jzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0Rpc2FibGUgYWRkaXRpb25hbCBzZWN1cml0eSBjaGVja3MsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBzb21lIGFkdmFuY2VkIGZlYXR1cmVzLCBwcm92aWRlZCBieSBkcml2ZXJzIHN1cHBvcnRpbmcgdGhpcyBvcHRpb24uIE9ubHkgZW5hYmxlIGl0IGlmIGFsbCB0aGUgY2xpZW50cyBhcmUgaW4gdGhlIHRydXN0ZWQgbmV0d29yayBhbmQgaXRcXCdzIG5vdCB0aGUgY2FzZSBpZiBhIGNsaWVudCBjb3VsZCBwb3RlbnRpYWxseSBicmVhayBvdXQgb2YgdGhlIHNlc3Npb24gc2FuZGJveC4gU3BlY2lmaWMgZmVhdHVyZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdXNpbmcgXCJkZW55LWluc2VjdXJlXCInLFxuICAgICAgICAgIHRpdGxlOiAncmVsYXhlZC1zZWN1cml0eSBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ3Nlc3Npb24tb3ZlcnJpZGUnOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdFbmFibGVzIHNlc3Npb24gb3ZlcnJpZGUgKGNsb2JiZXJpbmcpJyxcbiAgICAgICAgICB0aXRsZTogJ3Nlc3Npb24tb3ZlcnJpZGUgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgICdzdHJpY3QtY2Fwcyc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdDYXVzZSBzZXNzaW9ucyB0byBmYWlsIGlmIGRlc2lyZWQgY2FwcyBhcmUgc2VudCBpbiB0aGF0IEFwcGl1bSBkb2VzIG5vdCByZWNvZ25pemUgYXMgdmFsaWQgZm9yIHRoZSBzZWxlY3RlZCBkZXZpY2UnLFxuICAgICAgICAgIHRpdGxlOiAnc3RyaWN0LWNhcHMgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgIHRtcDoge1xuICAgICAgICAgIGFwcGl1bUNsaURlc3Q6ICd0bXBEaXInLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0Fic29sdXRlIHBhdGggdG8gZGlyZWN0b3J5IEFwcGl1bSBjYW4gdXNlIHRvIG1hbmFnZSB0ZW1wIGZpbGVzLiBEZWZhdWx0cyB0byBDOlxcXFxXaW5kb3dzXFxcXFRlbXAgb24gV2luZG93cyBhbmQgL3RtcCBvdGhlcndpc2UuJyxcbiAgICAgICAgICB0aXRsZTogJ3RtcCBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgICAndHJhY2UtZGlyJzoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0Fic29sdXRlIHBhdGggdG8gZGlyZWN0b3J5IEFwcGl1bSBjYW4gdXNlIHRvIHNhdmUgaU9TIGluc3RydW1lbnQgdHJhY2VzOyBkZWZhdWx0cyB0byA8dG1wPi9hcHBpdW0taW5zdHJ1bWVudHMnLFxuICAgICAgICAgIHRpdGxlOiAndHJhY2UtZGlyIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICAgICd1c2UtZHJpdmVycyc6IHtcbiAgICAgICAgICBhcHBpdW1DbGlEZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBIGxpc3Qgb2YgZHJpdmVycyB0byBhY3RpdmF0ZS4gQ2FuIGJlIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZyBvciBwYXRoIHRvIENTViBmaWxlLiBCeSBkZWZhdWx0LCBhbGwgaW5zdGFsbGVkIGRyaXZlcnMgd2lsbCBiZSBhY3RpdmF0ZWQuJyxcbiAgICAgICAgICBkZWZhdWx0OiBbXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBIGxpc3Qgb2YgZHJpdmVycyB0byBhY3RpdmF0ZS4gQnkgZGVmYXVsdCwgYWxsIGluc3RhbGxlZCBkcml2ZXJzIHdpbGwgYmUgYWN0aXZhdGVkLicsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6ICd1c2UtZHJpdmVycyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgICd1c2UtcGx1Z2lucyc6IHtcbiAgICAgICAgICBhcHBpdW1DbGlEZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBIGxpc3Qgb2YgcGx1Z2lucyB0byBhY3RpdmF0ZS4gQ2FuIGJlIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZywgcGF0aCB0byBDU1YgZmlsZSwgb3IgdGhlIHN0cmluZyBcImFsbFwiIHRvIHVzZSBhbGwgaW5zdGFsbGVkIHBsdWdpbnMuJyxcbiAgICAgICAgICBkZWZhdWx0OiBbXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBIGxpc3Qgb2YgcGx1Z2lucyB0byBhY3RpdmF0ZS4gVG8gYWN0aXZhdGUgYWxsIHBsdWdpbnMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhIHNpbmdsZSBpdGVtIFwiYWxsXCIuJyxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZTogJ3VzZS1wbHVnaW5zIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9vazoge1xuICAgICAgICAgICRjb21tZW50OlxuICAgICAgICAgICAgJ1RoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBhIHVyaS10ZW1wbGF0ZSBmb3JtYXQgdG8gcmVzdHJpY3QgdGhlIHByb3RvY29sIHRvIGh0dHAvaHR0cHMnLFxuICAgICAgICAgIGFwcGl1bUNsaUFsaWFzZXM6IFsnRyddLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQWxzbyBzZW5kIGxvZyBvdXRwdXQgdG8gdGhpcyBodHRwIGxpc3RlbmVyJyxcbiAgICAgICAgICBmb3JtYXQ6ICd1cmknLFxuICAgICAgICAgIHRpdGxlOiAnd2ViaG9vayBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiAnc2VydmVyIGNvbmZpZycsXG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICB9LFxuICB9LFxuICB0aXRsZTogJ0FwcGl1bSBDb25maWd1cmF0aW9uJyxcbiAgdHlwZTogJ29iamVjdCcsXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc2NoZW1hO1xuIl0sImZpbGUiOiJsaWIvc2NoZW1hL2FwcGl1bS1jb25maWctc2NoZW1hLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.SERVER_PROP_NAME = exports.ArgSpec = exports.APPIUM_CONFIG_SCHEMA_ID = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ const APPIUM_CONFIG_SCHEMA_ID = 'appium.json';
17
+ exports.APPIUM_CONFIG_SCHEMA_ID = APPIUM_CONFIG_SCHEMA_ID;
18
+ const SERVER_PROP_NAME = 'server';
19
+ exports.SERVER_PROP_NAME = SERVER_PROP_NAME;
20
+ const SCHEMA_ID_REGEXP = /^(?<extType>.+?)-(?<normalizedExtName>.+)\.json$/;
21
+ const PROPERTIES = 'properties';
22
+
23
+ class ArgSpec {
24
+ constructor(name, {
25
+ extType,
26
+ extName,
27
+ dest,
28
+ defaultValue
29
+ } = {}) {
30
+ (0, _defineProperty2.default)(this, "name", void 0);
31
+ (0, _defineProperty2.default)(this, "extType", void 0);
32
+ (0, _defineProperty2.default)(this, "extName", void 0);
33
+ (0, _defineProperty2.default)(this, "ref", void 0);
34
+ (0, _defineProperty2.default)(this, "arg", void 0);
35
+ (0, _defineProperty2.default)(this, "dest", void 0);
36
+ (0, _defineProperty2.default)(this, "defaultValue", void 0);
37
+ const arg = ArgSpec.toArg(name, extType, extName);
38
+ const ref = ArgSpec.toSchemaRef(name, extType, extName);
39
+
40
+ const baseDest = _lodash.default.camelCase(dest !== null && dest !== void 0 ? dest : name);
41
+
42
+ const destKeypath = extType && extName ? [extType, extName, baseDest].join('.') : baseDest;
43
+ this.defaultValue = defaultValue;
44
+ this.name = name;
45
+ this.extType = extType;
46
+ this.extName = extName;
47
+ this.arg = arg;
48
+ this.dest = destKeypath;
49
+ this.ref = ref;
50
+ }
51
+
52
+ static toSchemaRef(name, extType, extName) {
53
+ const baseRef = ArgSpec.toSchemaBaseRef(extType, extName);
54
+
55
+ if (extType && extName) {
56
+ return [`${baseRef}#`, PROPERTIES, name].join('/');
57
+ }
58
+
59
+ return [`${baseRef}#`, PROPERTIES, SERVER_PROP_NAME, PROPERTIES, name].join('/');
60
+ }
61
+
62
+ static toSchemaBaseRef(extType, extName) {
63
+ if (extType && extName) {
64
+ return `${extType}-${ArgSpec.toNormalizedExtName(extName)}.json`;
65
+ }
66
+
67
+ return APPIUM_CONFIG_SCHEMA_ID;
68
+ }
69
+
70
+ static toArg(name, extType, extName) {
71
+ const properName = _lodash.default.kebabCase(name.replace(/^--?/, ''));
72
+
73
+ if (extType && extName) {
74
+ return [extType, _lodash.default.kebabCase(extName), properName].join('-');
75
+ }
76
+
77
+ return properName;
78
+ }
79
+
80
+ static toNormalizedExtName(extName) {
81
+ return _lodash.default.kebabCase(extName);
82
+ }
83
+
84
+ static extensionInfoFromRootSchemaId(schemaId) {
85
+ const matches = schemaId.match(SCHEMA_ID_REGEXP);
86
+
87
+ if (matches !== null && matches !== void 0 && matches.groups) {
88
+ const {
89
+ extType,
90
+ normalizedExtName
91
+ } = matches.groups;
92
+ return {
93
+ extType,
94
+ normalizedExtName
95
+ };
96
+ }
97
+
98
+ return {};
99
+ }
100
+
101
+ static create(name, opts) {
102
+ return Object.freeze(new ArgSpec(name, opts));
103
+ }
104
+
105
+ toString() {
106
+ let str = `[ArgSpec] ${this.name} (${this.ref})`;
107
+
108
+ if (this.extType && this.extName) {
109
+ str += ` (ext: ${this.extType}/${this.extName})`;
110
+ }
111
+
112
+ return str;
113
+ }
114
+
115
+ }
116
+
117
+ exports.ArgSpec = ArgSpec;require('source-map-support').install();
118
+
119
+
120
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvYXJnLXNwZWMuanMiXSwibmFtZXMiOlsiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJTRVJWRVJfUFJPUF9OQU1FIiwiU0NIRU1BX0lEX1JFR0VYUCIsIlBST1BFUlRJRVMiLCJBcmdTcGVjIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJkZXN0IiwiZGVmYXVsdFZhbHVlIiwiYXJnIiwidG9BcmciLCJyZWYiLCJ0b1NjaGVtYVJlZiIsImJhc2VEZXN0IiwiXyIsImNhbWVsQ2FzZSIsImRlc3RLZXlwYXRoIiwiam9pbiIsImJhc2VSZWYiLCJ0b1NjaGVtYUJhc2VSZWYiLCJ0b05vcm1hbGl6ZWRFeHROYW1lIiwicHJvcGVyTmFtZSIsImtlYmFiQ2FzZSIsInJlcGxhY2UiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsInNjaGVtYUlkIiwibWF0Y2hlcyIsIm1hdGNoIiwiZ3JvdXBzIiwibm9ybWFsaXplZEV4dE5hbWUiLCJjcmVhdGUiLCJvcHRzIiwiT2JqZWN0IiwiZnJlZXplIiwidG9TdHJpbmciLCJzdHIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFNTyxNQUFNQSx1QkFBdUIsR0FBRyxhQUFoQzs7QUFPQSxNQUFNQyxnQkFBZ0IsR0FBRyxRQUF6Qjs7QUFLUCxNQUFNQyxnQkFBZ0IsR0FBRyxrREFBekI7QUFLQSxNQUFNQyxVQUFVLEdBQUcsWUFBbkI7O0FBUU8sTUFBTUMsT0FBTixDQUFjO0FBOERuQkMsRUFBQUEsV0FBVyxDQUFFQyxJQUFGLEVBQVE7QUFBQ0MsSUFBQUEsT0FBRDtBQUFVQyxJQUFBQSxPQUFWO0FBQW1CQyxJQUFBQSxJQUFuQjtBQUF5QkMsSUFBQUE7QUFBekIsTUFBeUMsRUFBakQsRUFBcUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUc5RCxVQUFNQyxHQUFHLEdBQUdQLE9BQU8sQ0FBQ1EsS0FBUixDQUFjTixJQUFkLEVB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QUYsRUFBUTJCLElBQVIsRUFBYztBQUN6QixXQUFPQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFJL0IsT0FBSixDQUFZRSxJQUFaLEVBQWtCMkIsSUFBbEIsQ0FBZCxDQUFQO0FBQ0Q7O0FBT0RHLEVBQUFBLFFBQVEsR0FBSTtBQUNWLFFBQUlDLEdBQUcsR0FBSSxhQUFZLEtBQUsvQixJQUFLLEtBQUksS0FBS08sR0FBSSxHQUE5Qzs7QUFDQSxRQUFJLEtBQUtOLE9BQUwsSUFBZ0IsS0FBS0MsT0FBekIsRUFBa0M7QUFDaEM2QixNQUFBQSxHQUFHLElBQUssVUFBUyxLQUFLOUIsT0FBUSxJQUFHLEtBQUtDLE9BQVEsR0FBOUM7QUFDRDs7QUFDRCxXQUFPNkIsR0FBUDtBQUNEOztBQS9La0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIFRoZSBvcmlnaW5hbCBJRCBvZiB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gKiBXZSB1c2UgdGhpcyBpbiB0aGUgQ0xJIHRvIGNvbnZlcnQgaXQgdG8gYGFyZ3BhcnNlYCBvcHRpb25zLlxuICovXG5leHBvcnQgY29uc3QgQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQgPSAnYXBwaXVtLmpzb24nO1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgcHJvcCBjb250YWluaW5nIHNlcnZlci1yZWxhdGVkIG9wdGlvbnMuIEV2ZXJ5dGhpbmcgaW4gaGVyZVxuICogaXMgXCJuYXRpdmVcIiB0byBBcHBpdW0uXG4gKiBVc2VkIGJ5IHtAbGluayBmbGF0dGVuU2NoZW1hfSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBzY2hlbWEgaW50byBDTEkgYXJncy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9QUk9QX05BTUUgPSAnc2VydmVyJztcblxuLyoqXG4gKiBVc2VkIHRvIHBhcnNlIGV4dGVuc2lvbiBpbmZvIGZyb20gYSBzY2hlbWEgSUQuXG4gKi9cbmNvbnN0IFNDSEVNQV9JRF9SRUdFWFAgPSAvXig/PGV4dFR5cGU+Lis/KS0oPzxub3JtYWxpemVkRXh0TmFtZT4uKylcXC5qc29uJC87XG5cbi8qKlxuICogQXZvaWQgdHlwb3MgYnkgdXNpbmcgY29uc3RhbnRzIVxuICovXG5jb25zdCBQUk9QRVJUSUVTID0gJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIEFuIGBBcmdTcGVjYCBpcyBhIGNsYXNzIHJlcHJlc2VudGluZyBtZXRhZGF0YSBhYm91dCBhbiBhcmd1bWVudCAob3IgY29uZmlnXG4gKiBvcHRpb24pIHVzZWQgZm9yIGNyb3NzLXJlZmVyZW5jaW5nLlxuICpcbiAqIFRoaXMgY2xhc3MgaGFzIG5vIGluc3RhbmNlIG1ldGhvZHMsIGFuZCBpcyBiYXNpY2FsbHkganVzdCBhIHJlYWQtb25seSBcInN0cnVjdFwiLlxuICovXG5leHBvcnQgY2xhc3MgQXJnU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBDb3JyZXNwb25kcyB0byBrZXkgaW4gc2NoZW1hJ3MgYHByb3BlcnRpZXNgIHByb3AuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgYEV4dGVuc2lvblR5cGVgIG9mIHRoZSBhcmd1bWVudC4gVGhpcyB3aWxsIGJlIHNldCBpZiB0aGUgYXJnIGNhbWUgZnJvbSBhbiBleHRlbnNpb247XG4gICAqIG90aGVyd2lzZSBpdCB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZXx1bmRlZmluZWR9XG4gICAqL1xuICBleHRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpZiB0aGlzIGFyZ3VtZW50IGNhbWUgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIE90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9XG4gICAqL1xuICBleHROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NoZW1hIElEIChgJGlkYCkgZm9yIHRoZSBhcmd1bWVudC4gIFRoaXMgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLCBhbmQgYW55IHVzZXItcHJvdmlkZWQgYCRpZGBzIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICByZWY7XG5cbiAgLyoqXG4gICAqIFRoZSBDTEkgYXJndW1lbnQsIHNhbnMgbGVhZGluZyBkYXNoZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBhcmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpcmVkIGtleXBhdGggZm9yIHRoZSBhcmd1bWVudCBhZnRlciBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZC5cbiAgICpcbiAgICogVHlwaWNhbGx5IHRoaXMgaXMgY2FtZWxDYXNlZC4gIElmIHRoZSBhcmcgY2FtZSBmcm9tIGFuIGV4dGVuc2lvbiwgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoXG4gICAqIGA8ZXh0VHlwZT4uPGV4dE5hbWU+LmBcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGRlc3Q7XG5cbiAgLyoqXG4gICAqIFdoYXRldmVyIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXJndW1lbnQgaXMsIGFzIHNwZWNpZmllZCBieSB0aGVcbiAgICogYGRlZmF1bHRgIHByb3BlcnR5IG9mIHRoZSBzY2hlbWEuXG4gICAqIEB0eXBlIHtEfVxuICAgKi9cbiAgZGVmYXVsdFZhbHVlO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgc29tZSBjb21wdXRlZCBmaWVsZHMgYW5kIGFzc2lnbnMgdGhlbSB0byB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBub3QgYXNzaWduZWQuXG4gICAqXG4gICAqIFRoZSBfY29uc3RydWN0b3JfIGlzIHByaXZhdGUuIFVzZSB7QGxpbmsgQXJnU3BlYy5jcmVhdGV9IGluc3RlYWQuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSBEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJnU3BlY09wdGlvbnM8RD59IFtvcHRzXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5hbWUsIHtleHRUeXBlLCBleHROYW1lLCBkZXN0LCBkZWZhdWx0VmFsdWV9ID0ge30pIHtcbiAgICAvLyB3ZSBtdXN0IG5vcm1hbGl6ZSB0aGUgZXh0ZW5zaW9uIG5hbWUgdG8gZml0IGludG8gb3VyIGNvbnZlbnRpb24gZm9yIENMSVxuICAgIC8vIGFyZ3MuXG4gICAgY29uc3QgYXJnID0gQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKTtcblxuICAgIGNvbnN0IHJlZiA9IEFyZ1NwZWMudG9TY2hlbWFSZWYobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSk7XG5cbiAgICAvLyBpZiBubyBleHBsaWNpdCBgZGVzdGAgcHJvdmlkZWQsIGp1c3QgY2FtZWxDYXNlIHRoZSBuYW1lIHRvIGF2b2lkIG5lZWRpbmdcbiAgICAvLyB0byB1c2UgYnJhY2tldCBzeW50YXggd2hlbiBhY2Nlc3NpbmcgcHJvcHMgb24gdGhlIHBhcnNlZCBhcmdzIG9iamVjdC5cbiAgICBjb25zdCBiYXNlRGVzdCA9IF8uY2FtZWxDYXNlKGRlc3QgPz8gbmFtZSk7XG5cbiAgICBjb25zdCBkZXN0S2V5cGF0aCA9XG4gICAgICBleHRUeXBlICYmIGV4dE5hbWUgPyBbZXh0VHlwZSwgZXh0TmFtZSwgYmFzZURlc3RdLmpvaW4oJy4nKSA6IGJhc2VEZXN0O1xuXG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmV4dFR5cGUgPSBleHRUeXBlO1xuICAgIHRoaXMuZXh0TmFtZSA9IGV4dE5hbWU7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gICAgdGhpcy5kZXN0ID0gZGVzdEtleXBhdGg7XG4gICAgdGhpcy5yZWYgPSByZWY7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzY2hlbWEgSUQgKGAkaWRgKSBmb3IgdGhlICoqYXJndW1lbnQqKiBnaXZlbiB0aGUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIFwicm9vdFwiIG9yIFwiYmFzZVwiIHNjaGVtYSBJRCwgdXNlIHtAbGluayBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZn0gaW5zdGVhZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFNjaGVtYSBJRFxuICAgKi9cbiAgc3RhdGljIHRvU2NoZW1hUmVmIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgY29uc3QgYmFzZVJlZiA9IEFyZ1NwZWMudG9TY2hlbWFCYXNlUmVmKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIGlmIChleHRUeXBlICYmIGV4dE5hbWUpIHtcbiAgICAgIHJldHVybiBbYCR7YmFzZVJlZn0jYCwgUFJPUEVSVElFUywgbmFtZV0uam9pbignLycpO1xuICAgIH1cbiAgICByZXR1cm4gW2Ake2Jhc2VSZWZ9I2AsIFBST1BFUlRJRVMsIFNFUlZFUl9QUk9QX05BTUUsIFBST1BFUlRJRVMsIG5hbWVdLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBJRCBmb3IgYW4gZXh0ZW5zaW9uIG9yIHRoZSBiYXNlIHNjaGVtYSBJRC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICovXG4gIHN0YXRpYyB0b1NjaGVtYUJhc2VSZWYgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBpZiAoZXh0VHlwZSAmJiBleHROYW1lKSB7XG4gICAgICByZXR1cm4gYCR7ZXh0VHlwZX0tJHtBcmdTcGVjLnRvTm9ybWFsaXplZEV4dE5hbWUoZXh0TmFtZSl9Lmpzb25gO1xuICAgIH1cbiAgICByZXR1cm4gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB1bmlxdWUgSUQgZm9yIHRoZSBhcmd1bWVudCBnaXZlbiB0aGUgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFVuaXF1ZSBJRFxuICAgKi9cbiAgc3RhdGljIHRvQXJnIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvcGVyTmFtZSA9IF8ua2ViYWJDYXNlKG5hbWUucmVwbGFjZSgvXi0tPy8sICcnKSk7XG4gICAgaWYgKGV4dFR5cGUgJiYgZXh0TmFtZSkge1xuICAgICAgcmV0dXJuIFtleHRUeXBlLCBfLmtlYmFiQ2FzZShleHROYW1lKSwgcHJvcGVyTmFtZV0uam9pbignLScpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVyTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgcmF3IGV4dGVuc2lvbiBuYW1lIChub3QgaW5jbHVkaW5nIHRoZSB0eXBlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBOb3JtYWxpemVkIGV4dGVuc2lvbiBuYW1lXG4gICAqL1xuICBzdGF0aWMgdG9Ob3JtYWxpemVkRXh0TmFtZSAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGdpdmVuIHRoZSByb290IElEIG9mIGEgc2NoZW1hIGZvciBhbiBleHRlbnNpb24gKGA8ZXh0VHlwZT4tPG5vcm1hbGl6ZWRFeHROYW1lPi5qc29uYCkgUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kIHRoZSBfbm9ybWFsaXplZF8gZXh0ZW5zaW9uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFJZCAtIFJvb3Qgc2NoZW1hIElEXG4gICAqIEByZXR1cm5zIHt7ZXh0VHlwZTogRXh0ZW5zaW9uVHlwZXx1bmRlZmluZWQsIG5vcm1hbGl6ZWRFeHROYW1lOiBzdHJpbmd8dW5kZWZpbmVkfX1cbiAgICovXG4gIHN0YXRpYyBleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCAoc2NoZW1hSWQpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gc2NoZW1hSWQubWF0Y2goU0NIRU1BX0lEX1JFR0VYUCk7XG4gICAgaWYgKG1hdGNoZXM/Lmdyb3Vwcykge1xuICAgICAgY29uc3Qge2V4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lfSA9IG1hdGNoZXMuZ3JvdXBzO1xuICAgICAgcmV0dXJuIHtleHRUeXBlLCBub3JtYWxpemVkRXh0TmFtZX07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGBBcmdTcGVjYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgYXJndW1lbnQuIENvcnJlc3BvbmRzIHRvIGEga2V5IGluIGEgc2NoZW1hJ3NcbiAgICogYHByb3BlcnRpZXNgIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge0FyZ1NwZWNPcHRpb25zfSBbb3B0c10gLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtSZWFkb25seTxBcmdTcGVjPn1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUgKG5hbWUsIG9wdHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuZXcgQXJnU3BlYyhuYW1lLCBvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uLCB1c2VmdWwgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdG9TdHJpbmcgKCkge1xuICAgIGxldCBzdHIgPSBgW0FyZ1NwZWNdICR7dGhpcy5uYW1lfSAoJHt0aGlzLnJlZn0pYDtcbiAgICBpZiAodGhpcy5leHRUeXBlICYmIHRoaXMuZXh0TmFtZSkge1xuICAgICAgc3RyICs9IGAgKGV4dDogJHt0aGlzLmV4dFR5cGV9LyR7dGhpcy5leHROYW1lfSlgO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIEFyZ1NwZWMuY3JlYXRlfVxuICogQHRlbXBsYXRlIERcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFyZ1NwZWNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V4dE5hbWVdXG4gKiBAcHJvcGVydHkge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZXN0XVxuICogQHByb3BlcnR5IHtEfSBbZGVmYXVsdFZhbHVlXVxuICovXG4iXSwiZmlsZSI6ImxpYi9zY2hlbWEvYXJnLXNwZWMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.toParserArgs = toParserArgs;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _argparse = require("argparse");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ var _configFile = require("../config-file");
17
+
18
+ var _schema = require("./schema");
19
+
20
+ var _cliTransformers = require("./cli-transformers");
21
+
22
+ const TYPENAMES = Object.freeze({
23
+ ARRAY: 'array',
24
+ OBJECT: 'object',
25
+ BOOLEAN: 'boolean',
26
+ INTEGER: 'integer',
27
+ NUMBER: 'number',
28
+ NULL: 'null',
29
+ STRING: 'string'
30
+ });
31
+ const SHORT_ARG_CUTOFF = 3;
32
+
33
+ function aliasToFlag(argSpec, alias) {
34
+ const {
35
+ extType,
36
+ extName,
37
+ name
38
+ } = argSpec;
39
+ const arg = alias !== null && alias !== void 0 ? alias : name;
40
+ const isShort = arg.length < SHORT_ARG_CUTOFF;
41
+
42
+ if (extType && extName) {
43
+ return isShort ? `--${extType}-${_lodash.default.kebabCase(extName)}-${arg}` : `--${extType}-${_lodash.default.kebabCase(extName)}-${_lodash.default.kebabCase(arg)}`;
44
+ }
45
+
46
+ return isShort ? `-${arg}` : `--${_lodash.default.kebabCase(arg)}`;
47
+ }
48
+
49
+ const screamingSnakeCase = _lodash.default.flow(_lodash.default.snakeCase, _lodash.default.toUpper);
50
+
51
+ function getSchemaValidator({
52
+ ref: schemaId
53
+ }, coerce = _lodash.default.identity) {
54
+ return value => {
55
+ const coerced = coerce(value);
56
+ const errors = (0, _schema.validate)(coerced, schemaId);
57
+
58
+ if (_lodash.default.isEmpty(errors)) {
59
+ return coerced;
60
+ }
61
+
62
+ throw new _argparse.ArgumentTypeError('\n\n' + (0, _configFile.formatErrors)(errors, value, {
63
+ schemaId
64
+ }));
65
+ };
66
+ }
67
+
68
+ function subSchemaToArgDef(subSchema, argSpec, opts = {}) {
69
+ var _overrides$dest;
70
+
71
+ const {
72
+ overrides = {}
73
+ } = opts;
74
+ let {
75
+ type,
76
+ appiumCliAliases,
77
+ appiumCliTransformer,
78
+ appiumCliDescription,
79
+ description,
80
+ enum: enumValues
81
+ } = subSchema;
82
+ const {
83
+ name,
84
+ arg,
85
+ dest
86
+ } = argSpec;
87
+ const aliases = [aliasToFlag(argSpec), ...(appiumCliAliases !== null && appiumCliAliases !== void 0 ? appiumCliAliases : []).map(alias => aliasToFlag(argSpec, alias))];
88
+ let argOpts = {
89
+ required: false,
90
+ help: appiumCliDescription !== null && appiumCliDescription !== void 0 ? appiumCliDescription : description
91
+ };
92
+ let argTypeFunction;
93
+
94
+ switch (type) {
95
+ case TYPENAMES.BOOLEAN:
96
+ {
97
+ argOpts.action = 'store_true';
98
+ break;
99
+ }
100
+
101
+ case TYPENAMES.OBJECT:
102
+ {
103
+ argTypeFunction = _cliTransformers.transformers.json;
104
+ break;
105
+ }
106
+
107
+ case TYPENAMES.ARRAY:
108
+ {
109
+ argTypeFunction = _cliTransformers.transformers.csv;
110
+ break;
111
+ }
112
+
113
+ case TYPENAMES.NUMBER:
114
+ {
115
+ argTypeFunction = getSchemaValidator(argSpec, parseFloat);
116
+ break;
117
+ }
118
+
119
+ case TYPENAMES.INTEGER:
120
+ {
121
+ argTypeFunction = getSchemaValidator(argSpec, _lodash.default.parseInt);
122
+ break;
123
+ }
124
+
125
+ case TYPENAMES.STRING:
126
+ {
127
+ argTypeFunction = getSchemaValidator(argSpec);
128
+ break;
129
+ }
130
+
131
+ case TYPENAMES.NULL:
132
+ default:
133
+ {
134
+ throw new TypeError(`Schema property "${arg}": \`${type}\` type unknown or disallowed`);
135
+ }
136
+ }
137
+
138
+ if (type !== TYPENAMES.BOOLEAN) {
139
+ argOpts.metavar = screamingSnakeCase(name);
140
+ }
141
+
142
+ if (type !== TYPENAMES.ARRAY && type !== TYPENAMES.OBJECT && appiumCliTransformer) {
143
+ var _argTypeFunction;
144
+
145
+ argTypeFunction = _lodash.default.flow((_argTypeFunction = argTypeFunction) !== null && _argTypeFunction !== void 0 ? _argTypeFunction : _lodash.default.identity, _cliTransformers.transformers[appiumCliTransformer]);
146
+ }
147
+
148
+ if (argTypeFunction) {
149
+ argOpts.type = argTypeFunction;
150
+ }
151
+
152
+ if (enumValues && !_lodash.default.isEmpty(enumValues)) {
153
+ if (type === TYPENAMES.STRING) {
154
+ argOpts.choices = enumValues.map(String);
155
+ } else {
156
+ throw new TypeError(`Problem with schema for ${arg}; \`enum\` is only supported for \`type: 'string'\``);
157
+ }
158
+ }
159
+
160
+ argOpts = _lodash.default.merge(argOpts, (_overrides$dest = overrides[dest]) !== null && _overrides$dest !== void 0 ? _overrides$dest : {});
161
+ return [aliases, argOpts];
162
+ }
163
+
164
+ function toParserArgs(opts = {}) {
165
+ const flattened = (0, _schema.flattenSchema)();
166
+ return new Map(_lodash.default.map(flattened, ({
167
+ schema,
168
+ argSpec
169
+ }) => subSchemaToArgDef(schema, argSpec, opts)));
170
+ }require('source-map-support').install();
171
+
172
+
173
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvY2xpLWFyZ3MuanMiXSwibmFtZXMiOlsiVFlQRU5BTUVTIiwiT2JqZWN0IiwiZnJlZXplIiwiQVJSQVkiLCJPQkpFQ1QiLCJCT09MRUFOIiwiSU5URUdFUiIsIk5VTUJFUiIsIk5VTEwiLCJTVFJJTkciLCJTSE9SVF9BUkdfQ1VUT0ZGIiwiYWxpYXNUb0ZsYWciLCJhcmdTcGVjIiwiYWxpYXMiLCJleHRUeXBlIiwiZXh0TmFtZSIsIm5hbWUiLCJhcmciLCJpc1Nob3J0IiwibGVuZ3RoIiwiXyIsImtlYmFiQ2FzZSIsInNjcmVhbWluZ1NuYWtlQ2FzZSIsImZsb3ciLCJzbmFrZUNhc2UiLCJ0b1VwcGVyIiwiZ2V0U2NoZW1hVmFsaWRhdG9yIiwicmVmIiwic2NoZW1hSWQiLCJjb2VyY2UiLCJpZGVudGl0eSIsInZhbHVlIiwiY29lcmNlZCIsImVycm9ycyIsImlzRW1wdHkiLCJBcmd1bWVudFR5cGVFcnJvciIsInN1YlNjaGVtYVRvQXJnRGVmIiwic3ViU2NoZW1hIiwib3B0cyIsIm92ZXJyaWRlcyIsInR5cGUiLCJhcHBpdW1DbGlBbGlhc2VzIiwiYXBwaXVtQ2xpVHJhbnNmb3JtZXIiLCJhcHBpdW1DbGlEZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwiZW51bSIsImVudW1WYWx1ZXMiLCJkZXN0IiwiYWxpYXNlcyIsIm1hcCIsImFyZ09wdHMiLCJyZXF1aXJlZCIsImhlbHAiLCJhcmdUeXBlRnVuY3Rpb24iLCJhY3Rpb24iLCJ0cmFuc2Zvcm1lcnMiLCJqc29uIiwiY3N2IiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwiVHlwZUVycm9yIiwibWV0YXZhciIsImNob2ljZXMiLCJTdHJpbmciLCJtZXJnZSIsInRvUGFyc2VyQXJncyIsImZsYXR0ZW5lZCIsIk1hcCIsInNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFZQSxNQUFNQSxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0Ms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QUFULEdBQUQsS0FDZndCLGlCQUFpQixDQUFDZ0MsTUFBRCxFQUFTeEQsT0FBVCxFQUFrQjBCLElBQWxCLENBRG5CLENBREssQ0FBUDtBQUtEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7QXJndW1lbnRUeXBlRXJyb3J9IGZyb20gJ2FyZ3BhcnNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2Zvcm1hdEVycm9ycyBhcyBmb3JtYXRFcnJvcnN9IGZyb20gJy4uL2NvbmZpZy1maWxlJztcbmltcG9ydCB7ZmxhdHRlblNjaGVtYSwgdmFsaWRhdGV9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7dHJhbnNmb3JtZXJzfSBmcm9tICcuL2NsaS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGNvbmNlcm5zIGZ1bmN0aW9ucyB3aGljaCBjb252ZXJ0IHNjaGVtYSBkZWZpbml0aW9ucyB0b1xuICogYGFyZ3BhcnNlYC1jb21wYXRpYmxlIGRhdGEgc3RydWN0dXJlcywgZm9yIGRlcml2aW5nIENMSSBhcmd1bWVudHMgZnJvbSBhXG4gKiBzY2hlbWEuXG4gKi9cblxuLyoqXG4gKiBMb29rdXAgb2YgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgYHR5cGVgIGZpZWxkIGluIGEgSlNPTiBzY2hlbWEuXG4gKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KCdqc29uLXNjaGVtYScpLkpTT05TY2hlbWE3VHlwZU5hbWU+Pn1cbiAqL1xuY29uc3QgVFlQRU5BTUVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFSUkFZOiAnYXJyYXknLFxuICBPQkpFQ1Q6ICdvYmplY3QnLFxuICBCT09MRUFOOiAnYm9vbGVhbicsXG4gIElOVEVHRVI6ICdpbnRlZ2VyJyxcbiAgTlVNQkVSOiAnbnVtYmVyJyxcbiAgTlVMTDogJ251bGwnLFxuICBTVFJJTkc6ICdzdHJpbmcnLFxufSk7XG5cbi8qKlxuICogT3B0aW9ucyB3aXRoIGFsaWFzIGxlbmd0aHMgbGVzcyB0aGFuIHRoaXMgd2lsbCBiZSBjb25zaWRlcmVkIFwic2hvcnRcIiBmbGFncy5cbiAqL1xuY29uc3QgU0hPUlRfQVJHX0NVVE9GRiA9IDM7XG5cbi8qKlxuICogQ29udmVydCBhbiBhbGlhcyAoYGZvb2ApIHRvIGEgZmxhZyAoYC0tZm9vYCkgb3IgYSBzaG9ydCBmbGFnIChgLWZgKS5cbiAqIEBwYXJhbSB7QXJnU3BlY30gYXJnU3BlYyAtIHRoZSBhcmd1bWVudCBzcGVjaWZpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIHRoZSBhbGlhcyB0byBjb252ZXJ0IHRvIGEgZmxhZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZsYWdcbiAqL1xuZnVuY3Rpb24gYWxpYXNUb0ZsYWcgKGFyZ1NwZWMsIGFsaWFzKSB7XG4gIGNvbnN0IHtleHRUeXBlLCBleHROYW1lLCBuYW1lfSA9IGFyZ1NwZWM7XG4gIGNvbnN0IGFyZyA9IGFsaWFzID8/IG5hbWU7XG4gIGNvbnN0IGlzU2hvcnQgPSBhcmcubGVuZ3RoIDwgU0hPUlRfQVJHX0NVVE9GRjtcbiAgaWYgKGV4dFR5cGUgJiYgZXh0TmFtZSkge1xuICAgIHJldHVybiBpc1Nob3J0XG4gICAgICA/IGAtLSR7ZXh0VHlwZX0tJHtfLmtlYmFiQ2FzZShleHROYW1lKX0tJHthcmd9YFxuICAgICAgOiBgLS0ke2V4dFR5cGV9LSR7Xy5rZWJhYkNhc2UoZXh0TmFtZSl9LSR7Xy5rZWJhYkNhc2UoYXJnKX1gO1xuICB9XG4gIHJldHVybiBpc1Nob3J0ID8gYC0ke2FyZ31gIDogYC0tJHtfLmtlYmFiQ2FzZShhcmcpfWA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gU0NSRUFNSU5HX1NOQUtFX0NBU0VcbiAqL1xuY29uc3Qgc2NyZWFtaW5nU25ha2VDYXNlID0gXy5mbG93KF8uc25ha2VDYXNlLCBfLnRvVXBwZXIpO1xuXG4vKipcbiAqIEdpdmVuIHVuaXF1ZSBwcm9wZXJ0eSBuYW1lIGBuYW1lYCwgcmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggdmFsaWRhdGVzIGEgdmFsdWVcbiAqIGFnYWluc3QgYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHNjaGVtYS5cbiAqIEB0ZW1wbGF0ZSBDb2VyY2VkXG4gKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWMgLSBBcmd1bWVudCBuYW1lXG4gKiBAcGFyYW0geyh2YWx1ZTogc3RyaW5nKSA9PiBDb2VyY2VkfSBbY29lcmNlXSAtIEZ1bmN0aW9uIHRvIGNvZXJjZSB0byBhIGRpZmZlcmVudFxuICogcHJpbWl0aXZlXG4gKiBAdG9kbyBTZWUgaWYgd2UgY2FuIHJlbW92ZSBgY29lcmNlYCBieSBhbGxvd2luZyBBanYgdG8gY29lcmNlIGluIGl0c1xuICogY29uc3RydWN0b3Igb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0U2NoZW1hVmFsaWRhdG9yICh7cmVmOiBzY2hlbWFJZH0sIGNvZXJjZSA9IF8uaWRlbnRpdHkpIHtcbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAqL1xuICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY29lcmNlZCA9IGNvZXJjZSh2YWx1ZSk7XG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGUoY29lcmNlZCwgc2NoZW1hSWQpO1xuICAgIGlmIChfLmlzRW1wdHkoZXJyb3JzKSkge1xuICAgICAgcmV0dXJuIGNvZXJjZWQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBBcmd1bWVudFR5cGVFcnJvcihcbiAgICAgICdcXG5cXG4nICsgZm9ybWF0RXJyb3JzKGVycm9ycywgdmFsdWUsIHtzY2hlbWFJZH0pLFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogR2l2ZW4gYXJnIGBuYW1lYCwgYSBKU09OIHNjaGVtYSBgc3ViU2NoZW1hYCwgYW5kIG9wdGlvbnMsIHJldHVybiBhbiBhcmd1bWVudCBkZWZpbml0aW9uXG4gKiBhcyB1bmRlcnN0b29kIGJ5IGBhcmdwYXJzZWAuXG4gKiBAcGFyYW0ge0FwcGl1bUpTT05TY2hlbWF9IHN1YlNjaGVtYSAtIEpTT04gc2NoZW1hIGZvciB0aGUgb3B0aW9uXG4gKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWMgLSBBcmd1bWVudCBzcGVjIHR1cGxlXG4gKiBAcGFyYW0ge1N1YlNjaGVtYVRvQXJnRGVmT3B0aW9uc30gW29wdHNdIC0gT3B0aW9uc1xuICogQHJldHVybnMge1tzdHJpbmdbXSwgaW1wb3J0KCdhcmdwYXJzZScpLkFyZ3VtZW50T3B0aW9uc119IFR1cGxlIG9mIGZsYWcgYW5kIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gc3ViU2NoZW1hVG9BcmdEZWYgKHN1YlNjaGVtYSwgYXJnU3BlYywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtvdmVycmlkZXMgPSB7fX0gPSBvcHRzO1xuICBsZXQge1xuICAgIHR5cGUsXG4gICAgYXBwaXVtQ2xpQWxpYXNlcyxcbiAgICBhcHBpdW1DbGlUcmFuc2Zvcm1lcixcbiAgICBhcHBpdW1DbGlEZXNjcmlwdGlvbixcbiAgICBkZXNjcmlwdGlvbixcbiAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICB9ID0gc3ViU2NoZW1hO1xuXG4gIGNvbnN0IHtuYW1lLCBhcmcsIGRlc3R9ID0gYXJnU3BlYztcblxuICBjb25zdCBhbGlhc2VzID0gW1xuICAgIGFsaWFzVG9GbGFnKGFyZ1NwZWMpLFxuICAgIC4uLi8qKiBAdHlwZSB7c3RyaW5nW119ICovIChhcHBpdW1DbGlBbGlhc2VzID8/IFtdKS5tYXAoKGFsaWFzKSA9PlxuICAgICAgYWxpYXNUb0ZsYWcoYXJnU3BlYywgYWxpYXMpLFxuICAgICksXG4gIF07XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ2FyZ3BhcnNlJykuQXJndW1lbnRPcHRpb25zfSAqL1xuICBsZXQgYXJnT3B0cyA9IHtcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgaGVscDogYXBwaXVtQ2xpRGVzY3JpcHRpb24gPz8gZGVzY3JpcHRpb24sXG4gIH07XG5cbiAgLyoqXG4gICAqIEdlbmVyYWxseSB3ZSB3aWxsIHByb3ZpZGUgYSBgdHlwZWAgdG8gYGFyZ3BhcnNlYCBhcyBhIGZ1bmN0aW9uIHdoaWNoXG4gICAqIHZhbGlkYXRlcyB1c2luZyBhanYgKHdoaWNoIGlzIG11Y2ggbW9yZSBmdWxsLWZlYXR1cmVkIHRoYW4gd2hhdCBgYXJncGFyc2VgXG4gICAqIGNhbiBvZmZlcikuIFRoZSBleGNlcHRpb24gaXMgYGJvb2xlYW5gLXR5cGUgb3B0aW9ucywgd2hpY2ggaGF2ZSBub1xuICAgKiBgYXJnVHlwZWAuXG4gICAqXG4gICAqIE5vdCBzdXJlIGlmIHRoaXMgdHlwZSBpcyBjb3JyZWN0LCBidXQgaXQncyBub3QgZG9pbmcgd2hhdCBJIHdhbnQuICBJIHdhbnRcbiAgICogdG8gc2F5IFwidGhpcyBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgc29tZXRoaW5nIG9mIHR5cGUgYFRgIHdoZXJlIGBUYCBpc1xuICAgKiBuZXZlciBhIGBQcm9taXNlYFwiLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHN5bmMuXG4gICAqIEB0eXBlIHsoKHZhbHVlOiBzdHJpbmcpID0+IHVua25vd24pfHVuZGVmaW5lZH1cbiAgICovXG4gIGxldCBhcmdUeXBlRnVuY3Rpb247XG5cbiAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHZhcmlvdXMgdHlwZXNcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgLy8gYm9vbGVhbnMgZG8gbm90IGhhdmUgYSB0eXBlIHBlciBgQXJndW1lbnRPcHRpb25zYCwganVzdCBhbiBcImFjdGlvblwiXG4gICAgY2FzZSBUWVBFTkFNRVMuQk9PTEVBTjoge1xuICAgICAgYXJnT3B0cy5hY3Rpb24gPSAnc3RvcmVfdHJ1ZSc7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFRZUEVOQU1FUy5PQkpFQ1Q6IHtcbiAgICAgIGFyZ1R5cGVGdW5jdGlvbiA9IHRyYW5zZm9ybWVycy5qc29uO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gYXJyYXlzIGFyZSB0cmVhdGVkIGFzIENTVnMsIGJlY2F1c2UgYGFyZ3BhcnNlYCBkb2Vzbid0IGhhbmRsZSBhcnJheSBkYXRhLlxuICAgIGNhc2UgVFlQRU5BTUVTLkFSUkFZOiB7XG4gICAgICBhcmdUeXBlRnVuY3Rpb24gPSB0cmFuc2Zvcm1lcnMuY3N2O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gXCJudW1iZXJcIiB0eXBlIGlzIGNvZXJjZWQgdG8gZmxvYXQuIGBhcmdwYXJzZWAgZG9lcyB0aGlzIGZvciB1cyBpZiB3ZSB1c2UgYGZsb2F0YCB0eXBlLCBidXRcbiAgICAvLyB3ZSBkb24ndC5cbiAgICBjYXNlIFRZUEVOQU1FUy5OVU1CRVI6IHtcbiAgICAgIGFyZ1R5cGVGdW5jdGlvbiA9IGdldFNjaGVtYVZhbGlkYXRvcihhcmdTcGVjLCBwYXJzZUZsb2F0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFwiaW50ZWdlclwiIGlzIGNvZXJjZWQgdG8gYW4gLi4gaW50ZWdlci4gIGFnYWluLCBgYXJncGFyc2VgIHdvdWxkIGRvIHRoaXMgZm9yIHVzIGlmIHdlIHVzZWQgYGludGAuXG4gICAgY2FzZSBUWVBFTkFNRVMuSU5URUdFUjoge1xuICAgICAgYXJnVHlwZUZ1bmN0aW9uID0gZ2V0U2NoZW1hVmFsaWRhdG9yKGFyZ1NwZWMsIF8ucGFyc2VJbnQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gc3RyaW5ncyAobGlrZSBudW1iZXIgYW5kIGludGVnZXIpIGFyZSBzdWJqZWN0IHRvIGZ1cnRoZXIgdmFsaWRhdGlvblxuICAgIC8vIChlLmcuLCBtdXN0IHNhdGlzZnkgYSBtYXNrIG9yIHJlZ2V4IG9yIGV2ZW4gc29tZSBjdXN0b20gdmFsaWRhdGlvblxuICAgIC8vIGZ1bmN0aW9uKVxuICAgIGNhc2UgVFlQRU5BTUVTLlNUUklORzoge1xuICAgICAgYXJnVHlwZUZ1bmN0aW9uID0gZ2V0U2NoZW1hVmFsaWRhdG9yKGFyZ1NwZWMpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGhlcmUgbWF5IGJlIHNvbWUgd2F5IHRvIHJlc3RyaWN0IHRoaXMgYXQgdGhlIEFqdiBsZXZlbCAtLVxuICAgIC8vIHRoYXQgbWF5IGludm9sdmUgcGF0Y2hpbmcgdGhlIG1ldGFzY2hlbWEuXG4gICAgY2FzZSBUWVBFTkFNRVMuTlVMTDpcbiAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFNjaGVtYSBwcm9wZXJ0eSBcIiR7YXJnfVwiOiBcXGAke3R5cGV9XFxgIHR5cGUgdW5rbm93biBvciBkaXNhbGxvd2VkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gbWV0YXZhciBpcyB1c2VkIGluIGhlbHAgdGV4dC4gYGJvb2xlYW5gIGNhbm5vdCBoYXZlIGEgbWV0YXZhci0taXQgaXMgbm90XG4gIC8vIGRpc3BsYXllZC0tYW5kIGBhcmdwYXJzZWAgdGhyb3dzIGlmIHlvdSBnaXZlIGl0IG9uZS5cbiAgaWYgKHR5cGUgIT09IFRZUEVOQU1FUy5CT09MRUFOKSB7XG4gICAgYXJnT3B0cy5tZXRhdmFyID0gc2NyZWFtaW5nU25ha2VDYXNlKG5hbWUpO1xuICB9XG5cbiAgLy8gdGhlIHZhbGlkaXR5IG9mIFwiYXBwaXVtQ2xpVHJhbnNmb3JtZXJcIiBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gZGV0ZXJtaW5lZFxuICAvLyBieSBhanYgZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uIGluIGBmaW5hbGl6ZVNjaGVtYSgpYC4gdGhlIGBhcnJheWAgJlxuICAvLyBgb2JqZWN0YCB0eXBlcyBoYXZlIGFscmVhZHkgYWRkZWQgYSBmb3JtYXR0ZXIgKHNlZSBhYm92ZSwgc28gd2UgZG9uJ3QgZG8gaXRcbiAgLy8gdHdpY2UpLlxuICBpZiAoXG4gICAgdHlwZSAhPT0gVFlQRU5BTUVTLkFSUkFZICYmXG4gICAgdHlwZSAhPT0gVFlQRU5BTUVTLk9CSkVDVCAmJlxuICAgIGFwcGl1bUNsaVRyYW5zZm9ybWVyXG4gICkge1xuICAgIGFyZ1R5cGVGdW5jdGlvbiA9IF8uZmxvdyhcbiAgICAgIGFyZ1R5cGVGdW5jdGlvbiA/PyBfLmlkZW50aXR5LFxuICAgICAgdHJhbnNmb3JtZXJzW2FwcGl1bUNsaVRyYW5zZm9ybWVyXSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ1R5cGVGdW5jdGlvbikge1xuICAgIGFyZ09wdHMudHlwZSA9IGFyZ1R5cGVGdW5jdGlvbjtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgSlNPTiBzY2hlbWEgYGVudW1gIHRvIGBjaG9pY2VzYC4gYGVudW1gIGNhbiBjb250YWluIGFueSBKU09OIHR5cGUsIGJ1dCBgYXJncGFyc2VgXG4gIC8vIGlzIGxpbWl0ZWQgdG8gYSBzaW5nbGUgdHlwZSBwZXIgYXJnIChJIHRoaW5rKS4gIHNvIGxldCdzIG1ha2UgZXZlcnl0aGluZyBhIHN0cmluZy5cbiAgLy8gYW5kIG1pZ2h0IGFzIHdlbGwgX3JlcXVpcmVfIHRoZSBgdHlwZTogc3RyaW5nYCB3aGlsZSB3ZSdyZSBhdCBpdC5cbiAgaWYgKGVudW1WYWx1ZXMgJiYgIV8uaXNFbXB0eShlbnVtVmFsdWVzKSkge1xuICAgIGlmICh0eXBlID09PSBUWVBFTkFNRVMuU1RSSU5HKSB7XG4gICAgICBhcmdPcHRzLmNob2ljZXMgPSBlbnVtVmFsdWVzLm1hcChTdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgUHJvYmxlbSB3aXRoIHNjaGVtYSBmb3IgJHthcmd9OyBcXGBlbnVtXFxgIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBcXGB0eXBlOiAnc3RyaW5nJ1xcYGAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIG92ZXJyaWRlcyBvdmVycmlkZSBhbnl0aGluZyB3ZSBjb21wdXRlZCBoZXJlLiAgdXN1YWxseSB0aGlzIGludm9sdmVzIFwiY3VzdG9tIHR5cGVzXCIsXG4gIC8vIHdoaWNoIGFyZSByZWFsbHkganVzdCB0cmFuc2Zvcm0gZnVuY3Rpb25zLlxuICBhcmdPcHRzID0gXy5tZXJnZShcbiAgICBhcmdPcHRzLFxuICAgIC8qKiBzaG91bGQgdGhlIG92ZXJyaWRlIGtleXMgY29ycmVzcG9uZCB0byB0aGUgcHJvcCBuYW1lIG9yIHRoZSBwcm9wIGRlc3Q/XG4gICAgICogdGhlIHByb3AgZGVzdCBpcyBjb21wdXRlZCBieSB7QGxpbmsgYWxpYXNUb0Rlc3R9LlxuICAgICAqL1xuICAgIG92ZXJyaWRlc1tkZXN0XSA/PyB7fSxcbiAgKTtcblxuICByZXR1cm4gW2FsaWFzZXMsIGFyZ09wdHNdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaW5hbGl6ZWQsIGZsYXR0ZW5lZCBzY2hlbWEgcmVwcmVzZW50YXRpb24gaW50b1xuICogQXJndW1lbnREZWZpbml0aW9ucyBmb3IgaGFuZG9mZiB0byBgYXJncGFyc2VgLlxuICpcbiAqIEBwYXJhbSB7VG9QYXJzZXJBcmdzT3B0aW9uc30gb3B0cyAtIE9wdGlvbnNcbiAqIEB0aHJvd3MgSWYgc2NoZW1hIGhhcyBub3QgYmVlbiBhZGRlZCB0byBhanYgKHZpYSBgZmluYWxpemVTY2hlbWEoKWApXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuLi9jbGkvYXJncycpLkFyZ3VtZW50RGVmaW5pdGlvbnN9IEEgbWFwIG9mIGFycnlhcyBvZlxuICogYWxpYXNlcyB0byBgYXJncGFyc2VgIGFyZ3VtZW50czsgZW1wdHkgaWYgbm8gc2NoZW1hIGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcnNlckFyZ3MgKG9wdHMgPSB7fSkge1xuICBjb25zdCBmbGF0dGVuZWQgPSBmbGF0dGVuU2NoZW1hKCk7XG4gIHJldHVybiBuZXcgTWFwKFxuICAgIF8ubWFwKGZsYXR0ZW5lZCwgKHtzY2hlbWEsIGFyZ1NwZWN9KSA9PlxuICAgICAgc3ViU2NoZW1hVG9BcmdEZWYoc2NoZW1hLCBhcmdTcGVjLCBvcHRzKSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b1BhcnNlckFyZ3N9XG4gKiBAdHlwZWRlZiB7U3ViU2NoZW1hVG9BcmdEZWZPcHRpb25zfSBUb1BhcnNlckFyZ3NPcHRpb25zXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgc3ViU2NoZW1hVG9BcmdEZWZ9LlxuICogQHR5cGVkZWYge09iamVjdH0gU3ViU2NoZW1hVG9BcmdEZWZPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeF0gLSBUaGUgcHJlZml4IHRvIHVzZSBmb3IgdGhlIGZsYWcsIGlmIGFueVxuICogQHByb3BlcnR5IHt7W2tleTogc3RyaW5nXTogaW1wb3J0KCdhcmdwYXJzZScpLkFyZ3VtZW50T3B0aW9uc319IFtvdmVycmlkZXNdIC0gQW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhanYvZGlzdC90eXBlcycpLkZvcm1hdFZhbGlkYXRvcjxUPn0gRm9ybWF0VmFsaWRhdG9yPFQ+XG4gKi9cblxuLyoqXG4gKiBBIEpTT04gNyBzY2hlbWEgd2l0aCBvdXIgY3VzdG9tIGtleXdvcmRzLlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9rZXl3b3JkcycpLkFwcGl1bUpTT05TY2hlbWFLZXl3b3JkcyAmIGltcG9ydCgnanNvbi1zY2hlbWEnKS5KU09OU2NoZW1hN30gQXBwaXVtSlNPTlNjaGVtYVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9hcmctc3BlYycpLkFyZ1NwZWN9IEFyZ1NwZWNcbiAqL1xuIl0sImZpbGUiOiJsaWIvc2NoZW1hL2NsaS1hcmdzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=