appium 2.0.0-beta.2 → 2.0.0-beta.23
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/README.md +9 -9
- package/build/check-npm-pack-files.js +23 -0
- package/build/commands-yml/parse.js +319 -0
- package/build/commands-yml/validator.js +130 -0
- package/build/index.js +19 -0
- package/build/lib/appium-config.schema.json +0 -0
- package/build/lib/appium.js +160 -53
- package/build/lib/cli/args.js +115 -279
- package/build/lib/cli/driver-command.js +11 -1
- package/build/lib/cli/extension-command.js +60 -8
- package/build/lib/cli/extension.js +30 -7
- package/build/lib/cli/npm.js +43 -29
- package/build/lib/cli/parser.js +156 -89
- package/build/lib/cli/plugin-command.js +11 -1
- package/build/lib/cli/utils.js +29 -3
- package/build/lib/config-file.js +141 -0
- package/build/lib/config.js +53 -65
- package/build/lib/driver-config.js +42 -19
- package/build/lib/drivers.js +8 -4
- package/build/lib/ext-config-io.js +165 -0
- package/build/lib/extension-config.js +130 -61
- package/build/lib/grid-register.js +22 -24
- package/build/lib/logger.js +3 -3
- package/build/lib/logsink.js +11 -13
- package/build/lib/main.js +197 -77
- package/build/lib/plugin-config.js +21 -11
- package/build/lib/plugins.js +4 -2
- package/build/lib/schema/appium-config-schema.js +253 -0
- package/build/lib/schema/arg-spec.js +120 -0
- package/build/lib/schema/cli-args.js +188 -0
- package/build/lib/schema/cli-transformers.js +76 -0
- package/build/lib/schema/index.js +36 -0
- package/build/lib/schema/keywords.js +72 -0
- package/build/lib/schema/schema.js +357 -0
- package/build/lib/utils.js +44 -99
- package/build/postinstall.js +90 -0
- package/build/test/cli/cli-e2e-specs.js +221 -0
- package/build/test/cli/cli-helpers.js +86 -0
- package/build/test/cli/cli-specs.js +71 -0
- package/build/test/cli/fixtures/test-driver/package.json +27 -0
- package/build/test/cli/schema-args-specs.js +48 -0
- package/build/test/cli/schema-e2e-specs.js +47 -0
- package/build/test/config-e2e-specs.js +112 -0
- package/build/test/config-file-e2e-specs.js +209 -0
- package/build/test/config-file-specs.js +281 -0
- package/build/test/config-specs.js +159 -0
- package/build/test/driver-e2e-specs.js +435 -0
- package/build/test/driver-specs.js +321 -0
- package/build/test/ext-config-io-specs.js +181 -0
- package/build/test/extension-config-specs.js +365 -0
- package/build/test/fixtures/allow-feat.txt +5 -0
- package/build/test/fixtures/caps.json +3 -0
- package/build/test/fixtures/config/allow-insecure.txt +3 -0
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
- package/build/test/fixtures/config/appium.config.bad.json +32 -0
- package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
- package/build/test/fixtures/config/appium.config.good.js +40 -0
- package/build/test/fixtures/config/appium.config.good.json +33 -0
- package/build/test/fixtures/config/appium.config.good.yaml +30 -0
- package/build/test/fixtures/config/appium.config.invalid.json +31 -0
- package/build/test/fixtures/config/appium.config.security-array.json +5 -0
- package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
- package/build/test/fixtures/config/appium.config.security-path.json +5 -0
- package/build/test/fixtures/config/driver-fake.config.json +8 -0
- package/build/test/fixtures/config/nodeconfig.json +3 -0
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +35 -0
- package/build/test/fixtures/deny-feat.txt +5 -0
- package/build/test/fixtures/driver.schema.js +20 -0
- package/build/test/fixtures/extensions.yaml +27 -0
- package/build/test/fixtures/flattened-schema.js +504 -0
- package/build/test/fixtures/plugin.schema.js +20 -0
- package/build/test/fixtures/schema-with-extensions.js +28 -0
- package/build/test/grid-register-specs.js +74 -0
- package/build/test/helpers.js +75 -0
- package/build/test/logger-specs.js +76 -0
- package/build/test/npm-specs.js +20 -0
- package/build/test/parser-specs.js +314 -0
- package/build/test/plugin-e2e-specs.js +316 -0
- package/build/test/schema/arg-spec-specs.js +70 -0
- package/build/test/schema/cli-args-specs.js +431 -0
- package/build/test/schema/schema-specs.js +389 -0
- package/build/test/utils-specs.js +266 -0
- package/index.js +11 -0
- package/lib/appium-config.schema.json +278 -0
- package/lib/appium.js +207 -65
- package/lib/cli/args.js +174 -375
- package/lib/cli/driver-command.js +4 -0
- package/lib/cli/extension-command.js +70 -5
- package/lib/cli/extension.js +25 -5
- package/lib/cli/npm.js +86 -18
- package/lib/cli/parser.js +257 -79
- package/lib/cli/plugin-command.js +4 -0
- package/lib/cli/utils.js +21 -1
- package/lib/config-file.js +227 -0
- package/lib/config.js +84 -63
- package/lib/driver-config.js +66 -11
- package/lib/drivers.js +4 -1
- package/lib/ext-config-io.js +287 -0
- package/lib/extension-config.js +225 -67
- package/lib/grid-register.js +27 -24
- package/lib/logger.js +1 -1
- package/lib/logsink.js +10 -7
- package/lib/main.js +214 -77
- package/lib/plugin-config.js +35 -6
- package/lib/plugins.js +1 -0
- package/lib/schema/appium-config-schema.js +287 -0
- package/lib/schema/arg-spec.js +222 -0
- package/lib/schema/cli-args.js +285 -0
- package/lib/schema/cli-transformers.js +123 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +135 -0
- package/lib/schema/schema.js +577 -0
- package/lib/utils.js +42 -88
- package/package.json +55 -84
- package/postinstall.js +71 -0
- package/types/appium-config.d.ts +197 -0
- package/types/types.d.ts +201 -0
- package/CHANGELOG.md +0 -3515
- package/build/lib/cli/parser-helpers.js +0 -82
- package/lib/cli/parser-helpers.js +0 -79
|
@@ -15,10 +15,12 @@ var _npm = _interopRequireDefault(require("./npm"));
|
|
|
15
15
|
|
|
16
16
|
var _path = _interopRequireDefault(require("path"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _support = require("@appium/support");
|
|
19
19
|
|
|
20
20
|
var _utils = require("./utils");
|
|
21
21
|
|
|
22
|
+
var _teen_process = require("teen_process");
|
|
23
|
+
|
|
22
24
|
var _extensionConfig = require("../extension-config");
|
|
23
25
|
|
|
24
26
|
const UPDATE_ALL = 'installed';
|
|
@@ -278,7 +280,7 @@ class ExtensionCommand {
|
|
|
278
280
|
}
|
|
279
281
|
|
|
280
282
|
try {
|
|
281
|
-
await
|
|
283
|
+
await _support.fs.rimraf(this.config.getInstallPath(ext));
|
|
282
284
|
} finally {
|
|
283
285
|
await this.config.removeExtension(ext);
|
|
284
286
|
}
|
|
@@ -363,7 +365,7 @@ class ExtensionCommand {
|
|
|
363
365
|
let unsafeUpdate = await this.npm.getLatestVersion(pkgName);
|
|
364
366
|
let safeUpdate = await this.npm.getLatestSafeUpgradeVersion(pkgName, version);
|
|
365
367
|
|
|
366
|
-
if (!
|
|
368
|
+
if (!_support.util.compareVersions(unsafeUpdate, '>', version)) {
|
|
367
369
|
unsafeUpdate = null;
|
|
368
370
|
safeUpdate = null;
|
|
369
371
|
}
|
|
@@ -372,7 +374,7 @@ class ExtensionCommand {
|
|
|
372
374
|
unsafeUpdate = null;
|
|
373
375
|
}
|
|
374
376
|
|
|
375
|
-
if (safeUpdate && !
|
|
377
|
+
if (safeUpdate && !_support.util.compareVersions(safeUpdate, '>', version)) {
|
|
376
378
|
safeUpdate = null;
|
|
377
379
|
}
|
|
378
380
|
|
|
@@ -387,13 +389,63 @@ class ExtensionCommand {
|
|
|
387
389
|
const {
|
|
388
390
|
pkgName
|
|
389
391
|
} = this.config.installedExtensions[ext];
|
|
390
|
-
await this.
|
|
392
|
+
await _support.fs.rimraf(this.config.getInstallPath(ext));
|
|
393
|
+
const extData = await this.installViaNpm({
|
|
391
394
|
ext,
|
|
392
395
|
pkgName,
|
|
393
396
|
pkgVer: version
|
|
394
397
|
});
|
|
395
|
-
this.
|
|
396
|
-
await this.config.
|
|
398
|
+
delete extData[`${this.type}Name`];
|
|
399
|
+
await this.config.updateExtension(ext, extData);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
async run({
|
|
403
|
+
ext,
|
|
404
|
+
scriptName
|
|
405
|
+
}) {
|
|
406
|
+
if (!_lodash.default.has(this.config.installedExtensions, ext)) {
|
|
407
|
+
throw new Error(`please install the ${this.type} first`);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
const extConfig = this.config.installedExtensions[ext];
|
|
411
|
+
|
|
412
|
+
if (!_lodash.default.has(extConfig, 'scripts')) {
|
|
413
|
+
throw new Error(`The ${this.type} named '${ext}' does not contain the ` + `"scripts" field underneath the "appium" field in its package.json`);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const extScripts = extConfig.scripts;
|
|
417
|
+
|
|
418
|
+
if (!_lodash.default.isPlainObject(extScripts)) {
|
|
419
|
+
throw new Error(`The ${this.type} named '${ext}' "scripts" field must be a plain object`);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
if (!_lodash.default.has(extScripts, scriptName)) {
|
|
423
|
+
throw new Error(`The ${this.type} named '${ext}' does not support the script: '${scriptName}'`);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName]], {
|
|
427
|
+
cwd: this.config.getExtensionRequirePath(ext)
|
|
428
|
+
});
|
|
429
|
+
const output = new _utils.RingBuffer(50);
|
|
430
|
+
runner.on('stream-line', line => {
|
|
431
|
+
output.enqueue(line);
|
|
432
|
+
(0, _utils.log)(this.isJsonOutput, line);
|
|
433
|
+
});
|
|
434
|
+
await runner.start(0);
|
|
435
|
+
|
|
436
|
+
try {
|
|
437
|
+
await runner.join();
|
|
438
|
+
(0, _utils.log)(this.isJsonOutput, `${scriptName} successfully ran`.green);
|
|
439
|
+
return {
|
|
440
|
+
output: output.getBuff()
|
|
441
|
+
};
|
|
442
|
+
} catch (err) {
|
|
443
|
+
(0, _utils.log)(this.isJsonOutput, `Encountered an error when running '${scriptName}': ${err.message}`.red);
|
|
444
|
+
return {
|
|
445
|
+
error: err.message,
|
|
446
|
+
output: output.getBuff()
|
|
447
|
+
};
|
|
448
|
+
}
|
|
397
449
|
}
|
|
398
450
|
|
|
399
451
|
}
|
|
@@ -401,4 +453,4 @@ class ExtensionCommand {
|
|
|
401
453
|
exports.default = ExtensionCommand;require('source-map-support').install();
|
|
402
454
|
|
|
403
455
|
|
|
404
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJ3cml0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxVQUFVLEdBQUcsV0FBbkI7O0FBRUEsTUFBTUMsaUJBQU4sU0FBZ0NDLEtBQWhDLENBQXNDOztBQUN0QyxNQUFNQyx1QkFBTixTQUFzQ0QsS0FBdEMsQ0FBNEM7O0FBRTdCLE1BQU1FLGdCQUFOLENBQXVCO0FBZXBDQyxFQUFBQSxXQUFXLENBQUU7QUFBQ0MsSUFBQUEsTUFBRDtBQUFTQyxJQUFBQSxJQUFUO0FBQWVDLElBQUFBO0FBQWYsR0FBRixFQUF3QjtBQUNqQyxTQUFLRixNQUFMLEdBQWNBLE1BQWQ7QUFDQSxT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TUFBQUEsT0FBTjtBQUFlMEMsTUFBQUEsTUFBTSxFQUFFNUI7QUFBdkIsS0FBbkIsQ0FBTjtBQUNBLFNBQUs3QyxNQUFMLENBQVl1QixtQkFBWixDQUFnQ1MsR0FBaEMsRUFBcUNhLE9BQXJDLEdBQStDQSxPQUEvQztBQUNBLFVBQU0sS0FBSzdDLE1BQUwsQ0FBWWdILEtBQVosRUFBTjtBQUNEOztBQXhkbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgTlBNIGZyb20gJy4vbnBtJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5cbmNvbnN0IFVQREFURV9BTEwgPSAnaW5zdGFsbGVkJztcblxuY2xhc3MgTm90VXBkYXRhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHRlbnNpb25Db21tYW5kIHtcblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uQ29tbWFuZENvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSB0aGUgRHJpdmVyQ29uZmlnIG9yIFBsdWdpbkNvbmZpZyBvYmplY3QgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIERSSVZFUl9UWVBFIG9yIFBMVUdJTl9UWVBFXG4gICAqL1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBFeHRlbnNpb25Db21tYW5kXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29tbWFuZENvbnN0cnVjdG9yfSBvcHRzXG4gICAqIEByZXR1cm4ge0V4dGVuc2lvbkNvbW1hbmR9XG4gICAqL1xuICBjb25zdHJ1Y3RvciAoe2NvbmZpZywganNvbiwgdHlwZX0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaXNKc29uT3V0cHV0ID0ganNvbjtcbiAgICB0aGlzLm5wbSA9IG5ldyBOUE0odGhpcy5jb25maWcuYXBwaXVtSG9tZSk7XG4gICAgdGhpcy5rbm93bkV4dGVuc2lvbnMgPSB7fTsgLy8gdGhpcyBuZWVkcyB0byBiZSBvdmVycmlkZGVuIGluIGZpbmFsIGNsYXNzXG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIENMSSBwYXJzZSBhbmQgcnVuIGFuIGV4dGVuc2lvbiBjb21tYW5kIGJhc2VkIG9uIGl0cyB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gYSBrZXkvdmFsdWUgb2JqZWN0IHdpdGggQ0xJIGZsYWdzIGFuZCB2YWx1ZXNcbiAgICogQHJldHVybiB7b2JqZWN0fSB0aGUgcmVzdWx0IG9mIHRoZSBzcGVjaWZpYyBjb21tYW5kIHdoaWNoIGlzIGV4ZWN1dGVkXG4gICAqL1xuICBhc3luYyBleGVjdXRlIChhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKEV4dGVuc2lvbkNvbW1hbmQucHJvdG90eXBlW2NtZF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0QXJnc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIExpc3QgZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge29iamVjdH0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCAoe3Nob3dJbnN0YWxsZWQsIHNob3dVcGRhdGVzfSkge1xuICAgIGNvbnN0IGxzTXNnID0gYExpc3RpbmcgJHtzaG93SW5zdGFsbGVkID8gJ2luc3RhbGxlZCcgOiAnYXZhaWxhYmxlJ30gJHt0aGlzLnR5cGV9c2A7XG4gICAgY29uc3QgaW5zdGFsbGVkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGV4dHMgPSBbLi4uaW5zdGFsbGVkTmFtZXMsIC4uLmtub3duTmFtZXNdLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7Li4udGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiB0cnVlfTtcbiAgICAgICAgfSBlbHNlIGlmICghc2hvd0luc3RhbGxlZCkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBzaG93IHdoZXRoZXIgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLCBwdXQgdGhhdCBiZWhpbmQgYSBzcGlubmVyXG4gICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGxzTXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNob3dVcGRhdGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2V4dCwgZGF0YV0gb2YgXy50b1BhaXJzKGV4dHMpKSB7XG4gICAgICAgIGNvbnN0IHtpbnN0YWxsZWQsIGluc3RhbGxUeXBlfSA9IGRhdGE7XG4gICAgICAgIGlmICghaW5zdGFsbGVkIHx8IGluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBleHRzIHRoYXQgYXJlbid0IGluc3RhbGxlZFxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBub24tbnBtIGV4dHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVzID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpO1xuICAgICAgICBkYXRhLnVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudW5zYWZlVXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMudW5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVwVG9EYXRlID0gdXBkYXRlcy5zYWZlVXBkYXRlID09PSBudWxsICYmIHVwZGF0ZXMudW5zYWZlVXBkYXRlID09PSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaWYgd2UncmUganVzdCBnZXR0aW5nIHRoZSBkYXRhLCBzaG9ydCBjaXJjdWl0IHJldHVybiBoZXJlIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55XG4gICAgLy8gZm9ybWF0dGluZyBsb2dpY1xuICAgIGlmICh0aGlzLmlzSnNvbk91dHB1dCkge1xuICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbXG4gICAgICBuYW1lLFxuICAgICAge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgaW5zdGFsbGVkLCB1cGRhdGVWZXJzaW9uLCB1bnNhZmVVcGRhdGVWZXJzaW9uLCB2ZXJzaW9uLCB1cFRvRGF0ZX1cbiAgICBdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgbGV0IHR5cGVUeHQ7XG4gICAgICBzd2l0Y2ggKGluc3RhbGxUeXBlKSB7XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUSFVCOlxuICAgICAgICAgIHR5cGVUeHQgPSBgKGNsb25lZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAueWVsbG93O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9MT0NBTDpcbiAgICAgICAgICB0eXBlVHh0ID0gYChsaW5rZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLm1hZ2VudGE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdHlwZVR4dCA9ICcoTlBNKSc7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YWxsVHh0ID0gaW5zdGFsbGVkID9cbiAgICAgICAgYEAke3ZlcnNpb24ueWVsbG93fSAkeygnW2luc3RhbGxlZCAnICsgdHlwZVR4dCArICddJykuZ3JlZW59YCA6XG4gICAgICAgICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgY29uc3QgdXBkYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdXBkYXRlVmVyc2lvbiA/XG4gICAgICAgIGAgWyR7dXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlXWAubWFnZW50YSA6XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgdXBUb0RhdGVUeHQgPSBzaG93VXBkYXRlcyAmJiB1cFRvRGF0ZSA/XG4gICAgICAgIGAgW1VwIHRvIGRhdGVdYC5ncmVlbiA6XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgdW5zYWZlVXBkYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdW5zYWZlVXBkYXRlVmVyc2lvbiA/XG4gICAgICAgIGAgWyR7dW5zYWZlVXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlIChwb3RlbnRpYWxseSB1bnNhZmUpXWAuY3lhbiA6XG4gICAgICAgICcnO1xuXG4gICAgICBjb25zb2xlLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxBcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsVHlwZSAtIGhvdyB0byBpbnN0YWxsIHRoaXMgZXh0ZW5zaW9uLiBPbmUgb2YgdGhlIElOU1RBTExfVFlQRVNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICAgKi9cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEF0dGVtcHRpbmcgdG8gZmluZCBhbmQgaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7ZXh0fSdgKTtcblxuICAgIGxldCBleHREYXRhO1xuICAgIGxldCBpbnN0YWxsU3BlYyA9IGV4dDtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgY2Fubm90IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmICghcGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUJdLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBtdXN0IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0xPQ0FMKSB7XG4gICAgICBjb25zdCBtc2cgPSBgTGlua2luZyAke3RoaXMudHlwZX0gZnJvbSBsb2NhbCBwYXRoYDtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCB0aGlzLm5wbS5saW5rUGFja2FnZShpbnN0YWxsU3BlYykpXG4gICAgICApO1xuICAgICAgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGV4dERhdGEuaW5zdGFsbFBhdGggPSBleHREYXRhLnBrZ05hbWU7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0aHViICR7dGhpcy50eXBlfSBzcGVjICR7aW5zdGFsbFNwZWN9IGFwcGVhcmVkIHRvIGJlIGludmFsaWQ7IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZCBiZSBvZiB0aGUgZm9ybSA8b3JnPi88cmVwbz4nKTtcbiAgICAgIH1cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IHBhY2thZ2VOYW1lfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVCkge1xuICAgICAgLy8gZ2l0IHVybHMgY2FuIGhhdmUgJy5naXQnIGF0IHRoZSBlbmQsIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHdvdWxkIGNvbXBsaWNhdGUgdGhlXG4gICAgICAvLyB3YXkgd2UgZG93bmxvYWQgYW5kIG5hbWUgZGlyZWN0b3JpZXMsIHNvIHdlIGNhbiBqdXN0IHJlbW92ZSBpdFxuICAgICAgaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYy5yZXBsYWNlKC9cXC5naXQkLywgJycpO1xuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogcGFja2FnZU5hbWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGVpdGhlciBhbiBucG0gcGFja2FnZSBvciBhbiBhcHBpdW0gdmVyaWZpZWQgZXh0ZW5zaW9uXG4gICAgICAvLyBuYW1lLiBib3RoIG9mIHdoaWNoIHdpbGwgYmUgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgICAvLyBleHRlbnNpb25zIGluc3RhbGxlZCB2aWEgbnBtIGNhbiBpbmNsdWRlIHZlcnNpb25zIG9yIHRhZ3MgYWZ0ZXIgdGhlICdAJ1xuICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgLy8gY29udGFpbiB0aGUgJ0AnIHN5bWJvbCwgYXMgaW4gYG5wbSBpbnN0YWxsIEBhcHBpdW0vZmFrZS1kcml2ZXJAMS4yLjBgXG4gICAgICBsZXQgbmFtZSwgcGtnVmVyO1xuICAgICAgY29uc3Qgc3BsaXRzID0gaW5zdGFsbFNwZWMuc3BsaXQoJ0AnKTtcbiAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhbiBucG0gb3JnIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlIG5hbWVcbiAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBbYEAke3NwbGl0c1sxXX1gLCBzcGxpdHNbMl1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aXRob3V0IGFuIG5wbSBvcmdcbiAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBzcGxpdHM7XG4gICAgICB9XG4gICAgICBsZXQgcGtnTmFtZTtcblxuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBwYWNrYWdlIGZyb20gbnBtLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrXG4gICAgICAgIC8vIGFnYWluc3QgdGhlIGFwcGl1bSBleHRlbnNpb24gbGlzdDsganVzdCB1c2UgdGhlIGluc3RhbGxTcGVjIGFzIGlzXG4gICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIGFwcGl1bSBkcml2ZXIgKGxpa2UgJ3hjdWl0ZXN0Jykgd2UgbmVlZCB0b1xuICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgLy8gY2hlY2sgaXQgZXhpc3RzIGFuZCBnZXQgdGhlIGNvcnJlY3QgcGFja2FnZVxuICAgICAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgQ291bGQgbm90IHJlc29sdmUgJHt0aGlzLnR5cGV9OyBhcmUgeW91IHN1cmUgaXQncyBpbiB0aGUgbGlzdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgIC8vIGdpdmVuIHRoYXQgd2UnbGwgdXNlIHRoZSBpbnN0YWxsIHR5cGUgaW4gdGhlIGRyaXZlciBqc29uLCBzdG9yZSBpdCBhc1xuICAgICAgICAvLyAnbnBtJyBub3dcbiAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgfVxuXG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQsIHBrZ05hbWUsIHBrZ1Zlcn0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dE5hbWUgPSBleHREYXRhW2Ake3RoaXMudHlwZX1OYW1lYF07XG4gICAgZGVsZXRlIGV4dERhdGFbYCR7dGhpcy50eXBlfU5hbWVgXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgZXh0RGF0YS5pbnN0YWxsVHlwZSA9IGluc3RhbGxUeXBlO1xuICAgIGV4dERhdGEuaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYztcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0RGF0YSk7XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbFZpYU5wbUFyZ3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSB0aGUgTlBNIHBhY2thZ2UgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICAgKi9cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtICh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgbnBtU3BlYyA9IGAke3BrZ05hbWV9JHtwa2dWZXIgPyAnQCcgKyBwa2dWZXIgOiAnJ31gO1xuICAgIGNvbnN0IHNwZWNNc2cgPSBucG1TcGVjID09PSBleHQgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2V4dH0nJHtzcGVjTXNnfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCB0aGlzLm5wbS5pbnN0YWxsUGFja2FnZSh7XG4gICAgICAgICAgcGtnRGlyOiBwYXRoLnJlc29sdmUodGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSksXG4gICAgICAgICAgcGtnTmFtZSxcbiAgICAgICAgICBwa2dWZXJcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgICAgY29uc3QgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGV4dERhdGEuaW5zdGFsbFBhdGggPSBwa2dOYW1lO1xuICAgICAgcmV0dXJuIGV4dERhdGE7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gaW5zdGFsbGluZyBwYWNrYWdlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25BcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGV4dCB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFmdGVyIGFuIGV4dGVuc2lvbiBoYXMgYmVlbiBpbnN0YWxsZWQuIFRoaXNcbiAgICogaXMgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBkcml2ZXJzL3BsdWdpbnMgd2l0aCB0aGVpciBvd24gcGFydGljdWxhciB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkFyZ3N9IGFyZ3NcbiAgICovXG4gIGdldFBvc3RJbnN0YWxsVGV4dCAoLyp7ZXh0TmFtZSwgZXh0RGF0YX0qLykge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHBrZ0pzb25EYXRhIC0gdGhlIHBhY2thZ2UuanNvbiBkYXRhIGZvciBhIGRyaXZlciBtb2R1bGUsIGFzIGlmIGl0IGhhZCBiZWVuXG4gICAqIHN0cmFpZ2h0Zm9yd2FyZGx5ICdyZXF1aXJlJ2RcbiAgICovXG4gIGdldEV4dGVuc2lvbkZpZWxkcyAocGtnSnNvbkRhdGEpIHtcbiAgICBpZiAoIXBrZ0pzb25EYXRhLmFwcGl1bSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0YWxsZWQgZHJpdmVyIGRpZCBub3QgaGF2ZSBhbiAnYXBwaXVtJyBzZWN0aW9uIGluIGl0cyBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgcGFja2FnZS5qc29uIGZpbGUgYXMgZXhwZWN0ZWRgKTtcbiAgICB9XG4gICAgY29uc3Qge2FwcGl1bSwgbmFtZSwgdmVyc2lvbn0gPSBwa2dKc29uRGF0YTtcbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSk7XG5cbiAgICByZXR1cm4gey4uLmFwcGl1bSwgcGtnTmFtZTogbmFtZSwgdmVyc2lvbn07XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBwYWNrYWdlLmpzb24gZmllbGRzIHdoaWNoIGEgcGFydGljdWxhciB0eXBlIG9mIGV4dGVuc2lvbiByZXF1aXJlcywgdmFsaWRhdGUgdGhlXG4gICAqIHByZXNlbmNlIGFuZCBmb3JtIG9mIHRob3NlIGZpZWxkcyBvbiB0aGUgcGFja2FnZS5qc29uIGRhdGEsIHRocm93aW5nIGFuIGVycm9yIGlmIGFueXRoaW5nIGlzXG4gICAqIGFtaXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW5cbiAgICogZXh0ZW5zaW9uXG4gICAqL1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyAoLyphcHBpdW1Qa2dEYXRhKi8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxBcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIFVuaW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtVbmluc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge29iamVjdH0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKHtleHR9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7ZXh0fSc7IGl0IGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChleHQpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jb25maWcucmVtb3ZlRXh0ZW5zaW9uKGV4dCk7XG4gICAgfVxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7ZXh0fSdgLmdyZWVuKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25VcGRhdGVPcHRzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uXG4gICAqIGJvdW5kYXJpZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFVwZGF0ZVJlcG9ydFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdXBkYXRlZCBmcm9tXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0byAtIHZlcnNpb24gdXBkYXRlZCB0b1xuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uVXBkYXRlUmVzdWx0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBlcnJvcnMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIGVycm9yIG9iamVjdHNcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGluayBVcGRhdGVSZXBvcnR9c1xuICAgKi9cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge0V4dGVuc2lvblVwZGF0ZVJlc3VsdH1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAoe2V4dCwgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGV4dCA9PT0gVVBEQVRFX0FMTDtcbiAgICAvLyBpZiB3ZSdyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyBhbiB1cGRhdGUgZm9yIGFuIGV4dGVuc2lvbiwgbWFrZSBzdXJlIGl0J3MgaW5zdGFsbGVkXG4gICAgaWYgKCFzaG91bGRVcGRhdGVBbGwgJiYgIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtleHR9JyB3YXMgbm90IGluc3RhbGxlZCwgc28gY2FuJ3QgYmUgdXBkYXRlZGApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGwgPyBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKSA6IFtleHRdO1xuXG4gICAgLy8gJ2Vycm9ycycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCBlcnJvciBvYmplY3RzIGFzIHZhbHVlc1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBuZWVkcyBhbiB1cGRhdGVgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICBpZiAoISh1cGRhdGUuc2FmZVVwZGF0ZSB8fCB1cGRhdGUudW5zYWZlVXBkYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXVuc2FmZSAmJiAhdXBkYXRlLnNhZmVVcGRhdGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZX0nIGhhcyBhIG1ham9yIHJldmlzaW9uIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCgke3VwZGF0ZS5jdXJyZW50fSA9PiAke3VwZGF0ZS51bnNhZmVVcGRhdGV9KSwgd2hpY2ggY291bGQgaW5jbHVkZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSB3YW50IHRvIGFwcGx5IHRoaXMgdXBkYXRlLCByZS1ydW4gd2l0aCAtLXVuc2FmZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZlciA9IHVuc2FmZSAmJiB1cGRhdGUudW5zYWZlVXBkYXRlID8gdXBkYXRlLnVuc2FmZVVwZGF0ZSA6IHVwZGF0ZS5zYWZlVXBkYXRlO1xuICAgICAgICBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgVXBkYXRpbmcgZHJpdmVyICcke2V9JyBmcm9tICR7dXBkYXRlLmN1cnJlbnR9IHRvICR7dXBkYXRlVmVyfWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy51cGRhdGVFeHRlbnNpb24oZSwgdXBkYXRlVmVyKVxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVzW2VdID0ge2Zyb206IHVwZGF0ZS5jdXJyZW50LCB0bzogdXBkYXRlVmVyfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcnNbZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCAnVXBkYXRlIHJlcG9ydDonKTtcbiAgICBmb3IgKGNvbnN0IFtlLCB1cGRhdGVdIG9mIF8udG9QYWlycyh1cGRhdGVzKSkge1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAke3RoaXMudHlwZX0gJHtlfSB1cGRhdGVkOiAke3VwZGF0ZS5mcm9tfSA9PiAke3VwZGF0ZS50b31gLmdyZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIHdhcyBub3QgaW5zdGFsbGVkIHZpYSBucG0sIHNvIHdlIGNvdWxkIG5vdCBjaGVjayBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yIHVwZGF0ZXNgLnllbGxvdyk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3VwZGF0ZXMsIGVycm9yc307XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50IC0gY3VycmVudCB2ZXJzaW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IHNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiBzYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSB1bnNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiB1bnNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UG9zc2libGVVcGRhdGVzfVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCB0aGlzLm5wbS5nZXRMYXRlc3RWZXJzaW9uKHBrZ05hbWUpO1xuICAgIGxldCBzYWZlVXBkYXRlID0gYXdhaXQgdGhpcy5ucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKHBrZ05hbWUsIHZlcnNpb24pO1xuICAgIGlmICghdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbiAoZXh0LCB2ZXJzaW9uKSB7XG4gICAgY29uc3Qge3BrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF0udmVyc2lvbiA9IHZlcnNpb247XG4gICAgYXdhaXQgdGhpcy5jb25maWcud3JpdGUoKTtcbiAgfVxufVxuIl0sImZpbGUiOiJsaWIvY2xpL2V4dGVuc2lvbi1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
456
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwiZXh0U2NyaXB0cyIsInNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsImdldEV4dGVuc2lvblJlcXVpcmVQYXRoIiwib3V0cHV0IiwiUmluZ0J1ZmZlciIsIm9uIiwibGluZSIsImVucXVldWUiLCJzdGFydCIsImpvaW4iLCJnZXRCdWZmIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFH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QUFQO0FBQVQsT0FBUDtBQUNELEtBSkQsQ0FJRSxPQUFPN0MsR0FBUCxFQUFZO0FBQ1osc0JBQUksS0FBS3BGLFlBQVQsRUFBd0Isc0NBQXFDOEcsVUFBVyxNQUFLMUIsR0FBRyxDQUFDQyxPQUFRLEVBQWxFLENBQW9FbUIsR0FBM0Y7QUFDQSxhQUFPO0FBQUMwQixRQUFBQSxLQUFLLEVBQUU5QyxHQUFHLENBQUNDLE9BQVo7QUFBcUJxQyxRQUFBQSxNQUFNLEVBQUVBLE1BQU0sQ0FBQ08sT0FBUDtBQUE3QixPQUFQO0FBQ0Q7QUFDRjs7QUFsaEJtQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBOUE0gZnJvbSAnLi9ucG0nO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoLCBSaW5nQnVmZmVyIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgSU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgICAgICAgIElOU1RBTExfVFlQRV9MT0NBTCB9IGZyb20gJy4uL2V4dGVuc2lvbi1jb25maWcnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gdGhlIERyaXZlckNvbmZpZyBvciBQbHVnaW5Db25maWcgb2JqZWN0IHVzZWQgZm9yIHRoaXMgY29tbWFuZFxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBEUklWRVJfVFlQRSBvciBQTFVHSU5fVFlQRVxuICAgKi9cblxuICAvKipcbiAgICogQnVpbGQgYW4gRXh0ZW5zaW9uQ29tbWFuZFxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3Rvcn0gb3B0c1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25Db21tYW5kfVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb24sIHR5cGV9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlzSnNvbk91dHB1dCA9IGpzb247XG4gICAgdGhpcy5ucG0gPSBuZXcgTlBNKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUpO1xuICAgIHRoaXMua25vd25FeHRlbnNpb25zID0ge307IC8vIHRoaXMgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiBpbiBmaW5hbCBjbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge29iamVjdH0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihFeHRlbnNpb25Db21tYW5kLnByb3RvdHlwZVtjbWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlICR7dGhpcy50eXBlfSBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgICBjb25zdCBleGVjdXRlQ21kID0gdGhpc1tjbWRdLmJpbmQodGhpcyk7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDbWQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdEFyZ3NcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0QXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGxpc3QgKHtzaG93SW5zdGFsbGVkLCBzaG93VXBkYXRlc30pIHtcbiAgICBjb25zdCBsc01zZyA9IGBMaXN0aW5nICR7c2hvd0luc3RhbGxlZCA/ICdpbnN0YWxsZWQnIDogJ2F2YWlsYWJsZSd9ICR7dGhpcy50eXBlfXNgO1xuICAgIGNvbnN0IGluc3RhbGxlZE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICBjb25zdCBleHRzID0gWy4uLmluc3RhbGxlZE5hbWVzLCAuLi5rbm93bk5hbWVzXS5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgaWYgKCFhY2NbbmFtZV0pIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0gey4uLnRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogdHJ1ZX07XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7cGtnTmFtZTogdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbGVkLCBpbnN0YWxsVHlwZX0gPSBkYXRhO1xuICAgICAgICBpZiAoIWluc3RhbGxlZCB8fCBpbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gZXh0cyB0aGF0IGFyZW4ndCBpbnN0YWxsZWRcbiAgICAgICAgICAvLyBhbHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gbm9uLW5wbSBleHRzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZXh0KTtcbiAgICAgICAgZGF0YS51cGRhdGVWZXJzaW9uID0gdXBkYXRlcy5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVuc2FmZVVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnVuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51cFRvRGF0ZSA9IHVwZGF0ZXMuc2FmZVVwZGF0ZSA9PT0gbnVsbCAmJiB1cGRhdGVzLnVuc2FmZVVwZGF0ZSA9PT0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW1xuICAgICAgbmFtZSxcbiAgICAgIHtpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWMsIGluc3RhbGxlZCwgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9XG4gICAgXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGxldCB0eXBlVHh0O1xuICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVEhVQjpcbiAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfTE9DQUw6XG4gICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFsbFR4dCA9IGluc3RhbGxlZCA/XG4gICAgICAgIGBAJHt2ZXJzaW9uLnllbGxvd30gJHsoJ1tpbnN0YWxsZWQgJyArIHR5cGVUeHQgKyAnXScpLmdyZWVufWAgOlxuICAgICAgICAnIFtub3QgaW5zdGFsbGVkXScuZ3JleTtcbiAgICAgIGNvbnN0IHVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGEgOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVwVG9EYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdXBUb0RhdGUgP1xuICAgICAgICBgIFtVcCB0byBkYXRlXWAuZ3JlZW4gOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVuc2FmZVVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVuc2FmZVVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW4gOlxuICAgICAgICAnJztcblxuICAgICAgY29uc29sZS5sb2coYC0gJHtuYW1lLnllbGxvd30ke2luc3RhbGxUeHR9JHt1cGRhdGVUeHR9JHt1cFRvRGF0ZVR4dH0ke3Vuc2FmZVVwZGF0ZVR4dH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gZm9yIGdpdC9naXRodWIgaW5zdGFsbHMsIHRoZSBleHRlbnNpb24gbm9kZSBwYWNrYWdlIG5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGluc3RhbGwgKHtleHQsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBBdHRlbXB0aW5nIHRvIGZpbmQgYW5kIGluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nYCk7XG5cbiAgICBsZXQgZXh0RGF0YTtcbiAgICBsZXQgaW5zdGFsbFNwZWMgPSBleHQ7XG5cbiAgICBpZiAocGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX05QTV0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgbXVzdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgY29uc3QgbXNnID0gYExpbmtpbmcgJHt0aGlzLnR5cGV9IGZyb20gbG9jYWwgcGF0aGA7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0ubGlua1BhY2thZ2UoaW5zdGFsbFNwZWMpKVxuICAgICAgKTtcbiAgICAgIGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gZXh0RGF0YS5wa2dOYW1lO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVRIVUIpIHtcbiAgICAgIGlmIChpbnN0YWxsU3BlYy5zcGxpdCgnLycpLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+Jyk7XG4gICAgICB9XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiBwYWNrYWdlTmFtZX0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVQpIHtcbiAgICAgIC8vIGdpdCB1cmxzIGNhbiBoYXZlICcuZ2l0JyBhdCB0aGUgZW5kLCBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFuZCB3b3VsZCBjb21wbGljYXRlIHRoZVxuICAgICAgLy8gd2F5IHdlIGRvd25sb2FkIGFuZCBuYW1lIGRpcmVjdG9yaWVzLCBzbyB3ZSBjYW4ganVzdCByZW1vdmUgaXRcbiAgICAgIGluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWMucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IHBhY2thZ2VOYW1lfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRoZXIgYW4gbnBtIHBhY2thZ2Ugb3IgYW4gYXBwaXVtIHZlcmlmaWVkIGV4dGVuc2lvblxuICAgICAgLy8gbmFtZS4gYm90aCBvZiB3aGljaCB3aWxsIGJlIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgIC8vIHNpZ24sIHNvIGNoZWNrIGZvciB0aGF0LiBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IHBhY2thZ2UgbmFtZXMgdGhlbXNlbHZlcyBjYW5cbiAgICAgIC8vIGNvbnRhaW4gdGhlICdAJyBzeW1ib2wsIGFzIGluIGBucG0gaW5zdGFsbCBAYXBwaXVtL2Zha2UtZHJpdmVyQDEuMi4wYFxuICAgICAgbGV0IG5hbWUsIHBrZ1ZlcjtcbiAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICBpZiAoaW5zdGFsbFNwZWNbMF0gPT09ICdAJykge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gbnBtIG9yZyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aG91dCBhbiBucG0gb3JnXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgfVxuICAgICAgbGV0IHBrZ05hbWU7XG5cbiAgICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgcGFja2FnZSBmcm9tIG5wbSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVja1xuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICBwa2dOYW1lID0gbmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gZGVyZWZlcmVuY2UgdGhlIGFjdHVhbCBucG0gcGFja2FnZSAoJ2FwcGl1cG0teGN1aXRlc3QtZHJpdmVyJyksIHNvXG4gICAgICAgIC8vIGNoZWNrIGl0IGV4aXN0cyBhbmQgZ2V0IHRoZSBjb3JyZWN0IHBhY2thZ2VcbiAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgaWYgKCFfLmluY2x1ZGVzKGtub3duTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCByZXNvbHZlICR7dGhpcy50eXBlfTsgYXJlIHlvdSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYG9mIHN1cHBvcnRlZCAke3RoaXMudHlwZX1zPyAke0pTT04uc3RyaW5naWZ5KGtub3duTmFtZXMpfWA7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGtnTmFtZSA9IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdO1xuICAgICAgICAvLyBnaXZlbiB0aGF0IHdlJ2xsIHVzZSB0aGUgaW5zdGFsbCB0eXBlIGluIHRoZSBkcml2ZXIganNvbiwgc3RvcmUgaXQgYXNcbiAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgIGluc3RhbGxUeXBlID0gSU5TVEFMTF9UWVBFX05QTTtcbiAgICAgIH1cblxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KTtcbiAgICB9XG5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGRlbGV0ZSBleHREYXRhW2Ake3RoaXMudHlwZX1OYW1lYF07XG5cbiAgICBpZiAodGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0TmFtZX0nIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gJ2FwcGl1bSAke3RoaXMudHlwZX0gdXBkYXRlJy4gU2VlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoICdhcHBpdW0gJHt0aGlzLnR5cGV9IGxpc3QgLS1pbnN0YWxsZWQnLmApO1xuICAgIH1cblxuICAgIGV4dERhdGEuaW5zdGFsbFR5cGUgPSBpbnN0YWxsVHlwZTtcbiAgICBleHREYXRhLmluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWM7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuYWRkRXh0ZW5zaW9uKGV4dE5hbWUsIGV4dERhdGEpO1xuXG4gICAgLy8gbG9nIGluZm8gZm9yIHRoZSB1c2VyXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCB0aGlzLmdldFBvc3RJbnN0YWxsVGV4dCh7ZXh0TmFtZSwgZXh0RGF0YX0pKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxWaWFOcG1BcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BrZ1Zlcl0gLSB0aGUgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgTlBNIHBhY2thZ2VcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uIHZpYSBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsVmlhTnBtQXJnc30gYXJnc1xuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gZXh0ID8gJycgOiBgIHVzaW5nIE5QTSBpbnN0YWxsIHNwZWMgJyR7bnBtU3BlY30nYDtcbiAgICBjb25zdCBtc2cgPSBgSW5zdGFsbGluZyAnJHtleHR9JyR7c3BlY01zZ31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0uaW5zdGFsbFBhY2thZ2Uoe1xuICAgICAgICAgIHBrZ0RpcjogcGF0aC5yZXNvbHZlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpLFxuICAgICAgICAgIHBrZ05hbWUsXG4gICAgICAgICAgcGtnVmVyXG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gcGtnTmFtZTtcbiAgICAgIHJldHVybiBleHREYXRhO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhZnRlciBhbiBleHRlbnNpb24gaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzXG4gICAqIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgZHJpdmVycy9wbHVnaW5zIHdpdGggdGhlaXIgb3duIHBhcnRpY3VsYXIgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25BcmdzfSBhcmdzXG4gICAqL1xuICBnZXRQb3N0SW5zdGFsbFRleHQgKC8qe2V4dE5hbWUsIGV4dERhdGF9Ki8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGFuIE5QTSBtb2R1bGUncyBwYWNrYWdlLmpzb24gYW5kIGV4dHJhY3QgQXBwaXVtIGRyaXZlciBpbmZvcm1hdGlvbiBmcm9tIGEgc3BlY2lhbFxuICAgKiAnYXBwaXVtJyBmaWVsZCBpbiB0aGUgSlNPTiBkYXRhLiBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZS5nLiBkZXRlcm1pbmUgd2hpY2ggY2xhc3MgdG9cbiAgICogbG9hZCBhcyB0aGUgbWFpbiBkcml2ZXIgY2xhc3MsIG9yIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZHJpdmVyIGFuZFxuICAgKiBhcHBpdW0gdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuXG4gICAgcmV0dXJuIHsuLi5hcHBpdW0sIHBrZ05hbWU6IG5hbWUsIHZlcnNpb259O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFwcGl1bVBrZ0RhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBwYWNrYWdlLmpzb24gZm9yIGFuXG4gICAqIGV4dGVuc2lvblxuICAgKi9cbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKC8qYXBwaXVtUGtnRGF0YSovKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICh7ZXh0fSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1bmluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nOyBpdCBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvblxuICAgKiBib3VuZGFyaWVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBVcGRhdGVSZXBvcnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHVwZGF0ZWQgZnJvbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHVwZGF0ZWQgdG9cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1cGRhdGVzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byB7QGxpbmsgVXBkYXRlUmVwb3J0fXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25VcGRhdGVSZXN1bHR9XG4gICAqL1xuICBhc3luYyB1cGRhdGUgKHtleHQsIHVuc2FmZX0pIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbGwgPSBleHQgPT09IFVQREFURV9BTEw7XG4gICAgLy8gaWYgd2UncmUgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgYW4gdXBkYXRlIGZvciBhbiBleHRlbnNpb24sIG1ha2Ugc3VyZSBpdCdzIGluc3RhbGxlZFxuICAgIGlmICghc2hvdWxkVXBkYXRlQWxsICYmICF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZXh0fScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgKTtcbiAgICB9XG4gICAgY29uc3QgZXh0c1RvVXBkYXRlID0gc2hvdWxkVXBkYXRlQWxsID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykgOiBbZXh0XTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICBjb25zdCBlcnJvcnMgPSB7fTtcblxuICAgIC8vICd1cGRhdGVzJyB3aWxsIGhhdmUgZXh0IG5hbWVzIGFzIGtleXMgYW5kIHVwZGF0ZSBvYmplY3RzIGFzIHZhbHVlcywgd2hlcmUgYW4gdXBkYXRlXG4gICAgLy8gb2JqZWN0IGlzIG9mIHRoZSBmb3JtIHtmcm9tOiB2ZXJzaW9uU3RyaW5nLCB0bzogdmVyc2lvblN0cmluZ31cbiAgICBjb25zdCB1cGRhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGUgb2YgZXh0c1RvVXBkYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgaXMgdXBkYXRhYmxlYCwgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2VdLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90VXBkYXRhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgbmVlZHMgYW4gdXBkYXRlYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZSk7XG4gICAgICAgICAgaWYgKCEodXBkYXRlLnNhZmVVcGRhdGUgfHwgdXBkYXRlLnVuc2FmZVVwZGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXBkYXRlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1bnNhZmUgJiYgIXVwZGF0ZS5zYWZlVXBkYXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9ICcke2V9JyBoYXMgYSBtYWpvciByZXZpc2lvbiB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoJHt1cGRhdGUuY3VycmVudH0gPT4gJHt1cGRhdGUudW5zYWZlVXBkYXRlfSksIHdoaWNoIGNvdWxkIGluY2x1ZGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBicmVha2luZyBjaGFuZ2VzLiBJZiB5b3Ugd2FudCB0byBhcHBseSB0aGlzIHVwZGF0ZSwgcmUtcnVuIHdpdGggLS11bnNhZmVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVWZXIgPSB1bnNhZmUgJiYgdXBkYXRlLnVuc2FmZVVwZGF0ZSA/IHVwZGF0ZS51bnNhZmVVcGRhdGUgOiB1cGRhdGUuc2FmZVVwZGF0ZTtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgoXG4gICAgICAgICAgdGhpcy5pc0pzb25PdXRwdXQsXG4gICAgICAgICAgYFVwZGF0aW5nIGRyaXZlciAnJHtlfScgZnJvbSAke3VwZGF0ZS5jdXJyZW50fSB0byAke3VwZGF0ZVZlcn1gLFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMudXBkYXRlRXh0ZW5zaW9uKGUsIHVwZGF0ZVZlcilcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlc1tlXSA9IHtmcm9tOiB1cGRhdGUuY3VycmVudCwgdG86IHVwZGF0ZVZlcn07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZXJyb3JzW2VdID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgJ1VwZGF0ZSByZXBvcnQ6Jyk7XG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2UsIGVycl0gb2YgXy50b1BhaXJzKGVycm9ycykpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RVcGRhdGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyB3YXMgbm90IGluc3RhbGxlZCB2aWEgbnBtLCBzbyB3ZSBjb3VsZCBub3QgY2hlY2sgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB1cGRhdGVzYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBoYWQgbm8gdXBkYXRlcyBhdmFpbGFibGVgLnllbGxvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UsIG1ha2UgaXQgcG9wIHdpdGggcmVkIVxuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBmYWlsZWQgdG8gdXBkYXRlOiAke2Vycn1gLnJlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICAgKi9cblxuICAvKipcbiAgICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGZpZ3VyZSBvdXQgd2hhdCBpdHMgaGlnaGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVwZ3JhZGUgaXMsIGFuZCBhbHNvIHRoZVxuICAgKiBoaWdoZXN0IHBvc3NpYmxlIHNhZmUgdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEByZXR1cm4ge1Bvc3NpYmxlVXBkYXRlc31cbiAgICovXG4gIGFzeW5jIGNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIChleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgdGhpcy5ucG0uZ2V0TGF0ZXN0VmVyc2lvbihwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IHRoaXMubnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihwa2dOYW1lLCB2ZXJzaW9uKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb24gdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgaWRlbnRpZmllciB0byB1cGRhdGUgZXh0ZW5zaW9uIHRvXG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dCwgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgY29uc3QgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICBkZWxldGUgZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihleHQsIGV4dERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzY3JpcHQgY2FjaGVkIGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIlxuICAgKiBpbnNpZGUgb2YgdGhlIGRyaXZlci9wbHVnaW5zIFwicGFja2FnZS5qc29uXCIgZmlsZS4gV2lsbCB0aHJvd1xuICAgKiBhbiBlcnJvciBpZiB0aGUgZHJpdmVyL3BsdWdpbiBkb2VzIG5vdCBjb250YWluIGEgXCJzY3JpcHRzXCIgZmllbGRcbiAgICogdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uLCBpZiB0aGVcbiAgICogXCJzY3JpcHRzXCIgZmllbGQgaXMgbm90IGEgcGxhaW4gb2JqZWN0LCBvciBpZiB0aGUgc2NyaXB0TmFtZSBpc1xuICAgKiBub3QgZm91bmQgd2l0aGluIFwic2NyaXB0c1wiIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAgICogQHJldHVybiB7UnVuT3V0cHV0fVxuICAgKi9cbiAgYXN5bmMgcnVuICh7ZXh0LCBzY3JpcHROYW1lfSkge1xuICAgIGlmICghXy5oYXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucywgZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwbGVhc2UgaW5zdGFsbCB0aGUgJHt0aGlzLnR5cGV9IGZpcnN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0Q29uZmlnID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuXG4gICAgaWYgKCFfLmhhcyhleHRDb25maWcsICdzY3JpcHRzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBjb250YWluIHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0U2NyaXB0cyA9IGV4dENvbmZpZy5zY3JpcHRzO1xuXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZXh0U2NyaXB0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhleHRTY3JpcHRzLCBzY3JpcHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjcmlwdDogJyR7c2NyaXB0TmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFN1YlByb2Nlc3MocHJvY2Vzcy5leGVjUGF0aCwgW2V4dFNjcmlwdHNbc2NyaXB0TmFtZV1dLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEV4dGVuc2lvblJlcXVpcmVQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IGVycm9yIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24tY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -21,18 +21,37 @@ var _extensionConfig = require("../extension-config");
|
|
|
21
21
|
|
|
22
22
|
var _utils = require("./utils");
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
var _args = require("./args");
|
|
25
|
+
|
|
26
|
+
async function runExtensionCommand(args, type, configObject) {
|
|
25
27
|
let jsonResult = null;
|
|
26
|
-
const {
|
|
28
|
+
const extCmd = args[`${type}Command`];
|
|
29
|
+
|
|
30
|
+
if (!extCmd) {
|
|
31
|
+
throw new TypeError(`Cannot call ${type} command without a subcommand like 'install'`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let {
|
|
27
35
|
json,
|
|
28
|
-
|
|
36
|
+
suppressOutput
|
|
29
37
|
} = args;
|
|
30
38
|
|
|
39
|
+
if (suppressOutput) {
|
|
40
|
+
json = true;
|
|
41
|
+
}
|
|
42
|
+
|
|
31
43
|
const logFn = msg => (0, _utils.log)(json, msg);
|
|
32
44
|
|
|
33
|
-
|
|
45
|
+
let config;
|
|
46
|
+
|
|
47
|
+
if (configObject) {
|
|
48
|
+
config = configObject;
|
|
49
|
+
config.log = logFn;
|
|
50
|
+
} else {
|
|
51
|
+
config = (type === _extensionConfig.DRIVER_TYPE ? _driverConfig.default : _pluginConfig.default).getInstance(_args.APPIUM_HOME, logFn);
|
|
52
|
+
}
|
|
53
|
+
|
|
34
54
|
const CommandClass = type === _extensionConfig.DRIVER_TYPE ? _driverCommand.default : _pluginCommand.default;
|
|
35
|
-
const config = new ConfigClass(appiumHome, logFn);
|
|
36
55
|
const cmd = new CommandClass({
|
|
37
56
|
config,
|
|
38
57
|
json
|
|
@@ -42,10 +61,14 @@ async function runExtensionCommand(args, type) {
|
|
|
42
61
|
await config.read();
|
|
43
62
|
jsonResult = await cmd.execute(args);
|
|
44
63
|
} catch (err) {
|
|
64
|
+
if (suppressOutput) {
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
|
|
45
68
|
(0, _utils.errAndQuit)(json, err);
|
|
46
69
|
}
|
|
47
70
|
|
|
48
|
-
if (json) {
|
|
71
|
+
if (json && !suppressOutput) {
|
|
49
72
|
console.log(JSON.stringify(jsonResult, null, _utils.JSON_SPACES));
|
|
50
73
|
}
|
|
51
74
|
|
|
@@ -53,4 +76,4 @@ async function runExtensionCommand(args, type) {
|
|
|
53
76
|
}require('source-map-support').install();
|
|
54
77
|
|
|
55
78
|
|
|
56
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwidHlwZSIsImNvbmZpZ09iamVjdCIsImpzb25SZXN1bHQiLCJleHRDbWQiLCJUeXBlRXJyb3IiLCJqc29uIiwic3VwcHJlc3NPdXRwdXQiLCJsb2dGbiIsIm1zZyIsImNvbmZpZyIsImxvZyIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29uZmlnIiwiUGx1Z2luQ29uZmlnIiwiZ2V0SW5zdGFuY2UiLCJBUFBJVU1fSE9NRSIsIkNvbW1hbmRDbGFzcyIsIkRyaXZlckNvbW1hbmQiLCJQbHVnaW5Db21tYW5kIiwiY21kIiwicmVhZCIsImV4ZWN1dGUiLCJlcnIiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIkpTT05fU1BBQ0VTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVdBLGVBQWVBLG1CQUFmLENBQW9DQyxJQUFwQyxFQUEwQ0MsSUFBMUMsRUFBZ0RDLFlBQWhELEVBQThEO0FBRzVELE1BQUlDLFVBQVUsR0FBRyxJQUFqQjtBQUNBLFFBQU1DLE1BQU0sR0FBR0osSUFBSSxDQUFFLEdBQUVDLElBQUssU0FBVCxDQUFuQjs7QUFDQSxNQUFJLENBQUNHLE1BQUwsRUFBYTtBQUNYLFVBQU0sSUFBSUMsU0FBSixDQUFlLGVBQWNKLElBQUssOENBQWxDLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQUNLLElBQUFBLElBQUQ7QUFBT0MsSUFBQUE7QUFBUCxNQUF5QlAsSUFBN0I7O0FBQ0EsTUFBSU8sY0FBSixFQUFvQjtBQUNsQkQsSUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDRDs7QUFDRCxRQUFNRSxLQUFLLEdBQUlDLEdBQUQsSUFBUyxnQkFBSUgsSUFBSixFQUFVRyxHQUFWLENBQXZCOztBQUNBLE1BQUlDLE1BQUo7O0FBQ0EsTUFBSVIsWUFBSixFQUFrQjtBQUNoQlEsSUFBQUEsTUFBTSxHQUFHUixZQUFUO0FBQ0FRLElBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhSCxLQUFiO0FBQ0QsR0FIRCxNQUdPO0FBQ0xFLElBQUFBLE1BQU0sR0FBRyxDQUFDVCxJQUFJLEtBQUtXLDRCQUFULEdBQXVCQyxxQkFBdkIsR0FBc0NDLHFCQUF2QyxFQUFxREMsV0FBckQsQ0FBaUVDLGlCQUFqRSxFQUE4RVIsS0FBOUUsQ0FBVDtBQUNEOztBQUNELFFBQU1TLFlBQVksR0FBR2hCLElBQUksS0FBS1csNEJBQVQsR0FBdUJNLHNCQUF2QixHQUF1Q0Msc0JBQTVEO0FBQ0EsUUFBTUMsR0FBRyxHQUFHLElBQUlILFlBQUosQ0FBaUI7QUFBQ1AsSUFBQUEsTUFBRDtBQUFTSixJQUFBQTtBQUFULEdBQWpCLENBQVo7O0FBQ0EsTUFBSTtBQUNGLFVBQU1JLE1BQU0sQ0FBQ1csSUFBUCxFQUFOO0FBQ0FsQixJQUFBQSxVQUFVLEdBQUcsTUFBTWlCLEdBQUcsQ0FBQ0UsT0FBSixDQUFZdEIsSUFBWixDQUFuQjtBQUNELEdBSEQsQ0FHRSxPQUFPdUIsR0FBUCxFQUFZO0FBR1osUUFBSWhCLGNBQUosRUFBb0I7QUFDbEIsWUFBTWdCLEdBQU47QUFDRDs7QUFDRCwyQkFBV2pCLElBQVgsRUFBaUJpQixHQUFqQjtBQUNEOztBQUVELE1BQUlqQixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtBQUMzQmlCLElBQUFBLE9BQU8sQ0FBQ2IsR0FBUixDQUFZYyxJQUFJLENBQUNDLFNBQUwsQ0FBZXZCLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUN3QixrQkFBakMsQ0FBWjtBQUNEOztBQUVELFNBQU94QixVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQgRHJpdmVyQ29uZmlnIGZyb20gJy4uL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuLi9wbHVnaW4tY29uZmlnJztcbmltcG9ydCB7IERSSVZFUl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBlcnJBbmRRdWl0LCBsb2csIEpTT05fU1BBQ0VTIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBBUFBJVU1fSE9NRSB9IGZyb20gJy4vYXJncyc7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IHR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICogQG9hcmFtIHtFeHRlbnNpb25Db25maWd9IFtjb25maWdPYmplY3RdIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3QsIGlmIHdlIGhhdmUgb25lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkV4dGVuc2lvbkNvbW1hbmQgKGFyZ3MsIHR5cGUsIGNvbmZpZ09iamVjdCkge1xuICAvLyBUT0RPIGRyaXZlciBjb25maWcgZmlsZSBzaG91bGQgYmUgbG9ja2VkIHdoaWxlIGFueSBvZiB0aGVzZSBjb21tYW5kcyBhcmVcbiAgLy8gcnVubmluZyB0byBwcmV2ZW50IHdlaXJkIHNpdHVhdGlvbnNcbiAgbGV0IGpzb25SZXN1bHQgPSBudWxsO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAgaWYgKHN1cHByZXNzT3V0cHV0KSB7XG4gICAganNvbiA9IHRydWU7XG4gIH1cbiAgY29uc3QgbG9nRm4gPSAobXNnKSA9PiBsb2coanNvbiwgbXNnKTtcbiAgbGV0IGNvbmZpZztcbiAgaWYgKGNvbmZpZ09iamVjdCkge1xuICAgIGNvbmZpZyA9IGNvbmZpZ09iamVjdDtcbiAgICBjb25maWcubG9nID0gbG9nRm47XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gKHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29uZmlnIDogUGx1Z2luQ29uZmlnKS5nZXRJbnN0YW5jZShBUFBJVU1fSE9NRSwgbG9nRm4pO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29tbWFuZCA6IFBsdWdpbkNvbW1hbmQ7XG4gIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kQ2xhc3Moe2NvbmZpZywganNvbn0pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZy5yZWFkKCk7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBydW5FeHRlbnNpb25Db21tYW5kLFxufTtcbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
package/build/lib/cli/npm.js
CHANGED
|
@@ -9,15 +9,13 @@ exports.default = void 0;
|
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
12
|
var _path = _interopRequireDefault(require("path"));
|
|
15
13
|
|
|
16
14
|
var _semver = _interopRequireDefault(require("semver"));
|
|
17
15
|
|
|
18
16
|
var _teen_process = require("teen_process");
|
|
19
17
|
|
|
20
|
-
var
|
|
18
|
+
var _support = require("@appium/support");
|
|
21
19
|
|
|
22
20
|
const INSTALL_LOCKFILE = '.appium.install.lock';
|
|
23
21
|
const LINK_LOCKFILE = '.appium.link.lock';
|
|
@@ -38,51 +36,71 @@ class NPM {
|
|
|
38
36
|
cwd = this.appiumHome;
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
await (0,
|
|
39
|
+
await (0, _support.mkdirp)(cwd);
|
|
40
|
+
|
|
41
|
+
const dummyPkgJson = _path.default.resolve(cwd, 'package.json');
|
|
42
|
+
|
|
43
|
+
if (!(await _support.fs.exists(dummyPkgJson))) {
|
|
44
|
+
await _support.fs.writeFile(dummyPkgJson, '{}');
|
|
45
|
+
}
|
|
46
|
+
|
|
42
47
|
execOpts = { ...execOpts,
|
|
43
48
|
cwd
|
|
44
49
|
};
|
|
45
50
|
args.unshift(cmd);
|
|
46
51
|
|
|
47
52
|
if (json) {
|
|
48
|
-
args.push('
|
|
53
|
+
args.push('--json');
|
|
49
54
|
}
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
const npmCmd = _support.system.isWindows() ? 'npm.cmd' : 'npm';
|
|
57
|
+
|
|
58
|
+
let runner = async () => await (0, _teen_process.exec)(npmCmd, args, execOpts);
|
|
52
59
|
|
|
53
60
|
if (lockFile) {
|
|
54
|
-
const acquireLock =
|
|
61
|
+
const acquireLock = _support.util.getLockFileGuard(_path.default.resolve(cwd, lockFile));
|
|
55
62
|
|
|
56
63
|
const _runner = runner;
|
|
57
64
|
|
|
58
65
|
runner = async () => await acquireLock(_runner);
|
|
59
66
|
}
|
|
60
67
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
let ret;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const {
|
|
72
|
+
stdout,
|
|
73
|
+
stderr,
|
|
74
|
+
code
|
|
75
|
+
} = await runner();
|
|
76
|
+
ret = {
|
|
77
|
+
stdout,
|
|
78
|
+
stderr,
|
|
79
|
+
code
|
|
80
|
+
};
|
|
72
81
|
|
|
73
|
-
if (json) {
|
|
74
82
|
try {
|
|
75
83
|
ret.json = JSON.parse(stdout);
|
|
76
84
|
} catch (ign) {}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
const {
|
|
87
|
+
stdout,
|
|
88
|
+
stderr,
|
|
89
|
+
code
|
|
90
|
+
} = e;
|
|
91
|
+
const err = new Error(`npm command '${cmd} ${args.join(' ')}' failed with code ${code}.\n\nSTDOUT:\n${stdout.trim()}\n\nSTDERR:\n${stderr.trim()}`);
|
|
92
|
+
throw err;
|
|
77
93
|
}
|
|
78
94
|
|
|
79
95
|
return ret;
|
|
80
96
|
}
|
|
81
97
|
|
|
82
98
|
async getLatestVersion(pkg) {
|
|
83
|
-
|
|
99
|
+
var _await$this$exec$json;
|
|
100
|
+
|
|
101
|
+
return (_await$this$exec$json = (await this.exec('view', [pkg, 'dist-tags'], {
|
|
84
102
|
json: true
|
|
85
|
-
})).json.latest;
|
|
103
|
+
})).json) === null || _await$this$exec$json === void 0 ? void 0 : _await$this$exec$json.latest;
|
|
86
104
|
}
|
|
87
105
|
|
|
88
106
|
async getLatestSafeUpgradeVersion(pkg, curVersion) {
|
|
@@ -147,12 +165,6 @@ class NPM {
|
|
|
147
165
|
if (res.json.error) {
|
|
148
166
|
throw new Error(res.json.error);
|
|
149
167
|
}
|
|
150
|
-
|
|
151
|
-
const names = _lodash.default.uniq([...res.json.added, ...res.json.updated].map(x => x.name));
|
|
152
|
-
|
|
153
|
-
if (names.length === 1) {
|
|
154
|
-
pkgName = names[0];
|
|
155
|
-
}
|
|
156
168
|
}
|
|
157
169
|
|
|
158
170
|
const pkgJson = _path.default.resolve(pkgDir, 'node_modules', pkgName, 'package.json');
|
|
@@ -173,9 +185,11 @@ class NPM {
|
|
|
173
185
|
throw new Error('Could not find package.json inside the package path ' + `provided: ${pkgPath}`);
|
|
174
186
|
}
|
|
175
187
|
|
|
188
|
+
pkgPath = _path.default.resolve(process.cwd(), pkgPath);
|
|
189
|
+
|
|
176
190
|
const pkgHome = _path.default.resolve(this.appiumHome, pkgName);
|
|
177
191
|
|
|
178
|
-
const res = await this.exec('link', [pkgPath], {
|
|
192
|
+
const res = await this.exec('link', ['--no-package-lock', pkgPath], {
|
|
179
193
|
cwd: pkgHome,
|
|
180
194
|
lockFile: LINK_LOCKFILE
|
|
181
195
|
});
|
|
@@ -203,4 +217,4 @@ class NPM {
|
|
|
203
217
|
exports.default = NPM;require('source-map-support').install();
|
|
204
218
|
|
|
205
219
|
|
|
206
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvbnBtLmpzIl0sIm5hbWVzIjpbIklOU1RBTExfTE9DS0ZJTEUiLCJMSU5LX0xPQ0tGSUxFIiwiTlBNIiwiY29uc3RydWN0b3IiLCJhcHBpdW1Ib21lIiwiZXhlYyIsImNtZCIsImFyZ3MiLCJvcHRzIiwiZXhlY09wdHMiLCJjd2QiLCJqc29uIiwibG9ja0ZpbGUiLCJ1bnNoaWZ0IiwicHVzaCIsInJ1bm5lciIsImFjcXVpcmVMb2NrIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIl9ydW5uZXIiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwicmV0IiwiSlNPTiIsInBhcnNlIiwiaWduIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsInBrZyIsImxhdGVzdCIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsImN1clZlcnNpb24iLCJhbGxWZXJzaW9ucyIsImdldExhdGVzdFNhZmVVcGdyYWRlRnJvbVZlcnNpb25zIiwic2FmZVVwZ3JhZGVWZXIiLCJjdXJTZW12ZXIiLCJzZW12ZXIiLCJFcnJvciIsInRlc3RWZXIiLCJ0ZXN0U2VtdmVyIiwicHJlcmVsZWFzZSIsImxlbmd0aCIsImNvbXBhcmUiLCJtYWpvciIsImZvcm1hdCIsImluc3RhbGxQYWNrYWdlIiwicGtnRGlyIiwicGtnTmFtZSIsInBrZ1ZlciIsInJlcyIsImVycm9yIiwibmFtZXMiLCJfIiwidW5pcSIsImFkZGVkIiwidXBkYXRlZCIsIm1hcCIsIngiLCJuYW1lIiwicGtnSnNvbiIsInJlcXVpcmUiLCJsaW5rUGFja2FnZSIsInBrZ1BhdGgiLCJwa2dIb21lIiwidW5pbnN0YWxsUGFja2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBRyxzQkFBekI7QUFDQSxNQUFNQyxhQUFhLEdBQUcsbUJBQXRCOztBQUVlLE1BQU1DLEdBQU4sQ0FBVTtBQUV2QkMsRUFBQUEsV0FBVyxDQUFFQyxVQUFGLEVBQWM7QUFDdkIsU0FBS0EsVUFBTCxHQUFrQkEsVUFBbEI7QUFDRDs7QUFFRCxRQUFNQyxJQUFOLENBQVlDLEdBQVosRUFBaUJDLElBQWpCLEVBQXVCQyxJQUF2QixFQUE2QkMsUUFBUSxHQUFHLEVBQXhDLEVBQTRDO0FBQzFDLFFBQUk7QUFBRUMsTUFBQUEsR0FBRjtBQUFPQyxNQUFBQSxJQUFQO0FBQWFDLE1BQUFBO0FBQWIsUUFBMEJKLElBQTlCOztBQUNBLFFBQUksQ0FBQ0UsR0FBTCxFQUFVO0FBQ1JBLE1BQUFBLEdBQUcsR0FBRyxLQUFLTixVQUFYO0FBQ0Q7O0FBRUQsVUFBTSwyQkFBT00sR0FBUCxDQUFOO0FBR0FELElBQUFBLFFBQVEsR0FBRyxFQUFDLEdBQUdBLFFBQUo7QUFBY0MsTUFBQUE7QUFBZCxLQUFYO0FBRUFILElBQUFBLElBQUksQ0FBQ00sT0FBTCxDQUFhUCxHQUFiOztBQUNBLFFBQUlLLElBQUosRUFBVTtBQUNSSixNQUFBQSxJQUFJLENBQUNPLElBQUwsQ0FBVSxPQUFWO0FBQ0Q7O0FBQ0QsUUFBSUMsTUFBTSxHQUFHLFlBQVksTUFBTSx3QkFBSyxLQUFMLEVBQVlSLElBQVosRUFBa0JFLFFBQWxCLENBQS9COztBQUNBLFFBQUlHLFFBQUosRUFBYztBQUNaLFlBQU1JLFdBQVcsR0FBR0Msb0JBQUtDLGdCQUFMLENBQXNCQyxjQUFLQyxPQUFMLENBQWFWLEdBQWIsRUFBa0JFLFFBQWxCLENBQXRCLENBQXBCOztBQUNBLFlBQU1TLE9BQU8sR0FBR04sTUFBaEI7O0FBQ0FBLE1BQUFBLE1BQU0sR0FBRyxZQUFZLE1BQU1DLFdBQVcsQ0FBQ0ssT0FBRCxDQUF0QztBQUNEOztBQUNELFVBQU07QUFBQ0MsTUFBQUEsTUFBRDtBQUFTQyxNQUFBQSxNQUFUO0FBQWlCQyxNQUFBQTtBQUFqQixRQUF5QixNQUFNVCxNQUFNLEVBQTNDO0FBQ0EsVUFBTVUsR0FBRyxHQUFHO0FBQUNILE1BQUFBLE1BQUQ7QUFBU0MsTUFBQUEsTUFBVDtBQUFpQkMsTUFBQUEsSUFBakI7QUFBdUJiLE1BQUFBLElBQUksRUFBRTtBQUE3QixLQUFaOztBQUVBLFFBQUlBLElBQUosRUFBVTtBQUlSLFVBQUk7QUFDRmMsUUFBQUEsR0FBRyxDQUFDZCxJQUFKLEdBQVdlLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxNQUFYLENBQVg7QUFDRCxPQUZELENBRUUsT0FBT00sR0FBUCxFQUFZLENBQUU7QUFDakI7O0FBRUQsV0FBT0gsR0FBUDtBQUNEOztBQUVELFFBQU1JLGdCQUFOLENBQXdCQyxHQUF4QixFQUE2QjtBQUMzQixXQUFPLENBQUMsTUFBTSxLQUFLekIsSUFBTCxDQUFVLE1BQVYsRUFBa0IsQ0FBQ3lCLEdBQUQsRUFBTSxXQUFOLENBQWxCLEVBQXNDO0FBQ2xEbkIsTUFBQUEsSUFBSSxFQUFFO0FBRDRDLEtBQXRDLENBQVAsRUFFSEEsSUFGRyxDQUVFb0IsTUFGVDtBQUdEOztBQUVELFFBQU1DLDJCQUFOLENBQW1DRixHQUFuQyxFQUF3Q0csVUFBeEMsRUFBb0Q7QUFDbEQsVUFBTUMsV0FBVyxHQUFHLENBQUMsTUFBTSxLQUFLN0IsSUFBTCxDQUFVLE1BQVYsRUFBa0IsQ0FBQ3lCLEdBQUQsRUFBTSxVQUFOLENBQWxCLEVBQXFDO0FBQzlEbkIsTUFBQUEsSUFBSSxFQUFFO0FBRHdELEtBQXJDLENBQVAsRUFFaEJBLElBRko7QUFHQSxXQUFPLEtBQUt3QixnQ0FBTCxDQUFzQ0YsVUFBdEMsRUFBa0RDLFdBQWxELENBQVA7QUFDRDs7QUFZREMsRUFBQUEsZ0NBQWdDLENBQUVGLFVBQUYsRUFBY0MsV0FBZCxFQUEyQjtBQUN6RCxRQUFJRSxjQUFjLEdBQUcsSUFBckI7O0FBQ0EsVUFBTUMsU0FBUyxHQUFHQyxnQkFBT1gsS0FBUCxDQUFhTSxVQUFiLENBQWxCOztBQUNBLFFBQUlJLFNBQVMsS0FBSyxJQUFsQixFQUF3QjtBQUN0QixZQUFNLElBQUlFLEtBQUosQ0FBVyxvQ0FBbUNOLFVBQVcsR0FBekQsQ0FBTjtBQUNEOztBQUNELFNBQUssTUFBTU8sT0FBWCxJQUFzQk4sV0FBdEIsRUFBbUM7QUFDakMsWUFBTU8sVUFBVSxHQUFHSCxnQkFBT1gsS0FBUCxDQUFhYSxPQUFiLENBQW5COztBQUNBLFVBQUlDLFVBQVUsS0FBSyxJQUFuQixFQUF5QjtBQUN2QixjQUFNLElBQUlGLEtBQUosQ0FBVyw2Q0FBNENDLE9BQVEsR0FBL0QsQ0FBTjtBQUNEOztBQUVELFVBQUlDLFVBQVUsQ0FBQ0MsVUFBWCxDQUFzQkMsTUFBdEIsR0FBK0IsQ0FBbkMsRUFBc0M7QUFDcEM7QUFDRDs7QUFFRCxVQUFJTixTQUFTLENBQUNPLE9BQVYsQ0FBa0JILFVBQWxCLE1BQWtDLENBQXRDLEVBQXlDO0FBQ3ZDO0FBQ0Q7O0FBRUQsVUFBSUEsVUFBVSxDQUFDSSxLQUFYLEdBQW1CUixTQUFTLENBQUNRLEtBQWpDLEVBQXdDO0FBQ3RDO0FBQ0Q7O0FBR0QsVUFBSVQsY0FBYyxLQUFLLElBQW5CLElBQTJCSyxVQUFVLENBQUNHLE9BQVgsQ0FBbUJSLGNBQW5CLE1BQXVDLENBQXRFLEVBQXlFO0FBQ3ZFQSxRQUFBQSxjQUFjLEdBQUdLLFVBQWpCO0FBQ0Q7QUFDRjs7QUFDRCxRQUFJTCxjQUFKLEVBQW9CO0FBQ2xCQSxNQUFBQSxjQUFjLEdBQUdBLGNBQWMsQ0FBQ1UsTUFBZixFQUFqQjtBQUNEOztBQUNELFdBQU9WLGNBQVA7QUFDRDs7QUFFRCxRQUFNVyxjQUFOLENBQXNCO0FBQUNDLElBQUFBLE1BQUQ7QUFBU0MsSUFBQUEsT0FBVDtBQUFrQkMsSUFBQUE7QUFBbEIsR0FBdEIsRUFBaUQ7QUFDL0MsVUFBTUMsR0FBRyxHQUFHLE1BQU0sS0FBSzlDLElBQUwsQ0FBVSxTQUFWLEVBQXFCLENBQ3JDLFdBRHFDLEVBRXJDLG1CQUZxQyxFQUdyQzZDLE1BQU0sR0FBSSxHQUFFRCxPQUFRLElBQUdDLE1BQU8sRUFBeEIsR0FBNEJELE9BSEcsQ0FBckIsRUFJZjtBQUNEdkMsTUFBQUEsR0FBRyxFQUFFc0MsTUFESjtBQUVEckMsTUFBQUEsSUFBSSxFQUFFLElBRkw7QUFHREMsTUFBQUEsUUFBUSxFQUFFWjtBQUhULEtBSmUsQ0FBbEI7O0FBVUEsUUFBSW1ELEdBQUcsQ0FBQ3hDLElBQVIsRUFBYztBQUdaLFVBQUl3QyxHQUFHLENBQUN4QyxJQUFKLENBQVN5QyxLQUFiLEVBQW9CO0FBQ2xCLGNBQU0sSUFBSWIsS0FBSixDQUFVWSxHQUFHLENBQUN4QyxJQUFKLENBQVN5QyxLQUFuQixDQUFOO0FBQ0Q7O0FBS0QsWUFBTUMsS0FBSyxHQUFHQyxnQkFBRUMsSUFBRixDQUFPLENBQUMsR0FBR0osR0FBRyxDQUFDeEMsSUFBSixDQUFTNkMsS0FBYixFQUFvQixHQUFHTCxHQUFHLENBQUN4QyxJQUFKLENBQVM4QyxPQUFoQyxFQUF5Q0MsR0FBekMsQ0FBOENDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxJQUF0RCxDQUFQLENBQWQ7O0FBQ0EsVUFBSVAsS0FBSyxDQUFDVixNQUFOLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3RCTSxRQUFBQSxPQUFPLEdBQUdJLEtBQUssQ0FBQyxDQUFELENBQWY7QUFDRDtBQUNGOztBQU1ELFVBQU1RLE9BQU8sR0FBRzFDLGNBQUtDLE9BQUwsQ0FBYTRCLE1BQWIsRUFBcUIsY0FBckIsRUFBcUNDLE9BQXJDLEVBQThDLGNBQTlDLENBQWhCOztBQUNBLFFBQUk7QUFDRixhQUFPYSxPQUFPLENBQUNELE9BQUQsQ0FBZDtBQUNELEtBRkQsQ0FFRSxNQUFNO0FBQ04sWUFBTSxJQUFJdEIsS0FBSixDQUFVLGdFQUNBLHVEQURBLEdBRUFzQixPQUZWLENBQU47QUFHRDtBQUNGOztBQUVELFFBQU1FLFdBQU4sQ0FBbUJDLE9BQW5CLEVBQTRCO0FBRzFCLFFBQUlmLE9BQUo7O0FBQ0EsUUFBSTtBQUNGQSxNQUFBQSxPQUFPLEdBQUdhLE9BQU8sQ0FBQzNDLGNBQUtDLE9BQUwsQ0FBYTRDLE9BQWIsRUFBc0IsY0FBdEIsQ0FBRCxDQUFQLENBQStDSixJQUF6RDtBQUNELEtBRkQsQ0FFRSxNQUFNO0FBQ04sWUFBTSxJQUFJckIsS0FBSixDQUFVLHlEQUNDLGFBQVl5QixPQUFRLEVBRC9CLENBQU47QUFFRDs7QUFFRCxVQUFNQyxPQUFPLEdBQUc5QyxjQUFLQyxPQUFMLENBQWEsS0FBS2hCLFVBQWxCLEVBQThCNkMsT0FBOUIsQ0FBaEI7O0FBQ0EsVUFBTUUsR0FBRyxHQUFHLE1BQU0sS0FBSzlDLElBQUwsQ0FBVSxNQUFWLEVBQWtCLENBQUMyRCxPQUFELENBQWxCLEVBQTZCO0FBQUN0RCxNQUFBQSxHQUFHLEVBQUV1RCxPQUFOO0FBQWVyRCxNQUFBQSxRQUFRLEVBQUVYO0FBQXpCLEtBQTdCLENBQWxCOztBQUNBLFFBQUlrRCxHQUFHLENBQUN4QyxJQUFKLElBQVl3QyxHQUFHLENBQUN4QyxJQUFKLENBQVN5QyxLQUF6QixFQUFnQztBQUM5QixZQUFNLElBQUliLEtBQUosQ0FBVVksR0FBRyxDQUFDeEMsSUFBSixDQUFTeUMsS0FBbkIsQ0FBTjtBQUNEOztBQUdELFFBQUk7QUFDRixhQUFPVSxPQUFPLENBQUMzQyxjQUFLQyxPQUFMLENBQWE2QyxPQUFiLEVBQXNCLGNBQXRCLEVBQXNDaEIsT0FBdEMsRUFBK0MsY0FBL0MsQ0FBRCxDQUFkO0FBQ0QsS0FGRCxDQUVFLE1BQU07QUFDTixZQUFNLElBQUlWLEtBQUosQ0FBVSw0REFDQSxpQ0FEVixDQUFOO0FBRUQ7QUFDRjs7QUFFRCxRQUFNMkIsZ0JBQU4sQ0FBd0JsQixNQUF4QixFQUFnQ2xCLEdBQWhDLEVBQXFDO0FBQ25DLFVBQU0sS0FBS3pCLElBQUwsQ0FBVSxXQUFWLEVBQXVCLENBQUN5QixHQUFELENBQXZCLEVBQThCO0FBQ2xDcEIsTUFBQUEsR0FBRyxFQUFFc0MsTUFENkI7QUFFbENwQyxNQUFBQSxRQUFRLEVBQUVaO0FBRndCLEtBQTlCLENBQU47QUFJRDs7QUE1S3NCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBta2RpcnAsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5cbmNvbnN0IElOU1RBTExfTE9DS0ZJTEUgPSAnLmFwcGl1bS5pbnN0YWxsLmxvY2snO1xuY29uc3QgTElOS19MT0NLRklMRSA9ICcuYXBwaXVtLmxpbmsubG9jayc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5QTSB7XG5cbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUpIHtcbiAgICB0aGlzLmFwcGl1bUhvbWUgPSBhcHBpdW1Ib21lO1xuICB9XG5cbiAgYXN5bmMgZXhlYyAoY21kLCBhcmdzLCBvcHRzLCBleGVjT3B0cyA9IHt9KSB7XG4gICAgbGV0IHsgY3dkLCBqc29uLCBsb2NrRmlsZSB9ID0gb3B0cztcbiAgICBpZiAoIWN3ZCkge1xuICAgICAgY3dkID0gdGhpcy5hcHBpdW1Ib21lO1xuICAgIH1cbiAgICAvLyBlbnN1cmUgdGhlIGRpcmVjdG9yeSB3ZSB3YW50IHRvIGluc3RhbGwgaW5zaWRlIG9mIGV4aXN0c1xuICAgIGF3YWl0IG1rZGlycChjd2QpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHdlIHBlcmZvcm0gdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGluIGN3ZFxuICAgIGV4ZWNPcHRzID0gey4uLmV4ZWNPcHRzLCBjd2R9O1xuXG4gICAgYXJncy51bnNoaWZ0KGNtZCk7XG4gICAgaWYgKGpzb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLWpzb24nKTtcbiAgICB9XG4gICAgbGV0IHJ1bm5lciA9IGFzeW5jICgpID0+IGF3YWl0IGV4ZWMoJ25wbScsIGFyZ3MsIGV4ZWNPcHRzKTtcbiAgICBpZiAobG9ja0ZpbGUpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVMb2NrID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKHBhdGgucmVzb2x2ZShjd2QsIGxvY2tGaWxlKSk7XG4gICAgICBjb25zdCBfcnVubmVyID0gcnVubmVyO1xuICAgICAgcnVubmVyID0gYXN5bmMgKCkgPT4gYXdhaXQgYWNxdWlyZUxvY2soX3J1bm5lcik7XG4gICAgfVxuICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBydW5uZXIoKTtcbiAgICBjb25zdCByZXQgPSB7c3Rkb3V0LCBzdGRlcnIsIGNvZGUsIGpzb246IG51bGx9O1xuXG4gICAgaWYgKGpzb24pIHtcbiAgICAgIC8vIGlmIHBvc3NpYmxlLCBwYXJzZSBOUE0ncyBqc29uIG91dHB1dC4gRHVyaW5nIE5QTSBpbnN0YWxsIDNyZC1wYXJ0eVxuICAgICAgLy8gcGFja2FnZXMgY2FuIHdyaXRlIHRvIHN0ZG91dCwgc28gc29tZXRpbWVzIHRoZSBqc29uIG91dHB1dCBjYW4ndCBiZVxuICAgICAgLy8gZ3VhcmFudGVlZCB0byBiZSBwYXJzZWFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldC5qc29uID0gSlNPTi5wYXJzZShzdGRvdXQpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBhc3luYyBnZXRMYXRlc3RWZXJzaW9uIChwa2cpIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZXhlYygndmlldycsIFtwa2csICdkaXN0LXRhZ3MnXSwge1xuICAgICAganNvbjogdHJ1ZVxuICAgIH0pKS5qc29uLmxhdGVzdDtcbiAgfVxuXG4gIGFzeW5jIGdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiAocGtnLCBjdXJWZXJzaW9uKSB7XG4gICAgY29uc3QgYWxsVmVyc2lvbnMgPSAoYXdhaXQgdGhpcy5leGVjKCd2aWV3JywgW3BrZywgJ3ZlcnNpb25zJ10sIHtcbiAgICAgIGpzb246IHRydWVcbiAgICB9KSkuanNvbjtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RTYWZlVXBncmFkZUZyb21WZXJzaW9ucyhjdXJWZXJzaW9uLCBhbGxWZXJzaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBjdXJyZW50IHZlcnNpb24gYW5kIGEgbGlzdCBvZiBhbGwgdmVyc2lvbnMgZm9yIGEgcGFja2FnZSwgcmV0dXJuIHRoZSB2ZXJzaW9uIHdoaWNoIGlzXG4gICAqIHRoZSBoaWdoZXN0IHNhZmVseS11cGdyYWRhYmxlIHZlcnNpb24gKG1lYW5pbmcgbm90IGNyb3NzaW5nIGFueSBtYWpvciByZXZpc2lvbiBib3VuZGFyaWVzLCBhbmRcbiAgICogbm90IGluY2x1ZGluZyBhbnkgYWxwaGEvYmV0YS9yYyB2ZXJzaW9ucylcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1clZlcnNpb24gLSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGEgcGFja2FnZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFsbFZlcnNpb25zIC0gYSBsaXN0IG9mIHZlcnNpb24gc3RyaW5nc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH0gLSB0aGUgaGlnaGVzdCBzYWZlbHktdXBncmFkYWJsZSB2ZXJzaW9uLCBvciBudWxsIGlmIHRoZXJlIGlzbid0IG9uZVxuICAgKi9cbiAgZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVGcm9tVmVyc2lvbnMgKGN1clZlcnNpb24sIGFsbFZlcnNpb25zKSB7XG4gICAgbGV0IHNhZmVVcGdyYWRlVmVyID0gbnVsbDtcbiAgICBjb25zdCBjdXJTZW12ZXIgPSBzZW12ZXIucGFyc2UoY3VyVmVyc2lvbik7XG4gICAgaWYgKGN1clNlbXZlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgY3VycmVudCB2ZXJzaW9uICcke2N1clZlcnNpb259J2ApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRlc3RWZXIgb2YgYWxsVmVyc2lvbnMpIHtcbiAgICAgIGNvbnN0IHRlc3RTZW12ZXIgPSBzZW12ZXIucGFyc2UodGVzdFZlcik7XG4gICAgICBpZiAodGVzdFNlbXZlciA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSB2ZXJzaW9uIHRvIHRlc3QgYWdhaW5zdDogJyR7dGVzdFZlcn0nYCk7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgdGVzdCB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgaWdub3JlIGl0XG4gICAgICBpZiAodGVzdFNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGxhdGVyIHRoYW4gdGhlIHRlc3QgdmVyc2lvbiwgc2tpcCB0aGlzIHRlc3QgdmVyc2lvblxuICAgICAgaWYgKGN1clNlbXZlci5jb21wYXJlKHRlc3RTZW12ZXIpID09PSAxKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIHRlc3QgdmVyc2lvbiBpcyBuZXdlciwgYnV0IGNyb3NzZXMgYSBtYWpvciByZXZpc2lvbiBib3VuZGFyeSwgYWxzbyBza2lwIGl0XG4gICAgICBpZiAodGVzdFNlbXZlci5tYWpvciA+IGN1clNlbXZlci5tYWpvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIG90aGVyd2lzZSB0aGlzIHZlcnNpb24gaXMgc2FmZSB0byB1cGdyYWRlIHRvLiBCdXQgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb25lcyBvZiB0aGlzXG4gICAgICAvLyBraW5kLCBzbyBrZWVwIGl0ZXJhdGluZyBhbmQga2VlcGluZyB0aGUgaGlnaGVzdFxuICAgICAgaWYgKHNhZmVVcGdyYWRlVmVyID09PSBudWxsIHx8IHRlc3RTZW12ZXIuY29tcGFyZShzYWZlVXBncmFkZVZlcikgPT09IDEpIHtcbiAgICAgICAgc2FmZVVwZ3JhZGVWZXIgPSB0ZXN0U2VtdmVyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2FmZVVwZ3JhZGVWZXIpIHtcbiAgICAgIHNhZmVVcGdyYWRlVmVyID0gc2FmZVVwZ3JhZGVWZXIuZm9ybWF0KCk7XG4gICAgfVxuICAgIHJldHVybiBzYWZlVXBncmFkZVZlcjtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxQYWNrYWdlICh7cGtnRGlyLCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5leGVjKCdpbnN0YWxsJywgW1xuICAgICAgJy0tbm8tc2F2ZScsXG4gICAgICAnLS1uby1wYWNrYWdlLWxvY2snLFxuICAgICAgcGtnVmVyID8gYCR7cGtnTmFtZX1AJHtwa2dWZXJ9YCA6IHBrZ05hbWVcbiAgICBdLCB7XG4gICAgICBjd2Q6IHBrZ0RpcixcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBsb2NrRmlsZTogSU5TVEFMTF9MT0NLRklMRVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5qc29uKSB7XG4gICAgICAvLyB3ZSBwYXJzZWQgYSB2YWxpZCBqc29uIHJlc3BvbnNlLCBzbyBpZiB3ZSBnb3QgYW4gZXJyb3IgaGVyZSwgcmV0dXJuIHRoYXRcbiAgICAgIC8vIG1lc3NhZ2Ugc3RyYWlnaHRhd2F5XG4gICAgICBpZiAocmVzLmpzb24uZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5qc29uLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgdHJpZWQgdG8gaW5zdGFsbCBhIHBhY2thZ2UgdmlhIGdpdC9naXRodWIsIHdlIG1pZ2h0IG5vdCBoYXZlIGJlZW5cbiAgICAgIC8vIGNlcnRhaW4gb2YgdGhlIHBhY2thZ2UgbmFtZSwgc28gaWYgd2UgY2FuIHJldHJpZXZlIGl0IHVuYW1iaWd1b3VzbHkgZnJvbVxuICAgICAgLy8gdGhlIGpzb24gcmVwb3J0IG9mIHRoZSBpbnN0YWxsLCBkbyBzb1xuICAgICAgY29uc3QgbmFtZXMgPSBfLnVuaXEoWy4uLnJlcy5qc29uLmFkZGVkLCAuLi5yZXMuanNvbi51cGRhdGVkXS5tYXAoKHgpID0+IHgubmFtZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBwa2dOYW1lID0gbmFtZXNbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IHJlYWQgcGFja2FnZSBkYXRhIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlIHRvIHJldHVybiwgYW5kIG1ha2Ugc3VyZVxuICAgIC8vIGV2ZXJ5dGhpbmcgZ290IGluc3RhbGxlZCBvay4gUmVtZW1iZXIsIHBrZ05hbWUgbWlnaHQgZW5kIHVwIHdpdGggYSAvIGluIGl0IGR1ZSB0byBhbiBucG1cbiAgICAvLyBvcmcsIHNvIGlmIHNvLCB0aGF0IHdpbGwgZ2V0IGNvcnJlY3RseSBleHBsb2RlZCBpbnRvIG11bHRpcGxlIGRpcmVjdG9yaWVzLCBieSBwYXRoLnJlc29sdmUgaGVyZVxuICAgIC8vIChldmVuIG9uIFdpbmRvd3MhKVxuICAgIGNvbnN0IHBrZ0pzb24gPSBwYXRoLnJlc29sdmUocGtnRGlyLCAnbm9kZV9tb2R1bGVzJywgcGtnTmFtZSwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZShwa2dKc29uKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHBhY2thZ2Ugd2FzIG5vdCBkb3dubG9hZGVkIGNvcnJlY3RseTsgaXRzIHBhY2thZ2UuanNvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAnZGlkIG5vdCBleGlzdCBvciB3YXMgdW5yZWFkYWJsZS4gV2UgbG9va2VkIGZvciBpdCBhdCAnICtcbiAgICAgICAgICAgICAgICAgICAgICBwa2dKc29uKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaW5rUGFja2FnZSAocGtnUGF0aCkge1xuICAgIC8vIGZyb20gdGhlIHBhdGggYWxvbmUgd2UgZG9uJ3Qga25vdyB0aGUgbnBtIHBhY2thZ2UgbmFtZSwgc28gd2UgbmVlZCB0b1xuICAgIC8vIGxvb2sgaW4gcGFja2FnZS5qc29uXG4gICAgbGV0IHBrZ05hbWU7XG4gICAgdHJ5IHtcbiAgICAgIHBrZ05hbWUgPSByZXF1aXJlKHBhdGgucmVzb2x2ZShwa2dQYXRoLCAncGFja2FnZS5qc29uJykpLm5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHBhY2thZ2UuanNvbiBpbnNpZGUgdGhlIHBhY2thZ2UgcGF0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICBgcHJvdmlkZWQ6ICR7cGtnUGF0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwa2dIb21lID0gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5leGVjKCdsaW5rJywgW3BrZ1BhdGhdLCB7Y3dkOiBwa2dIb21lLCBsb2NrRmlsZTogTElOS19MT0NLRklMRX0pO1xuICAgIGlmIChyZXMuanNvbiAmJiByZXMuanNvbi5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5qc29uLmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBub3cgZW5zdXJlIGl0IHdhcyBsaW5rZWQgdG8gdGhlIGNvcnJlY3QgcGxhY2VcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aC5yZXNvbHZlKHBrZ0hvbWUsICdub2RlX21vZHVsZXMnLCBwa2dOYW1lLCAncGFja2FnZS5qc29uJykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGFja2FnZSB3YXMgbm90IGxpbmtlZCBjb3JyZWN0bHk7IGl0cyBwYWNrYWdlLmpzb24gJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2RpZCBub3QgZXhpc3Qgb3Igd2FzIHVucmVhZGFibGUnKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1bmluc3RhbGxQYWNrYWdlIChwa2dEaXIsIHBrZykge1xuICAgIGF3YWl0IHRoaXMuZXhlYygndW5pbnN0YWxsJywgW3BrZ10sIHtcbiAgICAgIGN3ZDogcGtnRGlyLFxuICAgICAgbG9ja0ZpbGU6IElOU1RBTExfTE9DS0ZJTEVcbiAgICB9KTtcbiAgfVxufVxuIl0sImZpbGUiOiJsaWIvY2xpL25wbS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
220
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvbnBtLmpzIl0sIm5hbWVzIjpbIklOU1RBTExfTE9DS0ZJTEUiLCJMSU5LX0xPQ0tGSUxFIiwiTlBNIiwiY29uc3RydWN0b3IiLCJhcHBpdW1Ib21lIiwiZXhlYyIsImNtZCIsImFyZ3MiLCJvcHRzIiwiZXhlY09wdHMiLCJjd2QiLCJqc29uIiwibG9ja0ZpbGUiLCJkdW1teVBrZ0pzb24iLCJwYXRoIiwicmVzb2x2ZSIsImZzIiwiZXhpc3RzIiwid3JpdGVGaWxlIiwidW5zaGlmdCIsInB1c2giLCJucG1DbWQiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJydW5uZXIiLCJhY3F1aXJlTG9jayIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwiX3J1bm5lciIsInJldCIsInN0ZG91dCIsInN0ZGVyciIsImNvZGUiLCJKU09OIiwicGFyc2UiLCJpZ24iLCJlIiwiZXJyIiwiRXJyb3IiLCJqb2luIiwidHJpbSIsImdldExhdGVzdFZlcnNpb24iLCJwa2ciLCJsYXRlc3QiLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJjdXJWZXJzaW9uIiwiYWxsVmVyc2lvbnMiLCJnZXRMYXRlc3RTYWZlVXBncmFkZUZyb21WZXJzaW9ucyIsInNhZmVVcGdyYWRlVmVyIiwiY3VyU2VtdmVyIiwic2VtdmVyIiwidGVzdFZlciIsInRlc3RTZW12ZXIiLCJwcmVyZWxlYXNlIiwibGVuZ3RoIiwiY29tcGFyZSIsIm1ham9yIiwiZm9ybWF0IiwiaW5zdGFsbFBhY2thZ2UiLCJwa2dEaXIiLCJwa2dOYW1lIiwicGtnVmVyIiwicmVzIiwiZXJyb3IiLCJwa2dKc29uIiwicmVxdWlyZSIsImxpbmtQYWNrYWdlIiwicGtnUGF0aCIsIm5hbWUiLCJwcm9jZXNzIiwicGtnSG9tZSIsInVuaW5zdGFsbFBhY2thZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsZ0JBQWdCLEdBQUcsc0JBQXpCO0FBQ0EsTUFB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QUl0QixLQUFKLENBQVUsNERBQ0EsaUNBRFYsQ0FBTjtBQUVEO0FBQ0Y7O0FBTXFCLFFBQWhCaUMsZ0JBQWdCLENBQUVaLE1BQUYsRUFBVWpCLEdBQVYsRUFBZTtBQUNuQyxVQUFNLEtBQUtyQyxJQUFMLENBQVUsV0FBVixFQUF1QixDQUFDcUMsR0FBRCxDQUF2QixFQUE4QjtBQUNsQ2hDLE1BQUFBLEdBQUcsRUFBRWlELE1BRDZCO0FBRWxDL0MsTUFBQUEsUUFBUSxFQUFFWjtBQUZ3QixLQUE5QixDQUFOO0FBSUQ7O0FBdk5zQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIG1rZGlycCwgdXRpbCwgc3lzdGVtIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgSU5TVEFMTF9MT0NLRklMRSA9ICcuYXBwaXVtLmluc3RhbGwubG9jayc7XG5jb25zdCBMSU5LX0xPQ0tGSUxFID0gJy5hcHBpdW0ubGluay5sb2NrJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTlBNIHtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgdGhpcy5hcHBpdW1Ib21lID0gYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGBucG1gIHdpdGggZ2l2ZW4gYXJncy5cbiAgICpcbiAgICogSWYgdGhlIHByb2Nlc3MgZXhpdHMgd2l0aCBhIG5vbnplcm8gY29kZSwgdGhlIGNvbnRlbnRzIG9mIGBTVERPVVRgIGFuZCBgU1RERVJSYCB3aWxsIGJlIGluIHRoZVxuICAgKiBgbWVzc2FnZWAgb2YgdGhlIHtAbGluayBUZWVuUHJvY2Vzc0V4ZWNFcnJvcn0gcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJnc1xuICAgKiBAcGFyYW0ge3sganNvbj86IGJvb2xlYW47IGN3ZD86IHN0cmluZzsgbG9ja0ZpbGU/OiBzdHJpbmc7IH19IG9wdHNcbiAgICovXG4gIGFzeW5jIGV4ZWMgKGNtZCwgYXJncywgb3B0cywgZXhlY09wdHMgPSB7fSkge1xuICAgIGxldCB7IGN3ZCwganNvbiwgbG9ja0ZpbGUgfSA9IG9wdHM7XG4gICAgaWYgKCFjd2QpIHtcbiAgICAgIGN3ZCA9IHRoaXMuYXBwaXVtSG9tZTtcbiAgICB9XG4gICAgLy8gZW5zdXJlIHRoZSBkaXJlY3Rvcnkgd2Ugd2FudCB0byBpbnN0YWxsIGluc2lkZSBvZiBleGlzdHNcbiAgICBhd2FpdCBta2RpcnAoY3dkKTtcblxuICAgIC8vIG5vdCBvbmx5IHRoaXMsIHRoaXMgZGlyZWN0b3J5IG5lZWRzIGEgJ3BhY2thZ2UuanNvbicgaW5zaWRlIG9mIGl0LCBvdGhlcndpc2UsIGlmIGFueVxuICAgIC8vIGRpcmVjdG9yeSBpbiB0aGUgZmlsZXN5c3RlbSB0cmVlIEFCT1ZFIGN3ZCBoYXBwZW5zIHRvIGhhdmUgYSBwYWNrYWdlLmpzb24gb3IgYSBub2RlX21vZHVsZXNcbiAgICAvLyBkaXIgaW4gaXQsIE5QTSB3aWxsIGluc3RhbGwgdGhlIG1vZHVsZSB1cCB0aGVyZSBpbnN0ZWFkIChzaWxseSBOUE0pXG4gICAgY29uc3QgZHVtbXlQa2dKc29uID0gcGF0aC5yZXNvbHZlKGN3ZCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGR1bW15UGtnSnNvbikpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShkdW1teVBrZ0pzb24sICd7fScpO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB3ZSBwZXJmb3JtIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBpbiBjd2RcbiAgICBleGVjT3B0cyA9IHsuLi5leGVjT3B0cywgY3dkfTtcblxuICAgIGFyZ3MudW5zaGlmdChjbWQpO1xuICAgIGlmIChqc29uKSB7XG4gICAgICBhcmdzLnB1c2goJy0tanNvbicpO1xuICAgIH1cbiAgICBjb25zdCBucG1DbWQgPSBzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnbnBtLmNtZCcgOiAnbnBtJztcbiAgICBsZXQgcnVubmVyID0gYXN5bmMgKCkgPT4gYXdhaXQgZXhlYyhucG1DbWQsIGFyZ3MsIGV4ZWNPcHRzKTtcbiAgICBpZiAobG9ja0ZpbGUpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVMb2NrID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKHBhdGgucmVzb2x2ZShjd2QsIGxvY2tGaWxlKSk7XG4gICAgICBjb25zdCBfcnVubmVyID0gcnVubmVyO1xuICAgICAgcnVubmVyID0gYXN5bmMgKCkgPT4gYXdhaXQgYWNxdWlyZUxvY2soX3J1bm5lcik7XG4gICAgfVxuXG4gICAgbGV0IHJldDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyLCBjb2RlfSA9IGF3YWl0IHJ1bm5lcigpO1xuICAgICAgcmV0ID0gLyoqIEB0eXBlIHtUZWVuUHJvY2Vzc0V4ZWNSZXN1bHR9ICovKHtzdGRvdXQsIHN0ZGVyciwgY29kZX0pO1xuICAgICAgLy8gaWYgcG9zc2libGUsIHBhcnNlIE5QTSdzIGpzb24gb3V0cHV0LiBEdXJpbmcgTlBNIGluc3RhbGwgM3JkLXBhcnR5XG4gICAgICAvLyBwYWNrYWdlcyBjYW4gd3JpdGUgdG8gc3Rkb3V0LCBzbyBzb21ldGltZXMgdGhlIGpzb24gb3V0cHV0IGNhbid0IGJlXG4gICAgICAvLyBndWFyYW50ZWVkIHRvIGJlIHBhcnNlYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0Lmpzb24gPSBKU09OLnBhcnNlKHN0ZG91dCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyLCBjb2RlfSA9IC8qKiBAdHlwZSB7VGVlblByb2Nlc3NFeGVjRXJyb3J9ICovKGUpO1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBucG0gY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0uXFxuXFxuU1RET1VUOlxcbiR7c3Rkb3V0LnRyaW0oKX1cXG5cXG5TVERFUlI6XFxuJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dcbiAgICovXG4gIGFzeW5jIGdldExhdGVzdFZlcnNpb24gKHBrZykge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5leGVjKCd2aWV3JywgW3BrZywgJ2Rpc3QtdGFncyddLCB7XG4gICAgICBqc29uOiB0cnVlXG4gICAgfSkpLmpzb24/LmxhdGVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJWZXJzaW9uXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24gKHBrZywgY3VyVmVyc2lvbikge1xuICAgIGNvbnN0IGFsbFZlcnNpb25zID0gKGF3YWl0IHRoaXMuZXhlYygndmlldycsIFtwa2csICd2ZXJzaW9ucyddLCB7XG4gICAgICBqc29uOiB0cnVlXG4gICAgfSkpLmpzb247XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVGcm9tVmVyc2lvbnMoY3VyVmVyc2lvbiwgYWxsVmVyc2lvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgY3VycmVudCB2ZXJzaW9uIGFuZCBhIGxpc3Qgb2YgYWxsIHZlcnNpb25zIGZvciBhIHBhY2thZ2UsIHJldHVybiB0aGUgdmVyc2lvbiB3aGljaCBpc1xuICAgKiB0aGUgaGlnaGVzdCBzYWZlbHktdXBncmFkYWJsZSB2ZXJzaW9uIChtZWFuaW5nIG5vdCBjcm9zc2luZyBhbnkgbWFqb3IgcmV2aXNpb24gYm91bmRhcmllcywgYW5kXG4gICAqIG5vdCBpbmNsdWRpbmcgYW55IGFscGhhL2JldGEvcmMgdmVyc2lvbnMpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJWZXJzaW9uIC0gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBhIHBhY2thZ2VcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhbGxWZXJzaW9ucyAtIGEgbGlzdCBvZiB2ZXJzaW9uIHN0cmluZ3NcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9IC0gdGhlIGhpZ2hlc3Qgc2FmZWx5LXVwZ3JhZGFibGUgdmVyc2lvbiwgb3IgbnVsbCBpZiB0aGVyZSBpc24ndCBvbmVcbiAgICovXG4gIGdldExhdGVzdFNhZmVVcGdyYWRlRnJvbVZlcnNpb25zIChjdXJWZXJzaW9uLCBhbGxWZXJzaW9ucykge1xuICAgIGxldCBzYWZlVXBncmFkZVZlciA9IG51bGw7XG4gICAgY29uc3QgY3VyU2VtdmVyID0gc2VtdmVyLnBhcnNlKGN1clZlcnNpb24pO1xuICAgIGlmIChjdXJTZW12ZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIGN1cnJlbnQgdmVyc2lvbiAnJHtjdXJWZXJzaW9ufSdgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0ZXN0VmVyIG9mIGFsbFZlcnNpb25zKSB7XG4gICAgICBjb25zdCB0ZXN0U2VtdmVyID0gc2VtdmVyLnBhcnNlKHRlc3RWZXIpO1xuICAgICAgaWYgKHRlc3RTZW12ZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiB0byB0ZXN0IGFnYWluc3Q6ICcke3Rlc3RWZXJ9J2ApO1xuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIHRlc3QgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGlnbm9yZSBpdFxuICAgICAgaWYgKHRlc3RTZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBsYXRlciB0aGFuIHRoZSB0ZXN0IHZlcnNpb24sIHNraXAgdGhpcyB0ZXN0IHZlcnNpb25cbiAgICAgIGlmIChjdXJTZW12ZXIuY29tcGFyZSh0ZXN0U2VtdmVyKSA9PT0gMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZSB0ZXN0IHZlcnNpb24gaXMgbmV3ZXIsIGJ1dCBjcm9zc2VzIGEgbWFqb3IgcmV2aXNpb24gYm91bmRhcnksIGFsc28gc2tpcCBpdFxuICAgICAgaWYgKHRlc3RTZW12ZXIubWFqb3IgPiBjdXJTZW12ZXIubWFqb3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2UgdGhpcyB2ZXJzaW9uIGlzIHNhZmUgdG8gdXBncmFkZSB0by4gQnV0IHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIG9uZXMgb2YgdGhpc1xuICAgICAgLy8ga2luZCwgc28ga2VlcCBpdGVyYXRpbmcgYW5kIGtlZXBpbmcgdGhlIGhpZ2hlc3RcbiAgICAgIGlmIChzYWZlVXBncmFkZVZlciA9PT0gbnVsbCB8fCB0ZXN0U2VtdmVyLmNvbXBhcmUoc2FmZVVwZ3JhZGVWZXIpID09PSAxKSB7XG4gICAgICAgIHNhZmVVcGdyYWRlVmVyID0gdGVzdFNlbXZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNhZmVVcGdyYWRlVmVyKSB7XG4gICAgICBzYWZlVXBncmFkZVZlciA9IHNhZmVVcGdyYWRlVmVyLmZvcm1hdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2FmZVVwZ3JhZGVWZXI7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHt7cGtnRGlyOiBzdHJpbmcsIHBrZ05hbWU6IHN0cmluZywgcGtnVmVyPzogc3RyaW5nfX0gcGFyYW0wXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydCgndHlwZS1mZXN0JykuUGFja2FnZUpzb24+fVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFBhY2thZ2UgKHtwa2dEaXIsIHBrZ05hbWUsIHBrZ1Zlcn0pIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWMoJ2luc3RhbGwnLCBbXG4gICAgICAnLS1uby1zYXZlJyxcbiAgICAgICctLW5vLXBhY2thZ2UtbG9jaycsXG4gICAgICBwa2dWZXIgPyBgJHtwa2dOYW1lfUAke3BrZ1Zlcn1gIDogcGtnTmFtZVxuICAgIF0sIHtcbiAgICAgIGN3ZDogcGtnRGlyLFxuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIGxvY2tGaWxlOiBJTlNUQUxMX0xPQ0tGSUxFXG4gICAgfSk7XG5cbiAgICBpZiAocmVzLmpzb24pIHtcbiAgICAgIC8vIHdlIHBhcnNlZCBhIHZhbGlkIGpzb24gcmVzcG9uc2UsIHNvIGlmIHdlIGdvdCBhbiBlcnJvciBoZXJlLCByZXR1cm4gdGhhdFxuICAgICAgLy8gbWVzc2FnZSBzdHJhaWdodGF3YXlcbiAgICAgIGlmIChyZXMuanNvbi5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLmpzb24uZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdyByZWFkIHBhY2thZ2UgZGF0YSBmcm9tIHRoZSBpbnN0YWxsZWQgcGFja2FnZSB0byByZXR1cm4sIGFuZCBtYWtlIHN1cmVcbiAgICAvLyBldmVyeXRoaW5nIGdvdCBpbnN0YWxsZWQgb2suIFJlbWVtYmVyLCBwa2dOYW1lIG1pZ2h0IGVuZCB1cCB3aXRoIGEgLyBpbiBpdCBkdWUgdG8gYW4gbnBtXG4gICAgLy8gb3JnLCBzbyBpZiBzbywgdGhhdCB3aWxsIGdldCBjb3JyZWN0bHkgZXhwbG9kZWQgaW50byBtdWx0aXBsZSBkaXJlY3RvcmllcywgYnkgcGF0aC5yZXNvbHZlIGhlcmVcbiAgICAvLyAoZXZlbiBvbiBXaW5kb3dzISlcbiAgICBjb25zdCBwa2dKc29uID0gcGF0aC5yZXNvbHZlKHBrZ0RpciwgJ25vZGVfbW9kdWxlcycsIHBrZ05hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUocGtnSnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwYWNrYWdlIHdhcyBub3QgZG93bmxvYWRlZCBjb3JyZWN0bHk7IGl0cyBwYWNrYWdlLmpzb24gJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2RpZCBub3QgZXhpc3Qgb3Igd2FzIHVucmVhZGFibGUuIFdlIGxvb2tlZCBmb3IgaXQgYXQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgcGtnSnNvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dQYXRoXG4gICAqL1xuICBhc3luYyBsaW5rUGFja2FnZSAocGtnUGF0aCkge1xuICAgIC8vIGZyb20gdGhlIHBhdGggYWxvbmUgd2UgZG9uJ3Qga25vdyB0aGUgbnBtIHBhY2thZ2UgbmFtZSwgc28gd2UgbmVlZCB0b1xuICAgIC8vIGxvb2sgaW4gcGFja2FnZS5qc29uXG4gICAgbGV0IHBrZ05hbWU7XG4gICAgdHJ5IHtcbiAgICAgIHBrZ05hbWUgPSByZXF1aXJlKHBhdGgucmVzb2x2ZShwa2dQYXRoLCAncGFja2FnZS5qc29uJykpLm5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHBhY2thZ2UuanNvbiBpbnNpZGUgdGhlIHBhY2thZ2UgcGF0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICBgcHJvdmlkZWQ6ICR7cGtnUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGlzIGFkZGVkIHRvIGhhbmRsZSBjb21tYW5kcyB3aXRoIHJlbGF0aXZlIHBhdGhzXG4gICAgLy8gaWU6IFwibm9kZSAuIGRyaXZlciBpbnN0YWxsIC0tc291cmNlPWxvY2FsIC4uL2Zha2UtZHJpdmVyXCJcbiAgICBwa2dQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHBrZ1BhdGgpO1xuXG4gICAgY29uc3QgcGtnSG9tZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuXG4gICAgLy8gY2FsbCBsaW5rIHdpdGggLS1uby1wYWNrYWdlLWxvY2sgdG8gZW5zdXJlIG5vIGNvcnJ1cHRpb24gd2hpbGUgaW5zdGFsbGluZyBsb2NhbCBwYWNrYWdlc1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlYygnbGluaycsIFsnLS1uby1wYWNrYWdlLWxvY2snLCBwa2dQYXRoXSwge2N3ZDogcGtnSG9tZSwgbG9ja0ZpbGU6IExJTktfTE9DS0ZJTEV9KTtcbiAgICBpZiAocmVzLmpzb24gJiYgcmVzLmpzb24uZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuanNvbi5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gbm93IGVuc3VyZSBpdCB3YXMgbGlua2VkIHRvIHRoZSBjb3JyZWN0IHBsYWNlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiByZXF1aXJlKHBhdGgucmVzb2x2ZShwa2dIb21lLCAnbm9kZV9tb2R1bGVzJywgcGtnTmFtZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHBhY2thZ2Ugd2FzIG5vdCBsaW5rZWQgY29ycmVjdGx5OyBpdHMgcGFja2FnZS5qc29uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdkaWQgbm90IGV4aXN0IG9yIHdhcyB1bnJlYWRhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dEaXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrZ1xuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsUGFja2FnZSAocGtnRGlyLCBwa2cpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWMoJ3VuaW5zdGFsbCcsIFtwa2ddLCB7XG4gICAgICBjd2Q6IHBrZ0RpcixcbiAgICAgIGxvY2tGaWxlOiBJTlNUQUxMX0xPQ0tGSUxFXG4gICAgfSk7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIGEgbm9uLXplcm8tZXhpdCBleGVjdXRpb24gb2YgYGFwcGl1bWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlZW5Qcm9jZXNzRXhlY1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIFN0ZG91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIFN0ZGVyclxuICogQHByb3BlcnR5IHtudW1iZXI/fSBjb2RlIC0gRXhpdCBjb2RlXG4gKiBAcHJvcGVydHkge2FueX0ganNvbiAtIEpTT04gcGFyc2VkIGZyb20gc3Rkb3V0XG4gKi9cblxuLyoqXG4gKiBFeHRyYSBwcm9wcyBgdGVlbl9wcm9jZXNzLmV4ZWNgIGFkZHMgdG8gaXRzIGVycm9yIG9iamVjdHNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlZW5Qcm9jZXNzRXhlY0Vycm9yUHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBTVERPVVRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBTVERFUlJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gY29kZSAtIEV4aXQgY29kZVxuICovXG5cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgYHRlZW5fcHJvY2Vzcy5leGVjYFxuICogQHR5cGVkZWYge0Vycm9yICYgVGVlblByb2Nlc3NFeGVjRXJyb3JQcm9wc30gVGVlblByb2Nlc3NFeGVjRXJyb3JcbiAqL1xuIl0sImZpbGUiOiJsaWIvY2xpL25wbS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|