appium 2.0.0-beta.26 → 2.0.0-beta.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/appium.d.ts +215 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +62 -54
- package/build/lib/cli/args.d.ts +20 -0
- package/build/lib/cli/args.d.ts.map +1 -0
- package/build/lib/cli/args.js +1 -1
- package/build/lib/cli/driver-command.d.ts +36 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +8 -7
- package/build/lib/cli/extension-command.d.ts +345 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +52 -38
- package/build/lib/cli/extension.d.ts +14 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +7 -2
- package/build/lib/cli/parser.d.ts +79 -0
- package/build/lib/cli/parser.d.ts.map +1 -0
- package/build/lib/cli/parser.js +1 -1
- package/build/lib/cli/plugin-command.d.ts +39 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +6 -7
- package/build/lib/cli/utils.d.ts +29 -0
- package/build/lib/cli/utils.d.ts.map +1 -0
- package/build/lib/cli/utils.js +1 -1
- package/build/lib/config-file.d.ts +100 -0
- package/build/lib/config-file.d.ts.map +1 -0
- package/build/lib/config-file.js +1 -1
- package/build/lib/config.d.ts +40 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +2 -2
- package/build/lib/constants.d.ts +48 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +1 -1
- package/build/lib/extension/driver-config.d.ts +84 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +1 -1
- package/build/lib/extension/extension-config.d.ts +170 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +2 -2
- package/build/lib/extension/index.d.ts +39 -0
- package/build/lib/extension/index.d.ts.map +1 -0
- package/build/lib/extension/index.js +1 -1
- package/build/lib/extension/manifest.d.ts +174 -0
- package/build/lib/extension/manifest.d.ts.map +1 -0
- package/build/lib/extension/manifest.js +1 -1
- package/build/lib/extension/package-changed.d.ts +11 -0
- package/build/lib/extension/package-changed.d.ts.map +1 -0
- package/build/lib/extension/package-changed.js +1 -1
- package/build/lib/extension/plugin-config.d.ts +62 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +1 -1
- package/build/lib/grid-register.d.ts +10 -0
- package/build/lib/grid-register.d.ts.map +1 -0
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logsink.d.ts +4 -0
- package/build/lib/logsink.d.ts.map +1 -0
- package/build/lib/logsink.js +1 -1
- package/build/lib/main.d.ts +51 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +1 -1
- package/build/lib/schema/arg-spec.d.ts +143 -0
- package/build/lib/schema/arg-spec.d.ts.map +1 -0
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/cli-args.d.ts +19 -0
- package/build/lib/schema/cli-args.d.ts.map +1 -0
- package/build/lib/schema/cli-args.js +1 -1
- package/build/lib/schema/cli-transformers.d.ts +5 -0
- package/build/lib/schema/cli-transformers.d.ts.map +1 -0
- package/build/lib/schema/cli-transformers.js +1 -1
- package/build/lib/schema/index.d.ts +3 -0
- package/build/lib/schema/index.d.ts.map +1 -0
- package/build/lib/schema/keywords.d.ts +24 -0
- package/build/lib/schema/keywords.d.ts.map +1 -0
- package/build/lib/schema/keywords.js +1 -1
- package/build/lib/schema/schema.d.ts +259 -0
- package/build/lib/schema/schema.d.ts.map +1 -0
- package/build/lib/schema/schema.js +3 -3
- package/build/lib/utils.d.ts +66 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +6 -4
- package/build/tsconfig.tsbuildinfo +1 -0
- package/lib/appium.js +163 -81
- package/lib/cli/args.js +1 -2
- package/lib/cli/driver-command.js +11 -8
- package/lib/cli/extension-command.js +129 -80
- package/lib/cli/extension.js +13 -3
- package/lib/cli/parser.js +1 -2
- package/lib/cli/plugin-command.js +16 -6
- package/lib/cli/utils.js +1 -1
- package/lib/config-file.js +3 -4
- package/lib/config.js +12 -8
- package/lib/constants.js +0 -1
- package/lib/extension/driver-config.js +31 -12
- package/lib/extension/extension-config.js +21 -22
- package/lib/extension/index.js +1 -2
- package/lib/extension/manifest.js +23 -127
- package/lib/extension/package-changed.js +0 -1
- package/lib/extension/plugin-config.js +9 -7
- package/lib/logsink.js +4 -0
- package/lib/main.js +9 -10
- package/lib/schema/arg-spec.js +10 -6
- package/lib/schema/cli-args.js +0 -1
- package/lib/schema/cli-transformers.js +0 -1
- package/lib/schema/keywords.js +0 -1
- package/lib/schema/schema.js +2 -3
- package/lib/utils.js +49 -16
- package/package.json +12 -14
- package/types/appium-manifest.d.ts +61 -0
- package/types/cli.d.ts +134 -0
- package/types/extension.d.ts +56 -0
- package/types/external-manifest.d.ts +58 -0
- package/types/index.d.ts +7 -0
- package/build/lib/appium-config.schema.json +0 -278
- package/build/lib/schema/appium-config-schema.js +0 -251
- package/lib/schema/appium-config-schema.js +0 -287
- package/types/appium-config.d.ts +0 -197
- package/types/types.d.ts +0 -245
|
@@ -5,12 +5,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.default = void 0;
|
|
8
|
+
exports.default = exports.ExtensionCommand = void 0;
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
+
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
|
|
14
16
|
var _support = require("@appium/support");
|
|
15
17
|
|
|
16
18
|
var _utils = require("./utils");
|
|
@@ -19,6 +21,8 @@ var _teen_process = require("teen_process");
|
|
|
19
21
|
|
|
20
22
|
var _extensionConfig = require("../extension/extension-config");
|
|
21
23
|
|
|
24
|
+
var _packageChanged = require("../extension/package-changed");
|
|
25
|
+
|
|
22
26
|
const UPDATE_ALL = 'installed';
|
|
23
27
|
|
|
24
28
|
class NotUpdatableError extends Error {}
|
|
@@ -45,7 +49,7 @@ class ExtensionCommand {
|
|
|
45
49
|
async execute(args) {
|
|
46
50
|
const cmd = args[`${this.type}Command`];
|
|
47
51
|
|
|
48
|
-
if (!_lodash.default.isFunction(
|
|
52
|
+
if (!_lodash.default.isFunction(this[cmd])) {
|
|
49
53
|
throw new Error(`Cannot handle ${this.type} command ${cmd}`);
|
|
50
54
|
}
|
|
51
55
|
|
|
@@ -92,12 +96,13 @@ class ExtensionCommand {
|
|
|
92
96
|
data.upToDate = updates.safeUpdate === null && updates.unsafeUpdate === null;
|
|
93
97
|
}
|
|
94
98
|
});
|
|
99
|
+
const listData = exts;
|
|
95
100
|
|
|
96
101
|
if (this.isJsonOutput) {
|
|
97
|
-
return
|
|
102
|
+
return listData;
|
|
98
103
|
}
|
|
99
104
|
|
|
100
|
-
for (const [name, data] of _lodash.default.toPairs(
|
|
105
|
+
for (const [name, data] of _lodash.default.toPairs(listData)) {
|
|
101
106
|
let installTxt = ' [not installed]'.grey;
|
|
102
107
|
let updateTxt = '';
|
|
103
108
|
let upToDateTxt = '';
|
|
@@ -148,10 +153,10 @@ class ExtensionCommand {
|
|
|
148
153
|
console.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);
|
|
149
154
|
}
|
|
150
155
|
|
|
151
|
-
return
|
|
156
|
+
return listData;
|
|
152
157
|
}
|
|
153
158
|
|
|
154
|
-
async
|
|
159
|
+
async _install({
|
|
155
160
|
ext,
|
|
156
161
|
installType,
|
|
157
162
|
packageName
|
|
@@ -167,12 +172,7 @@ class ExtensionCommand {
|
|
|
167
172
|
throw new Error(`When using --source=${installType}, must also use --package`);
|
|
168
173
|
}
|
|
169
174
|
|
|
170
|
-
if (installType === _extensionConfig.
|
|
171
|
-
const msg = `Linking ${this.type} from local path into ${this.config.appiumHome}`;
|
|
172
|
-
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await _support.npm.linkPackage(this.config.appiumHome, installSpec));
|
|
173
|
-
extData = this.getExtensionFields(pkgJsonData);
|
|
174
|
-
(0, _utils.log)(this.isJsonOutput, `Successfully linked ${extData.pkgName} into ${this.config.appiumHome}`);
|
|
175
|
-
} else if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
175
|
+
if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
176
176
|
if (installSpec.split('/').length !== 2) {
|
|
177
177
|
throw new Error(`Github ${this.type} spec ${installSpec} appeared to be invalid; ` + 'it should be of the form <org>/<repo>');
|
|
178
178
|
}
|
|
@@ -188,29 +188,33 @@ class ExtensionCommand {
|
|
|
188
188
|
pkgName: packageName
|
|
189
189
|
});
|
|
190
190
|
} else {
|
|
191
|
-
let
|
|
192
|
-
const splits = installSpec.split('@');
|
|
191
|
+
let pkgName, pkgVer;
|
|
193
192
|
|
|
194
|
-
if (
|
|
195
|
-
|
|
193
|
+
if (installType === _extensionConfig.INSTALL_TYPE_LOCAL) {
|
|
194
|
+
pkgName = _path.default.isAbsolute(installSpec) ? installSpec : _path.default.resolve(installSpec);
|
|
196
195
|
} else {
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
let name;
|
|
197
|
+
const splits = installSpec.split('@');
|
|
199
198
|
|
|
200
|
-
|
|
199
|
+
if (installSpec[0] === '@') {
|
|
200
|
+
[name, pkgVer] = [`@${splits[1]}`, splits[2]];
|
|
201
|
+
} else {
|
|
202
|
+
[name, pkgVer] = splits;
|
|
203
|
+
}
|
|
201
204
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
205
|
+
if (installType === _extensionConfig.INSTALL_TYPE_NPM) {
|
|
206
|
+
pkgName = name;
|
|
207
|
+
} else {
|
|
208
|
+
const knownNames = Object.keys(this.knownExtensions);
|
|
206
209
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
210
|
+
if (!_lodash.default.includes(knownNames, name)) {
|
|
211
|
+
const msg = `Could not resolve ${this.type}; are you sure it's in the list ` + `of supported ${this.type}s? ${JSON.stringify(knownNames)}`;
|
|
212
|
+
throw new Error(msg);
|
|
213
|
+
}
|
|
211
214
|
|
|
212
|
-
|
|
213
|
-
|
|
215
|
+
pkgName = this.knownExtensions[name];
|
|
216
|
+
installType = _extensionConfig.INSTALL_TYPE_NPM;
|
|
217
|
+
}
|
|
214
218
|
}
|
|
215
219
|
|
|
216
220
|
extData = await this.installViaNpm({
|
|
@@ -227,9 +231,16 @@ class ExtensionCommand {
|
|
|
227
231
|
throw new Error(`A ${this.type} named '${extName}' is already installed. ` + `Did you mean to update? 'appium ${this.type} update'. See ` + `installed ${this.type}s with 'appium ${this.type} list --installed'.`);
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
234
|
+
const extManifest = { ...extData,
|
|
235
|
+
installType,
|
|
236
|
+
installSpec
|
|
237
|
+
};
|
|
238
|
+
await this.config.addExtension(extName, extManifest);
|
|
239
|
+
|
|
240
|
+
if (await _support.env.hasAppiumDependency(this.config.appiumHome)) {
|
|
241
|
+
await (0, _packageChanged.packageDidChange)(this.config.appiumHome);
|
|
242
|
+
}
|
|
243
|
+
|
|
233
244
|
(0, _utils.log)(this.isJsonOutput, this.getPostInstallText({
|
|
234
245
|
extName,
|
|
235
246
|
extData
|
|
@@ -271,17 +282,18 @@ class ExtensionCommand {
|
|
|
271
282
|
version
|
|
272
283
|
} = pkgJsonData;
|
|
273
284
|
this.validateExtensionFields(appium);
|
|
274
|
-
|
|
285
|
+
const result = { ...appium,
|
|
275
286
|
pkgName: name,
|
|
276
287
|
version
|
|
277
288
|
};
|
|
289
|
+
return result;
|
|
278
290
|
}
|
|
279
291
|
|
|
280
292
|
validateExtensionFields(appiumPkgData) {
|
|
281
293
|
throw new Error('Must be implemented in final class');
|
|
282
294
|
}
|
|
283
295
|
|
|
284
|
-
async
|
|
296
|
+
async _uninstall({
|
|
285
297
|
ext
|
|
286
298
|
}) {
|
|
287
299
|
if (!this.config.isInstalled(ext)) {
|
|
@@ -300,7 +312,7 @@ class ExtensionCommand {
|
|
|
300
312
|
return this.config.installedExtensions;
|
|
301
313
|
}
|
|
302
314
|
|
|
303
|
-
async
|
|
315
|
+
async _update({
|
|
304
316
|
ext,
|
|
305
317
|
unsafe
|
|
306
318
|
}) {
|
|
@@ -410,7 +422,7 @@ class ExtensionCommand {
|
|
|
410
422
|
await this.config.updateExtension(ext, extData);
|
|
411
423
|
}
|
|
412
424
|
|
|
413
|
-
async
|
|
425
|
+
async _run({
|
|
414
426
|
ext,
|
|
415
427
|
scriptName
|
|
416
428
|
}) {
|
|
@@ -461,5 +473,7 @@ class ExtensionCommand {
|
|
|
461
473
|
|
|
462
474
|
}
|
|
463
475
|
|
|
464
|
-
exports.
|
|
465
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25maWciLCJrbm93bkV4dGVuc2lvbnMiLCJpc0pzb25PdXRwdXQiLCJjb25zdHJ1Y3RvciIsImpzb24iLCJ0eXBlIiwiZXh0ZW5zaW9uVHlwZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFR4dCIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImluc3RhbGxTcGVjIiwidmVyc2lvbiIsInR5cGVUeHQiLCJJTlNUQUxMX1RZUEVfR0lUIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsInllbGxvdyIsIklOU1RBTExfVFlQRV9MT0NBTCIsIm1hZ2VudGEiLCJncmVlbiIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsImFwcGl1bUhvbWUiLCJwa2dKc29uRGF0YSIsIm5wbSIsImxpbmtQYWNrYWdlIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwic3BsaXQiLCJsZW5ndGgiLCJpbnN0YWxsVmlhTnBtIiwicmVwbGFjZSIsInBrZ1ZlciIsInNwbGl0cyIsIkpTT04iLCJzdHJpbmdpZnkiLCJleHROYW1lIiwiaXNJbnN0YWxsZWQiLCJhZGRFeHRlbnNpb24iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsImluc3RhbGxQYWNrYWdlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwiYXBwaXVtUGtnRGF0YSIsInVuaW5zdGFsbCIsImluc3RhbGxQYXRoIiwiZ2V0SW5zdGFsbFBhdGgiLCJmcyIsInJpbXJhZiIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwic2NyaXB0cyIsImV4dFNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsIm91dHB1dCIsIlJpbmdCdWZmZXIiLCJvbiIsImxpbmUiLCJlbnF1ZXVlIiwic3RhcnQiLCJqb2luIiwiZ2V0QnVmZiIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFVBQVUsR0FBRyxXQUFuQjs7QUFFQSxNQUFNQyxpQkFBTixTQUFn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TUFBTSxFQUFFQSxNQUFNLENBQUNPLE9BQVA7QUFBVCxPQUFQO0FBQ0QsS0FKRCxDQUlFLE9BQU85QyxHQUFQLEVBQVk7QUFDWixzQkFBSSxLQUFLbEYsWUFBVCxFQUF3QixzQ0FBcUM4RyxVQUFXLE1BQUs1QixHQUFHLENBQUNDLE9BQVEsRUFBbEUsQ0FBb0VxQixHQUEzRjtBQUNBLGFBQU87QUFBQ3lCLFFBQUFBLEtBQUssRUFBRS9DLEdBQUcsQ0FBQ0MsT0FBWjtBQUFxQnNDLFFBQUFBLE1BQU0sRUFBRUEsTUFBTSxDQUFDTyxPQUFQO0FBQTdCLE9BQVA7QUFDRDtBQUNGOztBQXBmbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IG5wbSwgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgbG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0V4dFR5cGUgZXh0ZW5kcyBpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkRyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOU31cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb259KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHRlbnNpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihFeHRlbnNpb25Db21tYW5kLnByb3RvdHlwZVtjbWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlICR7dGhpcy50eXBlfSBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgICBjb25zdCBleGVjdXRlQ21kID0gdGhpc1tjbWRdLmJpbmQodGhpcyk7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDbWQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgTGlzdE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCAoe3Nob3dJbnN0YWxsZWQsIHNob3dVcGRhdGVzfSkge1xuICAgIGNvbnN0IGxzTXNnID0gYExpc3RpbmcgJHtzaG93SW5zdGFsbGVkID8gJ2luc3RhbGxlZCcgOiAnYXZhaWxhYmxlJ30gJHt0aGlzLnR5cGV9c2A7XG4gICAgY29uc3QgaW5zdGFsbGVkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGV4dHMgPSBbLi4uaW5zdGFsbGVkTmFtZXMsIC4uLmtub3duTmFtZXNdLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7Li4udGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiB0cnVlfTtcbiAgICAgICAgfSBlbHNlIGlmICghc2hvd0luc3RhbGxlZCkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgLyoqIEB0eXBlIHtFeHRlbnNpb25MaXN0RGF0YX0gKi8oe30pKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSdyZSBqdXN0IGdldHRpbmcgdGhlIGRhdGEsIHNob3J0IGNpcmN1aXQgcmV0dXJuIGhlcmUgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnlcbiAgICAvLyBmb3JtYXR0aW5nIGxvZ2ljXG4gICAgaWYgKHRoaXMuaXNKc29uT3V0cHV0KSB7XG4gICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGxldCBpbnN0YWxsVHh0ID0gJyBbbm90IGluc3RhbGxlZF0nLmdyZXk7XG4gICAgICBsZXQgdXBkYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdXBUb0RhdGVUeHQgPSAnJztcbiAgICAgIGxldCB1bnNhZmVVcGRhdGVUeHQgPSAnJztcbiAgICAgIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjLCB1cGRhdGVWZXJzaW9uLCB1bnNhZmVVcGRhdGVWZXJzaW9uLCB2ZXJzaW9uLCB1cFRvRGF0ZX0gPSBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGAtICR7bmFtZS55ZWxsb3d9JHtpbnN0YWxsVHh0fSR7dXBkYXRlVHh0fSR7dXBUb0RhdGVUeHR9JHt1bnNhZmVVcGRhdGVUeHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIC8qKiBAdHlwZSB7RXh0RGF0YTxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcbiAgICBsZXQgaW5zdGFsbFNwZWMgPSBleHQ7XG5cbiAgICBpZiAocGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX05QTV0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgbXVzdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgY29uc3QgbXNnID0gYExpbmtpbmcgJHt0aGlzLnR5cGV9IGZyb20gbG9jYWwgcGF0aCBpbnRvICR7dGhpcy5jb25maWcuYXBwaXVtSG9tZX1gO1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiAoXG4gICAgICAgIGF3YWl0IG5wbS5saW5rUGFja2FnZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBpbnN0YWxsU3BlYykpXG4gICAgICApO1xuICAgICAgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYFN1Y2Nlc3NmdWxseSBsaW5rZWQgJHtleHREYXRhLnBrZ05hbWV9IGludG8gJHt0aGlzLmNvbmZpZy5hcHBpdW1Ib21lfWApO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVRIVUIpIHtcbiAgICAgIGlmIChpbnN0YWxsU3BlYy5zcGxpdCgnLycpLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+Jyk7XG4gICAgICB9XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8ocGFja2FnZU5hbWUpfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVCkge1xuICAgICAgLy8gZ2l0IHVybHMgY2FuIGhhdmUgJy5naXQnIGF0IHRoZSBlbmQsIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHdvdWxkIGNvbXBsaWNhdGUgdGhlXG4gICAgICAvLyB3YXkgd2UgZG93bmxvYWQgYW5kIG5hbWUgZGlyZWN0b3JpZXMsIHNvIHdlIGNhbiBqdXN0IHJlbW92ZSBpdFxuICAgICAgaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYy5yZXBsYWNlKC9cXC5naXQkLywgJycpO1xuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhY2thZ2VOYW1lKX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgIC8vIG5hbWUuIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgIC8vIGV4dGVuc2lvbnMgaW5zdGFsbGVkIHZpYSBucG0gY2FuIGluY2x1ZGUgdmVyc2lvbnMgb3IgdGFncyBhZnRlciB0aGUgJ0AnXG4gICAgICAvLyBzaWduLCBzbyBjaGVjayBmb3IgdGhhdC4gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCBwYWNrYWdlIG5hbWVzIHRoZW1zZWx2ZXMgY2FuXG4gICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgIGxldCBuYW1lLCBwa2dWZXI7XG4gICAgICBjb25zdCBzcGxpdHMgPSBpbnN0YWxsU3BlYy5zcGxpdCgnQCcpO1xuICAgICAgaWYgKGluc3RhbGxTcGVjWzBdID09PSAnQCcpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IFtgQCR7c3BsaXRzWzFdfWAsIHNwbGl0c1syXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IHNwbGl0cztcbiAgICAgIH1cbiAgICAgIGxldCBwa2dOYW1lO1xuXG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgLy8gYWdhaW5zdCB0aGUgYXBwaXVtIGV4dGVuc2lvbiBsaXN0OyBqdXN0IHVzZSB0aGUgaW5zdGFsbFNwZWMgYXMgaXNcbiAgICAgICAgcGtnTmFtZSA9IG5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgYXBwaXVtIGRyaXZlciAobGlrZSAneGN1aXRlc3QnKSB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGRlcmVmZXJlbmNlIHRoZSBhY3R1YWwgbnBtIHBhY2thZ2UgKCdhcHBpdXBtLXhjdWl0ZXN0LWRyaXZlcicpLCBzb1xuICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICghXy5pbmNsdWRlcyhrbm93bk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBvZiBzdXBwb3J0ZWQgJHt0aGlzLnR5cGV9cz8gJHtKU09OLnN0cmluZ2lmeShrbm93bk5hbWVzKX1gO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHBrZ05hbWUgPSB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgIC8vICducG0nIG5vd1xuICAgICAgICBpbnN0YWxsVHlwZSA9IElOU1RBTExfVFlQRV9OUE07XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TmFtZSA9IGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhgJHt0aGlzLnR5cGV9TmFtZWApXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgZXh0RGF0YS5pbnN0YWxsVHlwZSA9IGluc3RhbGxUeXBlO1xuICAgIGV4dERhdGEuaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYztcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0RGF0YSk7XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dERhdGE8RXh0VHlwZT4+fVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gZXh0ID8gJycgOiBgIHVzaW5nIE5QTSBpbnN0YWxsIHNwZWMgJyR7bnBtU3BlY30nYDtcbiAgICBjb25zdCBtc2cgPSBgSW5zdGFsbGluZyAnJHtleHR9JyR7c3BlY01zZ31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXJcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBpbnN0YWxsaW5nIHBhY2thZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGV4dCB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFmdGVyIGFuIGV4dGVuc2lvbiBoYXMgYmVlbiBpbnN0YWxsZWQuIFRoaXNcbiAgICogaXMgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBkcml2ZXJzL3BsdWdpbnMgd2l0aCB0aGVpciBvd24gcGFydGljdWxhciB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkFyZ3N9IGFyZ3NcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXRQb3N0SW5zdGFsbFRleHQgKGFyZ3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGFuIE5QTSBtb2R1bGUncyBwYWNrYWdlLmpzb24gYW5kIGV4dHJhY3QgQXBwaXVtIGRyaXZlciBpbmZvcm1hdGlvbiBmcm9tIGEgc3BlY2lhbFxuICAgKiAnYXBwaXVtJyBmaWVsZCBpbiB0aGUgSlNPTiBkYXRhLiBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZS5nLiBkZXRlcm1pbmUgd2hpY2ggY2xhc3MgdG9cbiAgICogbG9hZCBhcyB0aGUgbWFpbiBkcml2ZXIgY2xhc3MsIG9yIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZHJpdmVyIGFuZFxuICAgKiBhcHBpdW0gdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuXG4gICAgcmV0dXJuIHsuLi5hcHBpdW0sIHBrZ05hbWU6IG5hbWUsIHZlcnNpb259O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVybmFsRGF0YTxFeHRUeXBlPn0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKGFwcGl1bVBrZ0RhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge1VuaW5zdGFsbE9wdHN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRSZWNvcmQ8RXh0VHlwZT4+fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIHVuaW5zdGFsbCAoe2V4dH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdW5pbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9JzsgaXQgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsUGF0aCA9IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihpbnN0YWxsUGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uVXBkYXRlUmVzdWx0Pn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAoe2V4dCwgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGV4dCA9PT0gVVBEQVRFX0FMTDtcbiAgICAvLyBpZiB3ZSdyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyBhbiB1cGRhdGUgZm9yIGFuIGV4dGVuc2lvbiwgbWFrZSBzdXJlIGl0J3MgaW5zdGFsbGVkXG4gICAgaWYgKCFzaG91bGRVcGRhdGVBbGwgJiYgIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtleHR9JyB3YXMgbm90IGluc3RhbGxlZCwgc28gY2FuJ3QgYmUgdXBkYXRlZGApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGwgPyBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKSA6IFtleHRdO1xuXG4gICAgLy8gJ2Vycm9ycycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCBlcnJvciBvYmplY3RzIGFzIHZhbHVlc1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFcnJvcj59ICovXG4gICAgY29uc3QgZXJyb3JzID0ge307XG5cbiAgICAvLyAndXBkYXRlcycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCB1cGRhdGUgb2JqZWN0cyBhcyB2YWx1ZXMsIHdoZXJlIGFuIHVwZGF0ZVxuICAgIC8vIG9iamVjdCBpcyBvZiB0aGUgZm9ybSB7ZnJvbTogdmVyc2lvblN0cmluZywgdG86IHZlcnNpb25TdHJpbmd9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59ICovXG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIGV4dHNUb1VwZGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIGlzIHVwZGF0YWJsZWAsICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tlXS5pbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFVwZGF0YWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGUpO1xuICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsICdVcGRhdGUgcmVwb3J0OicpO1xuICAgIGZvciAoY29uc3QgW2UsIHVwZGF0ZV0gb2YgXy50b1BhaXJzKHVwZGF0ZXMpKSB7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICR7dGhpcy50eXBlfSAke2V9IHVwZGF0ZWQ6ICR7dXBkYXRlLmZyb219ID0+ICR7dXBkYXRlLnRvfWAuZ3JlZW4pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtlLCBlcnJdIG9mIF8udG9QYWlycyhlcnJvcnMpKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90VXBkYXRhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgdXBkYXRlc2AueWVsbG93KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgaGFkIG5vIHVwZGF0ZXMgYXZhaWxhYmxlYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBtYWtlIGl0IHBvcCB3aXRoIHJlZCFcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgZmFpbGVkIHRvIHVwZGF0ZTogJHtlcnJ9YC5yZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dXBkYXRlcywgZXJyb3JzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3NzaWJsZVVwZGF0ZXM+fVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0VmVyc2lvbih0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwgdmVyc2lvbik7XG4gICAgaWYgKCF1dGlsLmNvbXBhcmVWZXJzaW9ucyh1bnNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24sIHNvIHRoZXJlJ3Mgbm8gcG9zc2libGUgdXBkYXRlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh1bnNhZmVVcGRhdGUgJiYgdW5zYWZlVXBkYXRlID09PSBzYWZlVXBkYXRlKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHVwZGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2FmZSB1cGRhdGUsIHdoaWNoIG1lYW5zIGl0J3Mgbm90IGFjdHVhbGx5IHVuc2FmZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHNhZmVVcGRhdGUgJiYgIXV0aWwuY29tcGFyZVZlcnNpb25zKHNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIGV2ZW4gdGhlIHNhZmUgdXBkYXRlIGlzIG5vdCBsYXRlciB0aGFuIHRoZSBjdXJyZW50LCBzbyBpdCBpcyBub3QgYWN0dWFsbHkgYW4gdXBkYXRlXG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtjdXJyZW50OiB2ZXJzaW9uLCBzYWZlVXBkYXRlLCB1bnNhZmVVcGRhdGV9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IHVwZGF0ZSBhbiBleHRlbnNpb24gaW5zdGFsbGVkIGJ5IE5QTSwgdXNpbmcgdGhlIE5QTSBjbGkuIEFuZCB1cGRhdGUgdGhlIGluc3RhbGxhdGlvblxuICAgKiBtYW5pZmVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHQsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF07XG4gICAgYXdhaXQgZnMucmltcmFmKHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCkpO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyOiB2ZXJzaW9ufSk7XG4gICAgZGVsZXRlIGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihleHQsIGV4dERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzY3JpcHQgY2FjaGVkIGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIlxuICAgKiBpbnNpZGUgb2YgdGhlIGRyaXZlci9wbHVnaW5zIFwicGFja2FnZS5qc29uXCIgZmlsZS4gV2lsbCB0aHJvd1xuICAgKiBhbiBlcnJvciBpZiB0aGUgZHJpdmVyL3BsdWdpbiBkb2VzIG5vdCBjb250YWluIGEgXCJzY3JpcHRzXCIgZmllbGRcbiAgICogdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uLCBpZiB0aGVcbiAgICogXCJzY3JpcHRzXCIgZmllbGQgaXMgbm90IGEgcGxhaW4gb2JqZWN0LCBvciBpZiB0aGUgc2NyaXB0TmFtZSBpc1xuICAgKiBub3QgZm91bmQgd2l0aGluIFwic2NyaXB0c1wiIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtSdW5PcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UnVuT3V0cHV0Pn1cbiAgICovXG4gIGFzeW5jIHJ1biAoe2V4dCwgc2NyaXB0TmFtZX0pIHtcbiAgICBpZiAoIV8uaGFzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMsIGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGxlYXNlIGluc3RhbGwgdGhlICR7dGhpcy50eXBlfSBmaXJzdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dENvbmZpZyA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgZG9lcyBub3QgY29udGFpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFwic2NyaXB0c1wiIGZpZWxkIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbmApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgXCJzY3JpcHRzXCIgZmllbGQgbXVzdCBiZSBhIHBsYWluIG9iamVjdGApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY3JpcHQ6ICcke3NjcmlwdE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtcbiAgICAgIGV4dFNjcmlwdHNbc2NyaXB0TmFtZV1cbiAgICBdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdXBkYXRlVmVyc2lvbl0gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt1bnNhZmVVcGRhdGVWZXJzaW9uXSAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXBUb0RhdGVdIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoZSBsYXRlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL21hbmlmZXN0JykuRXh0UmVjb3JkPEV4dFR5cGU+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL21hbmlmZXN0JykuRXh0RGF0YTxFeHRUeXBlPn0gRXh0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCAoaW1wb3J0KCcuLi9leHRlbnNpb24vbWFuaWZlc3QnKS5JbnRlcm5hbERhdGEgJiBFeHRlbnNpb25NZXRhZGF0YSkgfCB7IHBrZ05hbWU6IHN0cmluZywgaW5zdGFsbGVkOiBmYWxzZSB9Pn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLnJ1bn1cbiAqXG4gKiBAdHlwZWRlZiBSdW5PdXRwdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JdIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQudXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvbiBib3VuZGFyaWVzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLnVwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC51cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC51bmluc3RhbGx9LlxuICogQHR5cGVkZWYgVW5pbnN0YWxsT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0UG9zdEluc3RhbGxUZXh0fVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsVmlhTnBtfVxuICogQHR5cGVkZWYgSW5zdGFsbFZpYU5wbUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICovXG5cbi8qKlxuICogT2JqZWN0IHJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZX1cbiAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cbiJdfQ==
|
|
476
|
+
exports.ExtensionCommand = ExtensionCommand;
|
|
477
|
+
var _default = ExtensionCommand;
|
|
478
|
+
exports.default = _default;
|
|
479
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25maWciLCJrbm93bkV4dGVuc2lvbnMiLCJpc0pzb25PdXRwdXQiLCJjb25zdHJ1Y3RvciIsImpzb24iLCJ0eXBlIiwiZXh0ZW5zaW9uVHlwZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwibGlzdERhdGEiLCJpbnN0YWxsVHh0IiwiZ3JleSIsInVwZGF0ZVR4dCIsInVwVG9EYXRlVHh0IiwidW5zYWZlVXBkYXRlVHh0IiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImdyZWVuIiwiY3lhbiIsImNvbnNvbGUiLCJsb2ciLCJfaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJwYXRoIiwiaXNBYnNvbHV0ZSIsInJlc29sdmUiLCJzcGxpdHMiLCJtc2ciLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiZXh0TWFuaWZlc3QiLCJhZGRFeHRlbnNpb24iLCJlbnYiLCJoYXNBcHBpdW1EZXBlbmRlbmN5IiwiYXBwaXVtSG9tZSIsImdldFBvc3RJbnN0YWxsVGV4dCIsIm5wbVNwZWMiLCJzcGVjTXNnIiwicGtnSnNvbkRhdGEiLCJucG0iLCJpbnN0YWxsUGFja2FnZSIsImdldEV4dGVuc2lvbkZpZWxkcyIsImVyciIsIm1lc3NhZ2UiLCJhcHBpdW0iLCJ2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyIsInJlc3VsdCIsImFwcGl1bVBrZ0RhdGEiLCJfdW5pbnN0YWxsIiwiaW5zdGFsbFBhdGgiLCJnZXRJbnN0YWxsUGF0aCIsImZzIiwicmltcmFmIiwicmVtb3ZlRXh0ZW5zaW9uIiwiX3VwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJ1cGRhdGUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJfcnVuIiwic2NyaXB0TmFtZSIsImhhcyIsImV4dENvbmZpZyIsInNjcmlwdHMiLCJleHRTY3JpcHRzIiwiaXNQbGFpbk9iamVjdCIsInJ1bm5lciIsIlN1YlByb2Nlc3MiLCJwcm9jZXNzIiwiZXhlY1BhdGgiLCJjd2QiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0Iiwiam9pbiIsImdldEJ1ZmYiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7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LEVBQUVBLE1BQU0sQ0FBQ08sT0FBUDtBQUFULE9BQVA7QUFDRCxLQUpELENBSUUsT0FBT2hELEdBQVAsRUFBWTtBQUNaLHNCQUFJLEtBQUt2RixZQUFULEVBQXdCLHNDQUFxQ3FILFVBQVcsTUFBSzlCLEdBQUcsQ0FBQ0MsT0FBUSxFQUFsRSxDQUFvRXVCLEdBQTNGO0FBQ0EsYUFBTztBQUFDeUIsUUFBQUEsS0FBSyxFQUFFakQsR0FBRyxDQUFDQyxPQUFaO0FBQXFCd0MsUUFBQUEsTUFBTSxFQUFFQSxNQUFNLENBQUNPLE9BQVA7QUFBN0IsT0FBUDtBQUNEO0FBQ0Y7O0FBOWZvQjs7O2VBaWdCUjFJLGdCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBucG0sIGZzLCB1dGlsLCBlbnYgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgbG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgcGFja2FnZURpZENoYW5nZSB9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb259KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHRlbnNpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbih0aGlzW2NtZF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiBMaXN0T3B0aW9uc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIExpc3QgZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uTGlzdERhdGE+fSBtYXAgb2YgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBsaXN0ICh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgIGlmICghYWNjW25hbWVdKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHsuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IHRydWV9O1xuICAgICAgICB9IGVsc2UgaWYgKCFzaG93SW5zdGFsbGVkKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0ge3BrZ05hbWU6IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRoaXMgYWNjdW11bGF0b3IgY29udGFpbnMgZWl0aGVyIHtAbGlua2NvZGUgVW5pbnN0YWxsZWRFeHRlbnNpb25MSXN0RGF0YX0gX29yX1xuICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsUGFydGlhbDxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT58VW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT59XG4gICAgICovKHt9KSk7XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIHNob3cgd2hldGhlciB1cGRhdGVzIGFyZSBhdmFpbGFibGUsIHB1dCB0aGF0IGJlaGluZCBhIHNwaW5uZXJcbiAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbHNNc2csIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbZXh0LCBkYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgICAgaWYgKCFkYXRhLmluc3RhbGxlZCB8fCBkYXRhLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBleHRzIHRoYXQgYXJlbid0IGluc3RhbGxlZFxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBub24tbnBtIGV4dHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVzID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpO1xuICAgICAgICBkYXRhLnVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudW5zYWZlVXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMudW5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVwVG9EYXRlID0gdXBkYXRlcy5zYWZlVXBkYXRlID09PSBudWxsICYmIHVwZGF0ZXMudW5zYWZlVXBkYXRlID09PSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlzdERhdGEgPSAvKiogQHR5cGUge0V4dGVuc2lvbkxpc3REYXRhfSAqLyhleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID0gZGF0YTtcbiAgICAgICAgbGV0IHR5cGVUeHQ7XG4gICAgICAgIHN3aXRjaCAoaW5zdGFsbFR5cGUpIHtcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUSFVCOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAoY2xvbmVkIGZyb20gJHtpbnN0YWxsU3BlY30pYC55ZWxsb3c7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9MT0NBTDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSBgKGxpbmtlZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAubWFnZW50YTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0eXBlVHh0ID0gJyhOUE0pJztcbiAgICAgICAgfVxuICAgICAgICBpbnN0YWxsVHh0ID0gYEAke3ZlcnNpb24ueWVsbG93fSAkeygnW2luc3RhbGxlZCAnICsgdHlwZVR4dCArICddJykuZ3JlZW59YDtcblxuICAgICAgICBpZiAoc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAodXBkYXRlVmVyc2lvbikge1xuICAgICAgICAgICAgdXBkYXRlVHh0ID0gYCBbJHt1cGRhdGVWZXJzaW9ufSBhdmFpbGFibGVdYC5tYWdlbnRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXBUb0RhdGUpIHtcbiAgICAgICAgICAgIHVwVG9EYXRlVHh0ID0gYCBbVXAgdG8gZGF0ZV1gLmdyZWVuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodW5zYWZlVXBkYXRlVmVyc2lvbikge1xuICAgICAgICAgICAgdW5zYWZlVXBkYXRlVHh0ID0gYCBbJHt1bnNhZmVVcGRhdGVWZXJzaW9ufSBhdmFpbGFibGUgKHBvdGVudGlhbGx5IHVuc2FmZSldYC5jeWFuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIGxldCBleHREYXRhO1xuICAgIGxldCBpbnN0YWxsU3BlYyA9IGV4dDtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgY2Fubm90IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmICghcGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUJdLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBtdXN0IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0aHViICR7dGhpcy50eXBlfSBzcGVjICR7aW5zdGFsbFNwZWN9IGFwcGVhcmVkIHRvIGJlIGludmFsaWQ7IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZCBiZSBvZiB0aGUgZm9ybSA8b3JnPi88cmVwbz4nKTtcbiAgICAgIH1cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwYWNrYWdlTmFtZSl9KTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8ocGFja2FnZU5hbWUpfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwa2dOYW1lLCBwa2dWZXI7XG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgICBwa2dOYW1lID0gcGF0aC5pc0Fic29sdXRlKGluc3RhbGxTcGVjKSA/IGluc3RhbGxTcGVjIDogcGF0aC5yZXNvbHZlKGluc3RhbGxTcGVjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRoZXIgYW4gbnBtIHBhY2thZ2Ugb3IgYW4gYXBwaXVtIHZlcmlmaWVkIGV4dGVuc2lvblxuICAgICAgICAvLyBuYW1lIG9yIGEgbG9jYWwgcGF0aC4gYm90aCBvZiB3aGljaCB3aWxsIGJlIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgICAgICAvLyBleHRlbnNpb25zIGluc3RhbGxlZCB2aWEgbnBtIGNhbiBpbmNsdWRlIHZlcnNpb25zIG9yIHRhZ3MgYWZ0ZXIgdGhlICdAJ1xuICAgICAgICAvLyBzaWduLCBzbyBjaGVjayBmb3IgdGhhdC4gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCBwYWNrYWdlIG5hbWVzIHRoZW1zZWx2ZXMgY2FuXG4gICAgICAgIC8vIGNvbnRhaW4gdGhlICdAJyBzeW1ib2wsIGFzIGluIGBucG0gaW5zdGFsbCBAYXBwaXVtL2Zha2UtZHJpdmVyQDEuMi4wYFxuICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgY29uc3Qgc3BsaXRzID0gaW5zdGFsbFNwZWMuc3BsaXQoJ0AnKTtcbiAgICAgICAgaWYgKGluc3RhbGxTcGVjWzBdID09PSAnQCcpIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gbnBtIG9yZyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBbYEAke3NwbGl0c1sxXX1gLCBzcGxpdHNbMl1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aG91dCBhbiBucG0gb3JnXG4gICAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBzcGxpdHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgcGFja2FnZSBmcm9tIG5wbSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVja1xuICAgICAgICAgIC8vIGFnYWluc3QgdGhlIGFwcGl1bSBleHRlbnNpb24gbGlzdDsganVzdCB1c2UgdGhlIGluc3RhbGxTcGVjIGFzIGlzXG4gICAgICAgICAgcGtnTmFtZSA9IG5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIGFwcGl1bSBkcml2ZXIgKGxpa2UgJ3hjdWl0ZXN0Jykgd2UgbmVlZCB0b1xuICAgICAgICAgIC8vIGRlcmVmZXJlbmNlIHRoZSBhY3R1YWwgbnBtIHBhY2thZ2UgKCdhcHBpdXBtLXhjdWl0ZXN0LWRyaXZlcicpLCBzb1xuICAgICAgICAgIC8vIGNoZWNrIGl0IGV4aXN0cyBhbmQgZ2V0IHRoZSBjb3JyZWN0IHBhY2thZ2VcbiAgICAgICAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgICAgICAgIGlmICghXy5pbmNsdWRlcyhrbm93bk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCByZXNvbHZlICR7dGhpcy50eXBlfTsgYXJlIHlvdSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TmFtZSA9IGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhgJHt0aGlzLnR5cGV9TmFtZWApXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TWFuaWZlc3QgPSB7Li4uZXh0RGF0YSwgaW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjfTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtICh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgbnBtU3BlYyA9IGAke3BrZ05hbWV9JHtwa2dWZXIgPyAnQCcgKyBwa2dWZXIgOiAnJ31gO1xuICAgIGNvbnN0IHNwZWNNc2cgPSBucG1TcGVjID09PSBleHQgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2V4dH0nJHtzcGVjTXNnfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCBucG0uaW5zdGFsbFBhY2thZ2UodGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwge1xuICAgICAgICAgIHBrZ1ZlclxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbkRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dCAoYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbkRhdGEgLSB0aGUgcGFja2FnZS5qc29uIGRhdGEgZm9yIGEgZHJpdmVyIG1vZHVsZSwgYXMgaWYgaXQgaGFkIGJlZW5cbiAgICogc3RyYWlnaHRmb3J3YXJkbHkgJ3JlcXVpcmUnZFxuICAgKiBAcmV0dXJucyB7RXh0ZW5zaW9uRmllbGRzPEV4dFR5cGU+fVxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uRmllbGRzIChwa2dKc29uRGF0YSkge1xuICAgIGlmICghcGtnSnNvbkRhdGEuYXBwaXVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RhbGxlZCBkcml2ZXIgZGlkIG5vdCBoYXZlIGFuICdhcHBpdW0nIHNlY3Rpb24gaW4gaXRzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBwYWNrYWdlLmpzb24gZmlsZSBhcyBleHBlY3RlZGApO1xuICAgIH1cbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IHBrZ0pzb25EYXRhO1xuICAgIHRoaXMudmFsaWRhdGVFeHRlbnNpb25GaWVsZHMoYXBwaXVtKTtcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgY29uc3QgcmVzdWx0ID0gey4uLmFwcGl1bSwgcGtnTmFtZTogbmFtZSwgdmVyc2lvbn07XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RXh0ZW5zaW9uRmllbGRzPEV4dFR5cGU+fSAqLyhyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKGFwcGl1bVBrZ0RhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgX3VuaW5zdGFsbCAoe2V4dH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdW5pbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9JzsgaXQgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsUGF0aCA9IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihpbnN0YWxsUGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uVXBkYXRlUmVzdWx0Pn1cbiAgICovXG4gIGFzeW5jIF91cGRhdGUgKHtleHQsIHVuc2FmZX0pIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbGwgPSBleHQgPT09IFVQREFURV9BTEw7XG4gICAgLy8gaWYgd2UncmUgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgYW4gdXBkYXRlIGZvciBhbiBleHRlbnNpb24sIG1ha2Ugc3VyZSBpdCdzIGluc3RhbGxlZFxuICAgIGlmICghc2hvdWxkVXBkYXRlQWxsICYmICF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZXh0fScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgKTtcbiAgICB9XG4gICAgY29uc3QgZXh0c1RvVXBkYXRlID0gc2hvdWxkVXBkYXRlQWxsID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykgOiBbZXh0XTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBuZWVkcyBhbiB1cGRhdGVgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICBpZiAoISh1cGRhdGUuc2FmZVVwZGF0ZSB8fCB1cGRhdGUudW5zYWZlVXBkYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXVuc2FmZSAmJiAhdXBkYXRlLnNhZmVVcGRhdGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZX0nIGhhcyBhIG1ham9yIHJldmlzaW9uIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCgke3VwZGF0ZS5jdXJyZW50fSA9PiAke3VwZGF0ZS51bnNhZmVVcGRhdGV9KSwgd2hpY2ggY291bGQgaW5jbHVkZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSB3YW50IHRvIGFwcGx5IHRoaXMgdXBkYXRlLCByZS1ydW4gd2l0aCAtLXVuc2FmZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZlciA9IHVuc2FmZSAmJiB1cGRhdGUudW5zYWZlVXBkYXRlID8gdXBkYXRlLnVuc2FmZVVwZGF0ZSA6IHVwZGF0ZS5zYWZlVXBkYXRlO1xuICAgICAgICBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgVXBkYXRpbmcgZHJpdmVyICcke2V9JyBmcm9tICR7dXBkYXRlLmN1cnJlbnR9IHRvICR7dXBkYXRlVmVyfWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy51cGRhdGVFeHRlbnNpb24oZSwgdXBkYXRlVmVyKVxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVzW2VdID0ge2Zyb206IHVwZGF0ZS5jdXJyZW50LCB0bzogdXBkYXRlVmVyfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcnNbZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCAnVXBkYXRlIHJlcG9ydDonKTtcbiAgICBmb3IgKGNvbnN0IFtlLCB1cGRhdGVdIG9mIF8udG9QYWlycyh1cGRhdGVzKSkge1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAke3RoaXMudHlwZX0gJHtlfSB1cGRhdGVkOiAke3VwZGF0ZS5mcm9tfSA9PiAke3VwZGF0ZS50b31gLmdyZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIHdhcyBub3QgaW5zdGFsbGVkIHZpYSBucG0sIHNvIHdlIGNvdWxkIG5vdCBjaGVjayBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yIHVwZGF0ZXNgLnllbGxvdyk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3VwZGF0ZXMsIGVycm9yc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGZpZ3VyZSBvdXQgd2hhdCBpdHMgaGlnaGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVwZ3JhZGUgaXMsIGFuZCBhbHNvIHRoZVxuICAgKiBoaWdoZXN0IHBvc3NpYmxlIHNhZmUgdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UG9zc2libGVVcGRhdGVzPn1cbiAgICovXG4gIGFzeW5jIGNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIChleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHZlcnNpb24pO1xuICAgIGlmICghdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dCwgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgY29uc3QgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8oYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgYXdhaXQgdGhpcy5jb25maWcudXBkYXRlRXh0ZW5zaW9uKGV4dCwgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1biAoe2V4dCwgc2NyaXB0TmFtZX0pIHtcbiAgICBpZiAoIV8uaGFzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMsIGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGxlYXNlIGluc3RhbGwgdGhlICR7dGhpcy50eXBlfSBmaXJzdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dENvbmZpZyA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgZG9lcyBub3QgY29udGFpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFwic2NyaXB0c1wiIGZpZWxkIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbmApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgXCJzY3JpcHRzXCIgZmllbGQgbXVzdCBiZSBhIHBsYWluIG9iamVjdGApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY3JpcHQ6ICcke3NjcmlwdE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtcbiAgICAgIGV4dFNjcmlwdHNbc2NyaXB0TmFtZV1cbiAgICBdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4dGVuc2lvbkNvbW1hbmQ7XG5leHBvcnQge0V4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmR9IGNvbnN0cnVjdG9yXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkNvbW1hbmRPcHRpb25zXG4gKiBAcHJvcGVydHkge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnIC0gdGhlIGBEcml2ZXJDb25maWdgIG9yIGBQbHVnaW5Db25maWdgIGluc3RhbmNlIHVzZWQgZm9yIHRoaXMgY29tbWFuZFxuICogQHByb3BlcnR5IHtib29sZWFufSBqc29uIC0gd2hldGhlciB0aGUgb3V0cHV0IG9mIHRoaXMgY29tbWFuZCBzaG91bGQgYmUgSlNPTiBvciB0ZXh0XG4gKi9cblxuLyoqXG4gKiBFeHRyYSBzdHVmZiBhYm91dCBleHRlbnNpb25zOyB1c2VkIGluZGlyZWN0bHkgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9LlxuICpcbiAqIEB0eXBlZGVmIEV4dGVuc2lvbk1ldGFkYXRhXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGluc3RhbGxlZCAtIElmIGB0cnVlYCwgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdXBkYXRlVmVyc2lvbiAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkLCB0aGUgdmVyc2lvbiBpdCBjYW4gYmUgdXBkYXRlZCB0b1xuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1bnNhZmVVcGRhdGVWZXJzaW9uIC0gU2FtZSBhcyBhYm92ZSwgYnV0IGEgbWFqb3IgdmVyc2lvbiBidW1wXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVwVG9EYXRlIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoZSBsYXRlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPEV4dFR5cGU+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnKS5FeHRlbnNpb25Db25maWc8RXh0VHlwZT59IEV4dGVuc2lvbkNvbmZpZ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkV4dE1ldGFkYXRhPEV4dFR5cGU+fSBFeHRNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHRNYW5pZmVzdDxFeHRUeXBlPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZXJuYWwtbWFuaWZlc3QnKS5FeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gRXh0UGFja2FnZUpzb25cbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiBVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZVxuICogQHByb3BlcnR5IHtmYWxzZX0gaW5zdGFsbGVkXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuSW50ZXJuYWxNZXRhZGF0YSAmIEV4dGVuc2lvbk1ldGFkYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGE+fSBFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59XG4gKlxuICogQHR5cGVkZWYgUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSAtIGVycm9yIG1lc3NhZ2UgaWYgc2NyaXB0IHJhbiB1bnN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3V0cHV0IC0gc2NyaXB0IG91dHB1dFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uIGJvdW5kYXJpZXNcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIFVwZGF0ZVJlcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHRvXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VuaW5zdGFsbH0uXG4gKiBAdHlwZWRlZiBVbmluc3RhbGxPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gKi9cblxuLyoqXG4gKiBVc2VkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5nZXRQb3N0SW5zdGFsbFRleHR9XG4gKiBAdHlwZWRlZiBFeHRlbnNpb25BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtvYmplY3R9IGV4dERhdGEgLSB0aGUgZGF0YSBmb3IgYW4gaW5zdGFsbGVkIGV4dGVuc2lvblxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmluc3RhbGxWaWFOcG19XG4gKiBAdHlwZWRlZiBJbnN0YWxsVmlhTnBtQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlfVxuICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuSW5zdGFsbFR5cGV9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICovXG5cbi8qKlxuICogUmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldEV4dGVuc2lvbkZpZWxkc31cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dE1ldGFkYXRhPEV4dFR5cGU+ICYgeyBwa2dOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyB9ICYgaW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkNvbW1vbk1ldGFkYXRhfSBFeHRlbnNpb25GaWVsZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fRFJJVkVSUyA6IEV4dFR5cGUgZXh0ZW5kcyBQbHVnaW5UeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOUyA6IG5ldmVyfSBLbm93bkV4dGVuc2lvbnNcbiAqL1xuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ExtCommand<ExtType extends import("../../types").ExtensionType> = ExtType extends import('../../types').DriverType ? import('@appium/types').Class<DriverCommand> : ExtType extends import('../../types').PluginType ? import('@appium/types').Class<PluginCommand> : never;
|
|
2
|
+
/**
|
|
3
|
+
* Run a subcommand of the 'appium driver' type. Each subcommand has its own set of arguments which
|
|
4
|
+
* can be represented as a JS object.
|
|
5
|
+
*
|
|
6
|
+
* @param {Object} args - JS object where the key is the parameter name (as defined in
|
|
7
|
+
* driver-parser.js)
|
|
8
|
+
* @template {import('../extension/manifest').ExtensionType} ExtType
|
|
9
|
+
* @param {import('../extension/extension-config').ExtensionConfig<ExtType>} configObject - Extension config object
|
|
10
|
+
*/
|
|
11
|
+
export function runExtensionCommand<ExtType extends import("../../types").ExtensionType>(args: any, configObject: import("../extension/extension-config").ExtensionConfig<ExtType>): Promise<any>;
|
|
12
|
+
import DriverCommand from "./driver-command";
|
|
13
|
+
import PluginCommand from "./plugin-command";
|
|
14
|
+
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../lib/cli/extension.js"],"names":[],"mappings":"8EA+Da,OAAO,SAAS,OAAO,aAAa,EAAE,UAAU,GAAG,OAAO,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,SAAS,OAAO,aAAa,EAAE,UAAU,GAAG,OAAO,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK;AAnDtN;;;;;;;;GAQG;AACH,kMAkCC"}
|
|
@@ -17,6 +17,11 @@ var _constants = require("../constants");
|
|
|
17
17
|
|
|
18
18
|
var _utils = require("./utils");
|
|
19
19
|
|
|
20
|
+
const commandClasses = Object.freeze({
|
|
21
|
+
[_constants.DRIVER_TYPE]: _driverCommand.default,
|
|
22
|
+
[_constants.PLUGIN_TYPE]: _pluginCommand.default
|
|
23
|
+
});
|
|
24
|
+
|
|
20
25
|
async function runExtensionCommand(args, configObject) {
|
|
21
26
|
let jsonResult = null;
|
|
22
27
|
const {
|
|
@@ -41,7 +46,7 @@ async function runExtensionCommand(args, configObject) {
|
|
|
41
46
|
|
|
42
47
|
let config = configObject;
|
|
43
48
|
config.log = logFn;
|
|
44
|
-
const CommandClass = type
|
|
49
|
+
const CommandClass = commandClasses[type];
|
|
45
50
|
const cmd = new CommandClass({
|
|
46
51
|
config,
|
|
47
52
|
json
|
|
@@ -63,4 +68,4 @@ async function runExtensionCommand(args, configObject) {
|
|
|
63
68
|
|
|
64
69
|
return jsonResult;
|
|
65
70
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRDbGFzc2VzIiwiT2JqZWN0IiwiZnJlZXplIiwiRFJJVkVSX1RZUEUiLCJEcml2ZXJDb21tYW5kIiwiUExVR0lOX1RZUEUiLCJQbHVnaW5Db21tYW5kIiwicnVuRXh0ZW5zaW9uQ29tbWFuZCIsImFyZ3MiLCJjb25maWdPYmplY3QiLCJqc29uUmVzdWx0IiwiZXh0ZW5zaW9uVHlwZSIsInR5cGUiLCJleHRDbWQiLCJUeXBlRXJyb3IiLCJqc29uIiwic3VwcHJlc3NPdXRwdXQiLCJsb2dGbiIsIm1zZyIsImNvbmZpZyIsImxvZyIsIkNvbW1hbmRDbGFzcyIsImNtZCIsImV4ZWN1dGUiLCJlcnIiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIkpTT05fU1BBQ0VTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQW1DO0FBQ3hELEdBQUNDLHNCQUFELEdBQWVDLHNCQUR5QztBQUV4RCxHQUFDQyxzQkFBRCxHQUFlQztBQUZ5QyxDQUFuQyxDQUF2Qjs7QUFjQSxlQUFlQyxtQkFBZixDQUFvQ0MsSUFBcEMsRUFBMENDLFlBQTFDLEVBQXdEO0FBR3RELE1BQUlDLFVBQVUsR0FBRyxJQUFqQjtBQUNBLFFBQU07QUFBQ0MsSUFBQUEsYUFBYSxFQUFFQztBQUFoQixNQUF3QkgsWUFBOUI7QUFDQSxRQUFNSSxNQUFNLEdBQUdMLElBQUksQ0FBRSxHQUFFSSxJQUFLLFNBQVQsQ0FBbkI7O0FBQ0EsTUFBSSxDQUFDQyxNQUFMLEVBQWE7QUFDWCxVQUFNLElBQUlDLFNBQUosQ0FBZSxlQUFjRixJQUFLLDhDQUFsQyxDQUFOO0FBQ0Q7O0FBQ0QsTUFBSTtBQUFDRyxJQUFBQSxJQUFEO0FBQU9DLElBQUFBO0FBQVAsTUFBeUJSLElBQTdCOztBQUNBLE1BQUlRLGNBQUosRUFBb0I7QUFDbEJELElBQUFBLElBQUksR0FBRyxJQUFQO0FBQ0Q7O0FBQ0QsUUFBTUUsS0FBSyxHQUFJQyxHQUFELElBQVMsZ0JBQUlILElBQUosRUFBVUcsR0FBVixDQUF2Qjs7QUFDQSxNQUFJQyxNQUFNLEdBQUdWLFlBQWI7QUFDQVUsRUFBQUEsTUFBTSxDQUFDQyxHQUFQLEdBQWFILEtBQWI7QUFDQSxRQUFNSSxZQUFZLEdBQXNDckIsY0FBYyxDQUFDWSxJQUFELENBQXRFO0FBQ0EsUUFBTVUsR0FBRyxHQUFHLElBQUlELFlBQUosQ0FBaUI7QUFBQ0YsSUFBQUEsTUFBRDtBQUFTSixJQUFBQTtBQUFULEdBQWpCLENBQVo7O0FBQ0EsTUFBSTtBQUNGTCxJQUFBQSxVQUFVLEdBQUcsTUFBTVksR0FBRyxDQUFDQyxPQUFKLENBQVlmLElBQVosQ0FBbkI7QUFDRCxHQUZELENBRUUsT0FBT2dCLEdBQVAsRUFBWTtBQUdaLFFBQUlSLGNBQUosRUFBb0I7QUFDbEIsWUFBTVEsR0FBTjtBQUNEOztBQUNELDJCQUFXVCxJQUFYLEVBQWlCUyxHQUFqQjtBQUNEOztBQUVELE1BQUlULElBQUksSUFBSSxDQUFDQyxjQUFiLEVBQTZCO0FBQzNCUyxJQUFBQSxPQUFPLENBQUNMLEdBQVIsQ0FBWU0sSUFBSSxDQUFDQyxTQUFMLENBQWVqQixVQUFmLEVBQTJCLElBQTNCLEVBQWlDa0Isa0JBQWpDLENBQVo7QUFDRDs7QUFFRCxTQUFPbEIsVUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5pbXBvcnQgRHJpdmVyQ29tbWFuZCBmcm9tICcuL2RyaXZlci1jb21tYW5kJztcbmltcG9ydCBQbHVnaW5Db21tYW5kIGZyb20gJy4vcGx1Z2luLWNvbW1hbmQnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGVyckFuZFF1aXQsIGxvZywgSlNPTl9TUEFDRVMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgY29tbWFuZENsYXNzZXMgPSBPYmplY3QuZnJlZXplKC8qKiBAdHlwZSB7Y29uc3R9ICovKHtcbiAgW0RSSVZFUl9UWVBFXTogRHJpdmVyQ29tbWFuZCxcbiAgW1BMVUdJTl9UWVBFXTogUGx1Z2luQ29tbWFuZFxufSkpO1xuXG4vKipcbiAqIFJ1biBhIHN1YmNvbW1hbmQgb2YgdGhlICdhcHBpdW0gZHJpdmVyJyB0eXBlLiBFYWNoIHN1YmNvbW1hbmQgaGFzIGl0cyBvd24gc2V0IG9mIGFyZ3VtZW50cyB3aGljaFxuICogY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgSlMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gSlMgb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgdGhlIHBhcmFtZXRlciBuYW1lIChhcyBkZWZpbmVkIGluXG4gKiBkcml2ZXItcGFyc2VyLmpzKVxuICogQHRlbXBsYXRlIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnT2JqZWN0IC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRXh0ZW5zaW9uQ29tbWFuZCAoYXJncywgY29uZmlnT2JqZWN0KSB7XG4gIC8vIFRPRE8gZHJpdmVyIGNvbmZpZyBmaWxlIHNob3VsZCBiZSBsb2NrZWQgd2hpbGUgYW55IG9mIHRoZXNlIGNvbW1hbmRzIGFyZVxuICAvLyBydW5uaW5nIHRvIHByZXZlbnQgd2VpcmQgc2l0dWF0aW9uc1xuICBsZXQganNvblJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IHtleHRlbnNpb25UeXBlOiB0eXBlfSA9IGNvbmZpZ09iamVjdDtcbiAgY29uc3QgZXh0Q21kID0gYXJnc1tgJHt0eXBlfUNvbW1hbmRgXTtcbiAgaWYgKCFleHRDbWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgY2FsbCAke3R5cGV9IGNvbW1hbmQgd2l0aG91dCBhIHN1YmNvbW1hbmQgbGlrZSAnaW5zdGFsbCdgKTtcbiAgfVxuICBsZXQge2pzb24sIHN1cHByZXNzT3V0cHV0fSA9IGFyZ3M7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGxvZ0ZuID0gKG1zZykgPT4gbG9nKGpzb24sIG1zZyk7XG4gIGxldCBjb25maWcgPSBjb25maWdPYmplY3Q7XG4gIGNvbmZpZy5sb2cgPSBsb2dGbjtcbiAgY29uc3QgQ29tbWFuZENsYXNzID0gLyoqIEB0eXBlIHtFeHRDb21tYW5kPEV4dFR5cGU+fSAqLyhjb21tYW5kQ2xhc3Nlc1t0eXBlXSk7XG4gIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kQ2xhc3Moe2NvbmZpZywganNvbn0pO1xuICB0cnkge1xuICAgIGpzb25SZXN1bHQgPSBhd2FpdCBjbWQuZXhlY3V0ZShhcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaW4gdGhlIHN1cHByZXNzIG91dHB1dCBjYXNlLCB3ZSBhcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGludGVybmFsbHkgYW5kIHNob3VsZFxuICAgIC8vIGp1c3QgdGhyb3cgaW5zdGVhZCBvZiBwcmludGluZyBhbiBlcnJvciBhbmQgZW5kaW5nIHRoZSBwcm9jZXNzXG4gICAgaWYgKHN1cHByZXNzT3V0cHV0KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGVyckFuZFF1aXQoanNvbiwgZXJyKTtcbiAgfVxuXG4gIGlmIChqc29uICYmICFzdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGpzb25SZXN1bHQsIG51bGwsIEpTT05fU1BBQ0VTKSk7XG4gIH1cblxuICByZXR1cm4ganNvblJlc3VsdDtcbn1cblxuZXhwb3J0IHtcbiAgcnVuRXh0ZW5zaW9uQ29tbWFuZCxcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBpbXBvcnQoJy4uLy4uL3R5cGVzJykuRHJpdmVyVHlwZSA/IGltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNsYXNzPERyaXZlckNvbW1hbmQ+IDogRXh0VHlwZSBleHRlbmRzIGltcG9ydCgnLi4vLi4vdHlwZXMnKS5QbHVnaW5UeXBlID8gaW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8UGx1Z2luQ29tbWFuZD4gOiBuZXZlcn0gRXh0Q29tbWFuZFxuICovXG4iXX0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a {@link ArgParser} instance; finalizes the config schema.
|
|
3
|
+
*
|
|
4
|
+
* @constructs ArgParser
|
|
5
|
+
* @param {boolean} [debug] - If `true`, throw instead of exit upon parsing error
|
|
6
|
+
* @returns {ArgParser}
|
|
7
|
+
*/
|
|
8
|
+
export function getParser(debug?: boolean | undefined): ArgParser;
|
|
9
|
+
/**
|
|
10
|
+
* A wrapper around `argparse`
|
|
11
|
+
*
|
|
12
|
+
* - Handles instantiation, configuration, and monkeypatching of an
|
|
13
|
+
* `ArgumentParser` instance for Appium server and its extensions
|
|
14
|
+
* - Handles error conditions, messages, and exit behavior
|
|
15
|
+
*/
|
|
16
|
+
export class ArgParser {
|
|
17
|
+
/**
|
|
18
|
+
* Given an object full of arguments as returned by `argparser.parse_args`,
|
|
19
|
+
* expand the ones for extensions into a nested object structure and rename
|
|
20
|
+
* keys to match the intended destination.
|
|
21
|
+
*
|
|
22
|
+
* E.g., `{'driver-foo-bar': baz}` becomes `{driver: {foo: {bar: 'baz'}}}`
|
|
23
|
+
* @param {object} args
|
|
24
|
+
* @returns {object}
|
|
25
|
+
*/
|
|
26
|
+
static _transformParsedArgs(args: object): object;
|
|
27
|
+
/**
|
|
28
|
+
* Patches the `exit()` method of the parser to throw an error, so we can handle it manually.
|
|
29
|
+
* @param {ArgumentParser} parser
|
|
30
|
+
*/
|
|
31
|
+
static _patchExit(parser: ArgumentParser): void;
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @param {import('argparse').SubParser} subParser
|
|
35
|
+
* @returns {import('./args').ArgumentDefinitions}
|
|
36
|
+
*/
|
|
37
|
+
static _addServerToParser(subParser: import('argparse').SubParser): import('./args').ArgumentDefinitions;
|
|
38
|
+
/**
|
|
39
|
+
* Adds extension sub-sub-commands to `driver`/`plugin` subcommands
|
|
40
|
+
* @param {import('argparse').SubParser} subParsers
|
|
41
|
+
*/
|
|
42
|
+
static _addExtensionCommandsToParser(subParsers: import('argparse').SubParser): void;
|
|
43
|
+
/**
|
|
44
|
+
* @param {boolean} [debug] - If true, throw instead of exit on error.
|
|
45
|
+
*/
|
|
46
|
+
constructor(debug?: boolean | undefined);
|
|
47
|
+
/**
|
|
48
|
+
* Program name (typically `appium`)
|
|
49
|
+
* @type {string}
|
|
50
|
+
*/
|
|
51
|
+
prog: string;
|
|
52
|
+
/**
|
|
53
|
+
* If `true`, throw an error on parse failure instead of printing help
|
|
54
|
+
* @type {boolean}
|
|
55
|
+
*/
|
|
56
|
+
debug: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Wrapped `ArgumentParser` instance
|
|
59
|
+
* @type {ArgumentParser}
|
|
60
|
+
*/
|
|
61
|
+
parser: ArgumentParser;
|
|
62
|
+
rawArgs: import("./args").ArgumentDefinitions;
|
|
63
|
+
/**
|
|
64
|
+
* @type {ArgParser['parseArgs']}
|
|
65
|
+
*/
|
|
66
|
+
parse_args: ArgParser['parseArgs'];
|
|
67
|
+
/**
|
|
68
|
+
* Parse arguments from the command line.
|
|
69
|
+
*
|
|
70
|
+
* If no subcommand is passed in, this method will inject the `server` subcommand.
|
|
71
|
+
*
|
|
72
|
+
* `ArgParser.prototype.parse_args` is an alias of this method.
|
|
73
|
+
* @param {string[]} [args] - Array of arguments, ostensibly from `process.argv`. Gathers args from `process.argv` if not provided.
|
|
74
|
+
* @returns {import('../../types/cli').ParsedArgs} - The parsed arguments
|
|
75
|
+
*/
|
|
76
|
+
parseArgs(args?: string[] | undefined): import('../../types/cli').ParsedArgs;
|
|
77
|
+
}
|
|
78
|
+
import { ArgumentParser } from "argparse";
|
|
79
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../lib/cli/parser.js"],"names":[],"mappings":"AA6PA;;;;;;GAMG;AACH,wDAFa,SAAS,CAMrB;AAzOD;;;;;;GAMG;AACH;IA2FE;;;;;;;;OAQG;IACH,kCAHW,MAAM,GACJ,MAAM,CAiBlB;IAED;;;OAGG;IACH,0BAFW,cAAc,QASxB;IAED;;;;OAIG;IACH,qCAHW,OAAO,UAAU,EAAE,SAAS,GAC1B,OAAO,QAAQ,EAAE,mBAAmB,CAkBhD;IAED;;;OAGG;IACH,iDAFW,OAAO,UAAU,EAAE,SAAS,QAyDtC;IAnND;;OAEG;IACH,yCAmDC;IAxCC;;;OAGG;IACH,MAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,OAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,QAFU,cAAc,CAEJ;IAcpB,8CAAyB;IAMzB;;OAEG;IACH,YAFU,SAAS,CAAC,WAAW,CAAC,CAEA;IAGlC;;;;;;;;OAQG;IACH,wCAFa,OAAO,iBAAiB,EAAE,UAAU,CAyBhD;CA4HF"}
|