@nikovirtala/projen-constructs 0.3.2 → 0.3.4
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/.jsii +271 -283
- package/README.md +144 -11
- package/docs/api/classes/AwsCdkConstructLibraryProject.html +1 -1
- package/docs/api/classes/AwsCdkTypeScriptAppProject.html +1 -1
- package/docs/api/classes/JsiiProject.html +1 -1
- package/docs/api/classes/TypeScriptProject.html +1 -1
- package/docs/api/index.html +152 -12
- package/docs/api/interfaces/AwsCdkConstructLibraryProjectOptions.html +4 -7
- package/docs/api/interfaces/AwsCdkTypeScriptAppProjectOptions.html +4 -7
- package/docs/api/interfaces/JsiiProjectOptions.html +4 -7
- package/docs/api/interfaces/TypeScriptProjectOptions.html +4 -7
- package/lib/components/bundle-lambda-function-code.js +3 -3
- package/lib/components/colima.js +1 -1
- package/lib/components/homebrew.js +1 -1
- package/lib/components/lambda-function-construct-generator.js +1 -1
- package/lib/components/localstack.js +1 -1
- package/lib/components/mise.js +1 -1
- package/lib/components/typedoc.js +1 -1
- package/lib/components/vitest.js +1 -1
- package/lib/project-generator.d.ts +17 -1
- package/lib/project-generator.js +47 -4
- package/lib/projects/awscdk-construct-library-options.generated.d.ts +1 -2
- package/lib/projects/awscdk-construct-library-options.generated.js +1 -1
- package/lib/projects/awscdk-construct-library.generated.js +1 -1
- package/lib/projects/awscdk-typescript-app-options.generated.d.ts +1 -2
- package/lib/projects/awscdk-typescript-app-options.generated.js +1 -1
- package/lib/projects/awscdk-typescript-app.generated.js +1 -1
- package/lib/projects/jsii-options.generated.d.ts +1 -2
- package/lib/projects/jsii-options.generated.js +1 -1
- package/lib/projects/jsii.generated.js +1 -1
- package/lib/projects/typescript-options.generated.d.ts +1 -2
- package/lib/projects/typescript-options.generated.js +1 -1
- package/lib/projects/typescript.generated.js +1 -1
- package/package.json +5 -5
package/lib/project-generator.js
CHANGED
|
@@ -39,6 +39,7 @@ const node_fs_1 = require("node:fs");
|
|
|
39
39
|
const node_path_1 = require("node:path");
|
|
40
40
|
const jsii_struct_builder_1 = require("@mrgrain/jsii-struct-builder");
|
|
41
41
|
const projen = __importStar(require("projen"));
|
|
42
|
+
const projen_1 = require("projen");
|
|
42
43
|
const errors_1 = require("./errors");
|
|
43
44
|
/**
|
|
44
45
|
* Default components applied to all generated projects
|
|
@@ -421,7 +422,7 @@ class TypeScriptClassRenderer {
|
|
|
421
422
|
*/
|
|
422
423
|
class ProjectGenerator extends projen.Component {
|
|
423
424
|
options;
|
|
424
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.
|
|
425
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.4" };
|
|
425
426
|
renderer;
|
|
426
427
|
static enumGenerated = false;
|
|
427
428
|
/**
|
|
@@ -449,7 +450,7 @@ class ProjectGenerator extends projen.Component {
|
|
|
449
450
|
filePath: optionsFilePath,
|
|
450
451
|
outputFileOptions: { readonly: true },
|
|
451
452
|
})
|
|
452
|
-
.mixin(jsii_struct_builder_1.Struct.fromFqn(baseOptionsFqn))
|
|
453
|
+
.mixin(this.withoutPackageManagerInitialValue(jsii_struct_builder_1.Struct.fromFqn(baseOptionsFqn)))
|
|
453
454
|
.withoutDeprecated();
|
|
454
455
|
/* Remove specified options from the base interface */
|
|
455
456
|
if (options.omitOptions) {
|
|
@@ -474,7 +475,19 @@ class ProjectGenerator extends projen.Component {
|
|
|
474
475
|
if (c.optionsProperty !== false) {
|
|
475
476
|
try {
|
|
476
477
|
const optionsType = this.resolveComponentOptionsType(c);
|
|
477
|
-
if (optionsType && this.isFqnAvailable(optionsType.fqn)) {
|
|
478
|
+
if (optionsType && !this.isFqnAvailable(optionsType.fqn)) {
|
|
479
|
+
/* The options type is not in the manifest yet, which is expected while
|
|
480
|
+
* a new component is being introduced: its type only reaches the
|
|
481
|
+
* manifest once it has been compiled. Never leave this silent, since
|
|
482
|
+
* skipping the property removes it from the public API of this
|
|
483
|
+
* package - a stale or unreadable manifest looks exactly the same. */
|
|
484
|
+
console.warn(JSON.stringify({
|
|
485
|
+
message: "Component options type is missing from the JSII manifest, omitting the options property. Compile the package and synthesize again.",
|
|
486
|
+
component: c.componentClass.name,
|
|
487
|
+
fqn: optionsType.fqn,
|
|
488
|
+
}));
|
|
489
|
+
}
|
|
490
|
+
else if (optionsType) {
|
|
478
491
|
struct.add({
|
|
479
492
|
name: optionsType.name,
|
|
480
493
|
type: { fqn: optionsType.fqn },
|
|
@@ -501,6 +514,36 @@ class ProjectGenerator extends projen.Component {
|
|
|
501
514
|
struct.add(...options.additionalOptions);
|
|
502
515
|
}
|
|
503
516
|
}
|
|
517
|
+
/**
|
|
518
|
+
* Drops the `@pjnew` annotation from the `packageManager` option.
|
|
519
|
+
*
|
|
520
|
+
* `projen new` renders that annotation as an explicit argument in the `.projenrc.ts`
|
|
521
|
+
* it generates, where it takes precedence over the defaults these project types
|
|
522
|
+
* apply. Projen annotates `packageManager` with the `$PACKAGE_MANAGER` macro, which
|
|
523
|
+
* resolves to the package manager that runs the command, so `npx projen new --from`
|
|
524
|
+
* would pin a new project to npm. Without an annotation the option is left out of
|
|
525
|
+
* the generated `.projenrc.ts` and the default of this library applies.
|
|
526
|
+
*
|
|
527
|
+
* The annotation cannot be re-pointed at pnpm instead: projen only accepts a macro
|
|
528
|
+
* or a primitive value as an initial value, and this option is an enum.
|
|
529
|
+
*
|
|
530
|
+
* @param base - The projen options struct the generated interface is derived from
|
|
531
|
+
*/
|
|
532
|
+
withoutPackageManagerInitialValue(base) {
|
|
533
|
+
const packageManager = base.properties.find((property) => property.name === "packageManager");
|
|
534
|
+
if (!packageManager?.docs?.custom?.pjnew) {
|
|
535
|
+
return base;
|
|
536
|
+
}
|
|
537
|
+
const { pjnew, ...custom } = packageManager.docs.custom;
|
|
538
|
+
return base.replace("packageManager", {
|
|
539
|
+
...packageManager,
|
|
540
|
+
docs: {
|
|
541
|
+
...packageManager.docs,
|
|
542
|
+
default: `- ${projen_1.javascript.NodePackageManager.PNPM}`,
|
|
543
|
+
custom,
|
|
544
|
+
},
|
|
545
|
+
});
|
|
546
|
+
}
|
|
504
547
|
/**
|
|
505
548
|
* Casts project to TypeScript project type
|
|
506
549
|
*
|
|
@@ -828,4 +871,4 @@ class TypeScriptClassFile extends projen.TextFile {
|
|
|
828
871
|
this.addLine(content);
|
|
829
872
|
}
|
|
830
873
|
}
|
|
831
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFFbkQsc0VBQW9FO0FBRXBFLCtDQUFpQztBQUNqQyxxQ0FNa0I7QUFHbEI7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQjtJQUN6QixPQUFPO1FBQ0gsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ3JEO1lBQ0ksY0FBYyxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU07WUFDckQsZUFBZSxFQUFFO2dCQUNiLElBQUksRUFBRSxlQUFlO2dCQUNyQixJQUFJLEVBQUUsOENBQThDO2dCQUNwRCxJQUFJLEVBQUUsc0JBQXNCO2FBQy9CO1NBQ0o7S0FDSixDQUFDO0FBQ04sQ0FBQztBQStHRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVTtJQU9pQjtJQU5yQixLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3JCLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFeEI7O09BRUc7SUFDSCxZQUE2QixTQUFTLEdBQUc7UUFBWixXQUFNLEdBQU4sTUFBTSxDQUFNO0lBQUcsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0gsS0FBSztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsSUFBYTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FB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LENBQUM7Z0JBQ3pDLE1BQU07WUFDVixDQUFDO1lBQ0QsV0FBVyxHQUFJLFFBQThCLENBQUMsSUFBSSxDQUFDO1FBQ3ZELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOztBQWxjTCw0Q0FtY0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgKiBhcyBwcm9qZW4gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/OiBzdHJpbmcgfCBDb21wb25lbnRPcHRpb25zIHwgZmFsc2U7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChvcHRpb25hbCwgYXV0by1kZXRlY3RlZCBmcm9tIGNvbXBvbmVudCBjb25zdHJ1Y3RvcilcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gc3VtbWFyeSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9jcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICpcbiAgICAgKiBAanNpaSBpZ25vcmVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGRpdGlvbmFsT3B0aW9ucz86IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBVc2VzIEpTSUkgbWFuaWZlc3QgaW50cm9zcGVjdGlvbiB0byB2YWxpZGF0ZSBiYXNlIGNsYXNzZXMgYW5kIG9wdGlvbnMgaW50ZXJmYWNlcy5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuICAgIHB1YmxpYyBqc2lpTWFuaWZlc3Q6IEFzc2VtYmx5O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgICAgIC8qIExvYWQgUHJvamVuJ3MgSlNJSSBtYW5pZmVzdCBmb3IgYmFzZSBjbGFzcyBpbnRyb3NwZWN0aW9uICovXG4gICAgICAgIGNvbnN0IHByb2plblBhY2thZ2VKc29uID0gcmVxdWlyZS5yZXNvbHZlKFwicHJvamVuL3BhY2thZ2UuanNvblwiKTtcbiAgICAgICAgY29uc3QgcHJvamVuUm9vdCA9IGRpcm5hbWUocHJvamVuUGFja2FnZUpzb24pO1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4ocHJvamVuUm9vdCwgXCIuanNpaVwiKTtcbiAgICAgICAgdGhpcy5qc2lpTWFuaWZlc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzKTtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IHRoaXMuZXh0cmFjdEltcG9ydHMob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUmVuZGVyIGFsbCBzZWN0aW9ucyBvZiB0aGUgY2xhc3MgZmlsZSAqL1xuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZsdXNoKCkuam9pbihcIlxcblwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgb3B0aW9ucyBpbnRlcmZhY2UgbmFtZSBmcm9tIHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBQcm9qZW4gb3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIGJ5IGFwcGVuZGluZyBcIk9wdGlvbnNcIiBzdWZmaXggYW5kIHByZWZpeGluZyB3aXRoIFwicHJvamVuLlwiIG5hbWVzcGFjZS5cbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3J9IFdoZW4gcHJvamVjdFR5cGUgZm9ybWF0IGlzIGludmFsaWQgb3IgY2xhc3Mgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwicHJvamVuLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCJcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5KU0lJKSAvLyBcInByb2plbi5jZGsuSnNpaVByb2plY3RPcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRCYXNlT3B0aW9uc0Zxbihwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBwcm9qZWN0VHlwZS52YWx1ZU9mKCk7XG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZm9ybWF0OiBtdXN0IGNvbnRhaW4gbW9kdWxlLkNsYXNzTmFtZSBzdHJ1Y3R1cmUgKi9cbiAgICAgICAgaWYgKCFiYXNlQ2xhc3MuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlQ2xhc3NGcW4gPSBgcHJvamVuLiR7YmFzZUNsYXNzfWA7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGcW4gPSBgJHtiYXNlQ2xhc3NGcW59T3B0aW9uc2A7XG5cbiAgICAgICAgLyogVmFsaWRhdGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bYmFzZUNsYXNzRnFuXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihgQmFzZSBjbGFzcyBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtiYXNlQ2xhc3NGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zIGludGVyZmFjZSBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYE9wdGlvbnMgaW50ZXJmYWNlIG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0OiAke29wdGlvbnNGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uc0ZxbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgY29kZSBnZW5lcmF0aW9uXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyBpbnRvOlxuICAgICAqIDEuIERlc3RydWN0dXJlIGxpc3Q6IHZhcmlhYmxlIG5hbWVzIHRvIGV4dHJhY3QgZnJvbSBvcHRpb25zXG4gICAgICogMi4gQ29tcG9uZW50IGFycmF5OiBjb2RlIHN0cmluZyBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggZGVzdHJ1Y3R1cmUgYXJyYXkgYW5kIGNvbXBvbmVudEFycmF5IGNvZGUgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElucHV0OiBbeyBjb21wb25lbnQ6IFZpdGVzdCwgb3B0aW9uc1Byb3BlcnR5OiB7IG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLCAuLi4gfSB9XVxuICAgICAqIE91dHB1dDoge1xuICAgICAqICAgZGVzdHJ1Y3R1cmU6IFtcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl0sXG4gICAgICogICBjb21wb25lbnRBcnJheTogXCJbeyBjb21wb25lbnQ6IFZpdGVzdCwgZW5hYmxlZDogdml0ZXN0LCBvcHRpb25zOiB2aXRlc3RPcHRpb25zIH1dXCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzOiBDb21wb25lbnRbXSk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Q2xhc3MubmFtZX1gXTtcbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBjb25maWd1cmFibGUgb3B0aW9ucyAtIGluY2x1ZGUgYm90aCBlbmFibGVkIGZsYWcgYW5kIG9wdGlvbnMgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVvZiBjLm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGMub3B0aW9uc1Byb3BlcnR5IDogYy5vcHRpb25zUHJvcGVydHkubmFtZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdHVyZS5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCwgYG9wdGlvbnM6ICR7cHJvcE5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyAtIG9ubHkgaW5jbHVkZSBlbmFibGVkIGZsYWcgKi9cbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRQYXJ0cy5wdXNoKGB7ICR7cGFydHMuam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXk6IGBbJHtjb21wb25lbnRQYXJ0cy5qb2luKFwiLCBcIil9XWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgaW1wb3J0IHN0YXRlbWVudHMgbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBDb2xsZWN0cyBhbGwgcmVxdWlyZWQgaW1wb3J0czpcbiAgICAgKiAtIFByb2plbiBiYXNlIG1vZHVsZSAodHlwZXNjcmlwdCwgY2RrLCBhd3NjZGspXG4gICAgICogLSBDb25maWcgdXRpbGl0aWVzIChhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucylcbiAgICAgKiAtIENvbXBvbmVudCBjbGFzc2VzXG4gICAgICogLSBVdGlsaXR5IGZ1bmN0aW9ucyAoZGVlcE1lcmdlKVxuICAgICAqIC0gR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlICh0eXBlLW9ubHkgaW1wb3J0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgTWFwIG9mIG1vZHVsZSBwYXRocyB0byBzZXRzIG9mIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgICAgICAvKiBFeHRyYWN0IGJhc2UgbW9kdWxlIG5hbWUgZnJvbSBwcm9qZWN0VHlwZSAoZS5nLiwgXCJ0eXBlc2NyaXB0XCIgZnJvbSBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIikgKi9cbiAgICAgICAgY29uc3QgYmFzZU1vZHVsZSA9IG9wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuIGJhc2UgbW9kdWxlIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcInByb2plblwiLCBuZXcgU2V0KFtiYXNlTW9kdWxlXSkpO1xuXG4gICAgICAgIC8qIENvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL2NvbmZpZ1wiLCBuZXcgU2V0KFtcImFwcGx5RGVmYXVsdHNcIiwgXCJkZWZhdWx0T3B0aW9uc1wiXSkpO1xuXG4gICAgICAgIC8qIENvbXBvbmVudCBjbGFzcyBpbXBvcnRzIC0gZGVyaXZlIG1vZHVsZSBwYXRoIGZyb20gY29tcG9uZW50IGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBgLi4vY29tcG9uZW50cy8ke2NvbXBvbmVudE5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLmhhcyhtb2R1bGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMuc2V0KG1vZHVsZVBhdGgsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbXBvcnRzID0gaW1wb3J0cy5nZXQobW9kdWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobW9kdWxlSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUltcG9ydHMuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogVXRpbGl0eSBmdW5jdGlvbnMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vdXRpbHNcIiwgbmV3IFNldChbXCJkZWVwTWVyZ2VcIl0pKTtcblxuICAgICAgICAvKiBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgaW1wb3J0ICh0eXBlLW9ubHkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzKSAqL1xuICAgICAgICBpbXBvcnRzLnNldChgLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkYCwgbmV3IFNldChbb3B0aW9uc0ludGVyZmFjZV0pKTtcblxuICAgICAgICByZXR1cm4gaW1wb3J0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBjb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBwYXRoIGluIHRoZSBkZWZhdWx0T3B0aW9uc1xuICAgICAqIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGV4cG9ydGVkIGZyb20gY29uZmlnLnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2plY3RUeXBlIC0gUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJucyBDb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRDb25maWdQYXRoKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwiZGVmYXVsdE9wdGlvbnMudHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb25maWdQYXRoKHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGVmYXVsdE9wdGlvbnMuJHtwcm9qZWN0VHlwZS52YWx1ZU9mKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGltcG9ydCBzdGF0ZW1lbnRzIGluIHNvcnRlZCBvcmRlclxuICAgICAqXG4gICAgICogU29ydHMgaW1wb3J0cyB3aXRoIGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMuXG4gICAgICogVXNlcyB0eXBlLW9ubHkgaW1wb3J0cyBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbXBvcnRzIC0gTWFwIG9mIG1vZHVsZSBwYXRocyB0byBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVySW1wb3J0cyhpbXBvcnRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4pIHtcbiAgICAgICAgLyogU29ydCBtb2R1bGVzOiBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzIGFscGhhYmV0aWNhbGx5ICovXG4gICAgICAgIGNvbnN0IHNvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKGltcG9ydHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhSXNSZWxhdGl2ZSA9IGEuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBiSXNSZWxhdGl2ZSA9IGIuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBpZiAoYUlzUmVsYXRpdmUgIT09IGJJc1JlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFJc1JlbGF0aXZlID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2Ygc29ydGVkTW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGltcG9ydHMuZ2V0KG1vZCkgfHwgW10pLnNvcnQoKTtcbiAgICAgICAgICAgIC8qIFVzZSB0eXBlLW9ubHkgaW1wb3J0IGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVHlwZU9ubHkgPSBtb2QuaW5jbHVkZXMoXCIuZ2VuZXJhdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3RtdCA9IGlzVHlwZU9ubHkgPyBcImltcG9ydCB0eXBlXCIgOiBcImltcG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIubGluZShgJHtpbXBvcnRTdG10fSB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke21vZH1cIjtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgcmUtZXhwb3J0IHN0YXRlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZSB0byBleHBvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckV4cG9ydChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIC8qIHR5cGUtb25seSByZS1leHBvcnQsIHJlcXVpcmVkIGJ5IGBpc29sYXRlZE1vZHVsZXNgICovXG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGV4cG9ydCB0eXBlIHsgJHtvcHRpb25zSW50ZXJmYWNlfSB9IGZyb20gXCIuLyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWRcIjtgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgY29uc3RydWN0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGJhc2VPcHRpb25zVHlwZSAtIEJhc2Ugb3B0aW9ucyB0eXBlIHdpdGhvdXQgXCJwcm9qZW4uXCIgcHJlZml4XG4gICAgICogQHBhcmFtIGRlc3RydWN0dXJlIC0gVmFyaWFibGUgbmFtZXMgdG8gZGVzdHJ1Y3R1cmUgZnJvbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGNvbXBvbmVudEFycmF5IC0gQ29kZSBzdHJpbmcgZm9yIGNvbXBvbmVudCBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyQ2xhc3MoXG4gICAgICAgIG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICAgICBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcsXG4gICAgICAgIGJhc2VPcHRpb25zVHlwZTogc3RyaW5nLFxuICAgICAgICBkZXN0cnVjdHVyZTogc3RyaW5nW10sXG4gICAgICAgIGNvbXBvbmVudEFycmF5OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYCAqICR7b3B0aW9ucy5uYW1lfSB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbmApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICpcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBFeHRlbmRzIFByb2plbidzIGJhc2UgY2xhc3Mgd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgYXV0b21hdGljIGNvbXBvbmVudCBzZXR1cC5cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGV4cG9ydCBjbGFzcyAke29wdGlvbnMubmFtZX0gZXh0ZW5kcyAke29wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpfSB7YCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ29uc3RydWN0b3Iob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvcjpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZXMgY29tcG9uZW50IGZsYWdzIGFuZCBvcHRpb25zIGZyb20gdGhlIG9wdGlvbnMgcGFyYW1ldGVyXG4gICAgICogMi4gTWVyZ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXItcHJvdmlkZWQgb3B0aW9uc1xuICAgICAqIDMuIENhbGxzIHN1cGVyKCkgd2l0aCBtZXJnZWQgb3B0aW9uc1xuICAgICAqIDQuIEFwcGxpZXMgY29tcG9uZW50IGRlZmF1bHRzIHZpYSBhcHBseURlZmF1bHRzKClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGJhc2VPcHRpb25zVHlwZSAtIEJhc2Ugb3B0aW9ucyB0eXBlIHdpdGhvdXQgXCJwcm9qZW4uXCIgcHJlZml4XG4gICAgICogQHBhcmFtIGRlc3RydWN0dXJlIC0gVmFyaWFibGUgbmFtZXMgdG8gZGVzdHJ1Y3R1cmUgZnJvbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGNvbXBvbmVudEFycmF5IC0gQ29kZSBzdHJpbmcgZm9yIGNvbXBvbmVudCBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyQ29uc3RydWN0b3IoXG4gICAgICAgIG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICAgICBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcsXG4gICAgICAgIGJhc2VPcHRpb25zVHlwZTogc3RyaW5nLFxuICAgICAgICBkZXN0cnVjdHVyZTogc3RyaW5nW10sXG4gICAgICAgIGNvbXBvbmVudEFycmF5OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmdldENvbmZpZ1BhdGgob3B0aW9ucy5wcm9qZWN0VHlwZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBAcGFyYW0gb3B0aW9ucyAtIFByb2plY3QgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgY29uc3RydWN0b3Iob3B0aW9uczogJHtvcHRpb25zSW50ZXJmYWNlfSkge2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogU2VwYXJhdGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBiYXNlIFByb2plbiBvcHRpb25zICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBjb25zdCB7ICR7ZGVzdHJ1Y3R1cmUuam9pbihcIiwgXCIpfSwgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIE1lcmdlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXIgb3B0aW9ucyBhbmQgaW5pdGlhbGl6ZSBiYXNlIGNsYXNzICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBzdXBlcihkZWVwTWVyZ2U8JHtiYXNlT3B0aW9uc1R5cGV9Pigke2NvbmZpZ1BhdGh9LCBiYXNlT3B0aW9ucykpO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBBcHBseSBjb21wb25lbnQgZGVmYXVsdHMgYW5kIGluc3RhbnRpYXRlIGVuYWJsZWQgY29tcG9uZW50cyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgYXBwbHlEZWZhdWx0cyh0aGlzLCAke2NvbXBvbmVudEFycmF5fSk7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNsb3NlKFwifVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgdG8gZmlsZSBuYW1lXG4gICAgICpcbiAgICAgKiBDb252ZXJ0cyBQYXNjYWxDYXNlIGludGVyZmFjZSBuYW1lcyB0byBrZWJhYi1jYXNlIGZpbGUgbmFtZXMuXG4gICAgICogRmFsbHMgYmFjayB0byBsb3dlcmNhc2UgY29udmVyc2lvbiBmb3IgdW5tYXBwZWQgaW50ZXJmYWNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gT3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIEByZXR1cm5zIEtlYmFiLWNhc2UgZmlsZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldE9wdGlvbnNGaWxlTmFtZShcIlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiKSAvLyBcInR5cGVzY3JpcHQtb3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM6IFwidHlwZXNjcmlwdC1vcHRpb25zXCIsXG4gICAgICAgICAgICBKc2lpUHJvamVjdE9wdGlvbnM6IFwianNpaS1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLXR5cGVzY3JpcHQtYXBwLW9wdGlvbnNcIixcbiAgICAgICAgICAgIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlQcm9qZWN0T3B0aW9uczogXCJhd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9uc1wiLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWFwcGluZ1tvcHRpb25zSW50ZXJmYWNlXSB8fCBvcHRpb25zSW50ZXJmYWNlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb2plbiBjb21wb25lbnQgdGhhdCBnZW5lcmF0ZXMgVHlwZVNjcmlwdCBwcm9qZWN0IGNsYXNzZXMgd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uXG4gKlxuICogVGhpcyBjb21wb25lbnQgYXV0b21hdGVzIHRoZSBjcmVhdGlvbiBvZiBwcm9qZWN0IGNsYXNzZXMgdGhhdCBleHRlbmQgUHJvamVuIGJhc2UgY2xhc3Nlc1xuICogd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEdlbmVyYXRvciBleHRlbmRzIHByb2plbi5Db21wb25lbnQge1xuICAgIHByaXZhdGUgcmVuZGVyZXI6IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyO1xuICAgIHByaXZhdGUgc3RhdGljIGVudW1HZW5lcmF0ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyKCk7XG5cbiAgICAgICAgLyogR2VuZXJhdGUgUHJvamVjdFR5cGUgZW51bSBvbmNlIG9uIGZpcnN0IGluc3RhbnRpYXRpb24gKi9cbiAgICAgICAgaWYgKCFQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTtcbiAgICAgICAgICAgIFByb2plY3RHZW5lcmF0b3IuZW51bUdlbmVyYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdXNpbmcgUHJvamVuU3RydWN0IGZvciBKU0lJIGNvbXBhdGliaWxpdHkgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLnJlbmRlcmVyLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZVBhdGggPSB0aGlzLmdldE9wdGlvbnNGaWxlUGF0aChvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW5TdHJ1Y3QgZ2VuZXJhdGVzIGEgY29uY3JldGUgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZnJvbSBQcm9qZW4ncyBvcHRpb25zXG4gICAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgSlNJSSBkb2Vzbid0IHN1cHBvcnQgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGVzIGxpa2UgT21pdDw+XG4gICAgICAgICAqIFRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIGNhbiBiZSBjb25zdW1lZCBieSBvdGhlciBsYW5ndWFnZXMgKFB5dGhvbiwgSmF2YSwgQyMsIEdvKSAqL1xuICAgICAgICBjb25zdCBzdHJ1Y3QgPSBuZXcgUHJvamVuU3RydWN0KHRoaXMuYXNUeXBlU2NyaXB0UHJvamVjdChwcm9qZWN0KSwge1xuICAgICAgICAgICAgbmFtZTogb3B0aW9uc0ludGVyZmFjZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiBvcHRpb25zRmlsZVBhdGgsXG4gICAgICAgICAgICBvdXRwdXRGaWxlT3B0aW9uczogeyByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICB9KVxuICAgICAgICAgICAgLm1peGluKFN0cnVjdC5mcm9tRnFuKGJhc2VPcHRpb25zRnFuKSlcbiAgICAgICAgICAgIC53aXRob3V0RGVwcmVjYXRlZCgpO1xuXG4gICAgICAgIC8qIFJlbW92ZSBzcGVjaWZpZWQgb3B0aW9ucyBmcm9tIHRoZSBiYXNlIGludGVyZmFjZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5vbWl0T3B0aW9ucykge1xuICAgICAgICAgICAgc3RydWN0Lm9taXQoLi4ub3B0aW9ucy5vbWl0T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBZGQgY29tcG9uZW50LWRlcml2ZWQgb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBvcHRpb25zLmNvbXBvbmVudHMgPz8gZ2V0RGVmYXVsdENvbXBvbmVudHMoKTtcbiAgICAgICAgY29uc3QgeyBQcmltaXRpdmVUeXBlIH0gPSByZXF1aXJlKFwiQGpzaWkvc3BlY1wiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGMuY29tcG9uZW50Q2xhc3MubmFtZS5zbGljZSgxKTtcblxuICAgICAgICAgICAgLyogQWRkIGVuYWJsZWQgZmxhZyBmb3IgdGhlIGNvbXBvbmVudCAqL1xuICAgICAgICAgICAgc3RydWN0LmFkZCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHByaW1pdGl2ZTogUHJpbWl0aXZlVHlwZS5Cb29sZWFuIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgRW5hYmxlICR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb21wb25lbnRgLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcInRydWVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBvcHRpb25zIHByb3BlcnR5IGlmIGNvbXBvbmVudCBpcyBjb25maWd1cmFibGUgKi9cbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zVHlwZSA9IHRoaXMucmVzb2x2ZUNvbXBvbmVudE9wdGlvbnNUeXBlKGMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1R5cGUgJiYgdGhpcy5pc0ZxbkF2YWlsYWJsZShvcHRpb25zVHlwZS5mcW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zVHlwZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHsgZnFuOiBvcHRpb25zVHlwZS5mcW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IG9wdGlvbnNUeXBlLmRvY3MgPz8gYCR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYC0gZGVmYXVsdCAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciBvciByZXNvbHV0aW9uIGZhaWxlZCAtIHNraXAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIHJlc29sdmUgY29tcG9uZW50IG9wdGlvbnMgdHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYy5jb21wb25lbnRDbGFzcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBZGQgY3VzdG9tIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucyAmJiBvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0cnVjdC5hZGQoLi4ub3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBwcm9qZWN0IHRvIFR5cGVTY3JpcHQgcHJvamVjdCB0eXBlXG4gICAgICpcbiAgICAgKiBQcm9qZW5TdHJ1Y3QgcmVxdWlyZXMgYSBUeXBlU2NyaXB0UHJvamVjdCBpbnN0YW5jZS4gVGhpcyBnZW5lcmF0b3IgaXMgb25seSB1c2VkXG4gICAgICogd2l0aGluIFR5cGVTY3JpcHQgcHJvamVjdHMsIHNvIHRoZSBjYXN0IGlzIHNhZmUgaW4gcHJhY3RpY2UuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUeXBlIGFzc2VydGlvbiBpcyBuZWNlc3NhcnkgaGVyZSBiZWNhdXNlIFByb2plbidzIHR5cGUgc3lzdGVtIGRvZXNuJ3QgcHJvdmlkZVxuICAgICAqIGEgcnVudGltZSB0eXBlIGd1YXJkIGZvciBUeXBlU2NyaXB0UHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyBUeXBlU2NyaXB0IHByb2plY3QgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdDogUHJvamVjdCk6IHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Qge1xuICAgICAgICByZXR1cm4gcHJvamVjdCBhcyB1bmtub3duIGFzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBQbGFjZXMgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjbGFzcyBmaWxlXG4gICAgICogd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcmV0dXJucyBGaWxlIHBhdGggZm9yIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEB0aHJvd3Mge0ludmFsaWRGaWxlUGF0aEVycm9yfSBXaGVuIGZpbGVQYXRoIGRvZXNuJ3QgY29udGFpbiBhIGRpcmVjdG9yeSBzZXBhcmF0b3JcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE9wdGlvbnNGaWxlUGF0aChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsYXN0U2xhc2ggPSB0aGlzLm9wdGlvbnMuZmlsZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgICAgICBpZiAobGFzdFNsYXNoID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRGaWxlUGF0aEVycm9yKHRoaXMub3B0aW9ucy5maWxlUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXIgPSB0aGlzLm9wdGlvbnMuZmlsZVBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMucmVuZGVyZXIuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICByZXR1cm4gYCR7ZGlyfS8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkLnRzYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBkdXJpbmcgUHJvamVuIHN5bnRoZXNpc1xuICAgICAqXG4gICAgICogQ2FsbGVkIGJ5IFByb2plbiBkdXJpbmcgdGhlIHN5bnRoZXNpcyBwaGFzZSB0byBnZW5lcmF0ZSB0aGUgcHJvamVjdCBjbGFzcyBmaWxlLlxuICAgICAqIFRoZSBmaWxlIGlzIG1hcmtlZCBhcyByZWFkb25seSB0byBwcmV2ZW50IG1hbnVhbCBlZGl0aW5nLlxuICAgICAqL1xuICAgIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgIG5ldyBUeXBlU2NyaXB0Q2xhc3NGaWxlKHRoaXMucHJvamVjdCwgdGhpcy5vcHRpb25zLmZpbGVQYXRoLCBjb250ZW50LCB7XG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5vcHRpb25zLnJlYWRvbmx5ID8/IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBGUU4gaXMgYXZhaWxhYmxlIGluIGFueSBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0ZxbkF2YWlsYWJsZShmcW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihmcW4pO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0LnR5cGVzPy5bZnFuXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGNvbXBvbmVudCBvcHRpb25zIHR5cGUgZnJvbSBKU0lJIG1hbmlmZXN0XG4gICAgICpcbiAgICAgKiBBdXRvLWRldGVjdHMgb3B0aW9ucyBmcm9tIEpTSUkgbWFuaWZlc3Qgd2hlbiBvcHRpb25zUHJvcGVydHkgaXMgdW5kZWZpbmVkLlxuICAgICAqIFJldHVybnMgbnVsbCBvbmx5IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZUNvbXBvbmVudE9wdGlvbnNUeXBlKGNvbXBvbmVudDogQ29tcG9uZW50KTogeyBuYW1lOiBzdHJpbmc7IGZxbjogc3RyaW5nOyBkb2NzPzogc3RyaW5nIH0gfCBudWxsIHtcbiAgICAgICAgLyogTm9ybWFsaXplIG9wdGlvbnNQcm9wZXJ0eSB0byBDb21wb25lbnRPcHRpb25zICovXG4gICAgICAgIGxldCBvcHRpb25zQ29uZmlnOiBDb21wb25lbnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnNDb25maWcgPSB7IG5hbWU6IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHkgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ICYmIHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0gY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFVzZSBleHBsaWNpdCB0eXBlIGlmIHByb3ZpZGVkICovXG4gICAgICAgIGlmIChvcHRpb25zQ29uZmlnPy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNDb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICBmcW46IG9wdGlvbnNDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICBkb2NzOiBvcHRpb25zQ29uZmlnLmRvY3MsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyogRmluZCBjb21wb25lbnQgaW4gSlNJSSBtYW5pZmVzdHMgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50RnFuID0gY29tcG9uZW50LmZxbiA/PyB0aGlzLmZpbmRDb21wb25lbnRGcW4oY29tcG9uZW50LmNvbXBvbmVudENsYXNzLm5hbWUpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMubG9hZE1hbmlmZXN0Rm9yRnFuKGNvbXBvbmVudEZxbik7XG5cbiAgICAgICAgY29uc3QgY2xhc3NUeXBlID0gbWFuaWZlc3QudHlwZXM/Lltjb21wb25lbnRGcW5dO1xuICAgICAgICBpZiAoIWNsYXNzVHlwZSB8fCBjbGFzc1R5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9uZW50UmVzb2x1dGlvbkVycm9yKGNvbXBvbmVudEZxbiwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIEpTSUkgbWFuaWZlc3RcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IChjbGFzc1R5cGUgYXMgeyBpbml0aWFsaXplcj86IHsgcGFyYW1ldGVycz86IEFycmF5PHsgdHlwZT86IHsgZnFuPzogc3RyaW5nIH0gfT4gfSB9KVxuICAgICAgICAgICAgLmluaXRpYWxpemVyO1xuICAgICAgICBpZiAoIWluaXRpYWxpemVyPy5wYXJhbWV0ZXJzPy5bMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgcGFyYW1ldGVyICovXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zUGFyYW0gPSBpbml0aWFsaXplci5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICBjb25zdCBvcHRpb25zRnFuID0gb3B0aW9uc1BhcmFtLnR5cGU/LmZxbjtcblxuICAgICAgICBpZiAoIW9wdGlvbnNGcW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvKiBPcHRpb25zIHBhcmFtZXRlciBoYXMgbm8gRlFOICovXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl07XG4gICAgICAgIGNvbnN0IGRvY3MgPSAob3B0aW9uc1R5cGUgYXMgeyBkb2NzPzogeyBzdW1tYXJ5Pzogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZCk/LmRvY3M/LnN1bW1hcnk7XG5cbiAgICAgICAgLyogQXV0by1nZW5lcmF0ZSBwcm9wZXJ0eSBuYW1lIGlmIG5vdCBwcm92aWRlZCAqL1xuICAgICAgICBjb25zdCBuYW1lID0gY29tcG9uZW50LmNvbXBvbmVudENsYXNzLm5hbWU7XG4gICAgICAgIGNvbnN0IGRlZmF1bHROYW1lID0gYCR7bmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKX0ke25hbWUuc2xpY2UoMSl9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IG9wdGlvbnNDb25maWc/Lm5hbWUgPz8gZGVmYXVsdE5hbWU7XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcGVydHlOYW1lLCBmcW46IG9wdGlvbnNGcW4sIGRvY3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBjb21wb25lbnQgRlFOIGJ5IHNlYXJjaGluZyBhbGwgSlNJSSBtYW5pZmVzdHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRDb21wb25lbnRGcW4oY29tcG9uZW50TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLyogVHJ5IG93biBwYWNrYWdlIGZpcnN0ICovXG4gICAgICAgIGNvbnN0IG93bkZxbiA9IGBAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuJHtjb21wb25lbnROYW1lfWA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvd25NYW5pZmVzdCA9IHRoaXMubG9hZE93bk1hbmlmZXN0KCk7XG4gICAgICAgICAgICBpZiAob3duTWFuaWZlc3QudHlwZXM/Lltvd25GcW5dKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bkZxbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8qIE93biBtYW5pZmVzdCBub3QgYXZhaWxhYmxlIHlldCBkdXJpbmcgZGV2ZWxvcG1lbnQgLSB0aGlzIGlzIGV4cGVjdGVkICovXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk93biBtYW5pZmVzdCBub3QgYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZWFyY2ggaW4gbm9kZV9tb2R1bGVzIGZvciBKU0lJIHBhY2thZ2VzICovXG4gICAgICAgIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL25vZGVfbW9kdWxlc1wiKTtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSB0aGlzLmZpbmRKc2lpUGFja2FnZXMobm9kZU1vZHVsZXNQYXRoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBrZyBvZiBwYWNrYWdlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UocGtnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZxbiBvZiBPYmplY3Qua2V5cyhtYW5pZmVzdC50eXBlcyA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZxbi5lbmRzV2l0aChgLiR7Y29tcG9uZW50TmFtZX1gKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZxbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogU2tpcCBwYWNrYWdlcyB3aXRoIGludmFsaWQgbWFuaWZlc3RzIC0gbG9nIGZvciBkZWJ1Z2dpbmcgKi9cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIGxvYWQgbWFuaWZlc3QgZnJvbSBwYWNrYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlOiBwa2csXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnROYW1lLCBcIkNvbXBvbmVudCBub3QgZm91bmQgaW4gYW55IEpTSUkgbWFuaWZlc3RcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgYWxsIEpTSUkgcGFja2FnZXMgaW4gbm9kZV9tb2R1bGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYWNrYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgeyByZWFkZGlyU3luYywgc3RhdFN5bmMsIGV4aXN0c1N5bmMgfSA9IHJlcXVpcmUoXCJub2RlOmZzXCIpO1xuXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhub2RlTW9kdWxlc1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFja2FnZXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSByZXNvbHZlKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhub2RlTW9kdWxlc1BhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeVBhdGggPSByZXNvbHZlKG5vZGVNb2R1bGVzUGF0aCwgZW50cnkpO1xuXG4gICAgICAgICAgICAvKiBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3MgKi9cbiAgICAgICAgICAgIGlmICghZW50cnlQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgICAgICAgICAgICAvKiBTY29wZWQgcGFja2FnZSAtIHJlY3Vyc2UgaW50byBzY29wZSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlUGF0aCA9IGVudHJ5UGF0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNjb3BlZEVudHJ5IG9mIHJlYWRkaXJTeW5jKHNjb3BlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtnUGF0aCA9IHJlc29sdmUoc2NvcGVQYXRoLCBzY29wZWRFbnRyeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGtnUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihwa2dQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMucHVzaChwa2dQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdFN5bmMoZW50cnlQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgLyogUmVndWxhciBwYWNrYWdlICovXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihlbnRyeVBhdGgsIFwiLmpzaWlcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2goZW50cnlQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFja2FnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmb3IgYSBnaXZlbiBGUU5cbiAgICAgKlxuICAgICAqIEV4dHJhY3RzIHBhY2thZ2UgbmFtZSBmcm9tIEZRTi4gRm9yIHNjb3BlZCBwYWNrYWdlcyBsaWtlIEBzY29wZS9wYWNrYWdlLkNsYXNzTmFtZSxcbiAgICAgKiB0aGUgcGFja2FnZSBuYW1lIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBmaXJzdCBkb3QgKGkuZS4sIEBzY29wZS9wYWNrYWdlKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZvckZxbihmcW46IHN0cmluZyk6IEFzc2VtYmx5IHtcbiAgICAgICAgY29uc3QgZG90SW5kZXggPSBmcW4uaW5kZXhPZihcIi5cIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZG90SW5kZXggPiAwID8gZnFuLnN1YnN0cmluZygwLCBkb3RJbmRleCkgOiBmcW47XG5cbiAgICAgICAgLyogVHJ5IG93biBwYWNrYWdlICovXG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE93bk1hbmlmZXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBUcnkgbm9kZV9tb2R1bGVzICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwa2dKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3RGcm9tUGFja2FnZShkaXJuYW1lKHBrZ0pzb25QYXRoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RMb2FkRXJyb3IocGFja2FnZU5hbWUsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBKU0lJIG1hbmlmZXN0IGZyb20gYSBwYWNrYWdlIGRpcmVjdG9yeVxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UocGFja2FnZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5IHtcbiAgICAgICAgY29uc3QganNpaVBhdGggPSBqb2luKHBhY2thZ2VQYXRoLCBcIi5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoaXMgcGFja2FnZSdzIEpTSUkgbWFuaWZlc3RcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRPd25NYW5pZmVzdCgpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihfX2Rpcm5hbWUsIFwiLi4vLmpzaWlcIik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIFByb2plY3RUeXBlIGVudW0gZnJvbSBQcm9qZW4ncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVByb2plY3RUeXBlRW51bSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzID0gdGhpcy5kaXNjb3ZlclByb2plY3RUeXBlcygpO1xuXG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICogRW51bSBkZWZpbmluZyBhbGwgc3VwcG9ydGVkIHByb2plY3QgdHlwZXNcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVhY2ggcHJvamVjdCB0eXBlIGNvcnJlc3BvbmRzIHRvIGEgZ2VuZXJhdGVkIHByb2plY3QgY2xhc3MgYW5kIGl0cyBjb25maWd1cmF0aW9uXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICogaW4gdGhlIGRlZmF1bHRPcHRpb25zIHN0cnVjdHVyZS5cIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEBnZW5lcmF0ZWQgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBQcm9qZW4ncyBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGVudW0gUHJvamVjdFR5cGUge1wiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdIG9mIHByb2plY3RUeXBlcykge1xuICAgICAgICAgICAgbGluZXMucHVzaChcIiAgICAvKipcIik7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgICAgICogJHtkb2NzfWApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIiAgICAgKi9cIik7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtlbnVtTmFtZX0gPSBcIiR7dmFsdWV9XCIsYCk7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaChcIn1cIik7XG5cbiAgICAgICAgbmV3IHByb2plbi5UZXh0RmlsZSh0aGlzLnByb2plY3QsIFwic3JjL3Byb2plY3QtdHlwZS50c1wiLCB7XG4gICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3ZlcnMgYWxsIHByb2plY3QgdHlwZXMgdGhhdCBleHRlbmQgcHJvamVuLlByb2plY3RcbiAgICAgKi9cbiAgICBwcml2YXRlIGRpc2NvdmVyUHJvamVjdFR5cGVzKCk6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0VHlwZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4gPSBbXTtcbiAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gXCJwcm9qZW4uUHJvamVjdFwiO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZxbiwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZW5kZXJlci5qc2lpTWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICBpZiAodHlwZS5raW5kICE9PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2xhc3NUeXBlID0gdHlwZSBhcyB7XG4gICAgICAgICAgICAgICAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgIGJhc2U/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNsYXNzVHlwZS5hYnN0cmFjdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXh0ZW5kc0Jhc2UoY2xhc3NUeXBlLCBiYXNlQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZnFuLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAzIHx8IHBhcnRzWzBdICE9PSBcInByb2plblwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gcGFydHMuc2xpY2UoMikuam9pbihcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBlbnVtTmFtZSA9IGNsYXNzTmFtZVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oW0EtWl0pL2csIFwiXyQxXCIpXG4gICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXl8vLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYCR7bW9kdWxlfS4ke2NsYXNzTmFtZX1gO1xuICAgICAgICAgICAgY29uc3QgZG9jcyA9IGNsYXNzVHlwZS5kb2NzPy5zdW1tYXJ5ID8/IGNsYXNzTmFtZTtcblxuICAgICAgICAgICAgcHJvamVjdFR5cGVzLnB1c2goW2VudW1OYW1lLCB2YWx1ZSwgZG9jc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2plY3RUeXBlcy5zb3J0KChhLCBiKSA9PiBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgY2xhc3NcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dGVuZHNCYXNlKGNsYXNzVHlwZTogeyBpbmhlcml0YW5jZVBhdGg/OiBzdHJpbmdbXTsgYmFzZT86IHN0cmluZyB9LCBiYXNlQ2xhc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY2xhc3NUeXBlLmluaGVyaXRhbmNlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGguaW5jbHVkZXMoYmFzZUNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW50QmFzZSA9IGNsYXNzVHlwZS5iYXNlO1xuICAgICAgICB3aGlsZSAoY3VycmVudEJhc2UpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QmFzZSA9PT0gYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzPy5bY3VycmVudEJhc2VdO1xuICAgICAgICAgICAgaWYgKCFiYXNlVHlwZSB8fCBiYXNlVHlwZS5raW5kICE9PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gKGJhc2VUeXBlIGFzIHsgYmFzZT86IHN0cmluZyB9KS5iYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUZXh0IGZpbGUgZm9yIGdlbmVyYXRlZCBUeXBlU2NyaXB0IGNsYXNzIGNvZGVcbiAqXG4gKiBFeHRlbmRzIFByb2plbidzIFRleHRGaWxlIHRvIGFkZCB0aGUgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIGNvbW1lbnRcbiAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuXG4gKi9cbmNsYXNzIFR5cGVTY3JpcHRDbGFzc0ZpbGUgZXh0ZW5kcyBwcm9qZW4uVGV4dEZpbGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBPdXRwdXQgZmlsZSBwYXRoXG4gICAgICogQHBhcmFtIGNvbnRlbnQgLSBUeXBlU2NyaXB0IGNsYXNzIGNvZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNvdXJjZSBjb2RlIG9wdGlvbnMgKHJlYWRvbmx5LCBldGMuKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogU291cmNlQ29kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0LCBmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIC8qIEFkZCBnZW5lcmF0ZWQgZmlsZSBtYXJrZXIgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZyAqL1xuICAgICAgICB0aGlzLmFkZExpbmUoYC8vICR7dGhpcy5tYXJrZXJ9YCk7XG4gICAgICAgIHRoaXMuYWRkTGluZShjb250ZW50KTtcbiAgICB9XG59XG4iXX0=
|
|
874
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFFbkQsc0VBQW9FO0FBQ3BFLCtDQUFpQztBQUNqQyxtQ0FBMkY7QUFDM0YscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFPaUI7SUFOckIsS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXhCOztPQUVHO0lBQ0gsWUFBNkIsU0FBUyxHQUFHO1FBQVosV0FBTSxHQUFOLE1BQU0sQ0FBTTtJQUFHLENBQUM7SUFFN0M7Ozs7T0FJRztJQUNILEtBQUs7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLElBQWE7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQs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TCw0Q0FtZkM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCAqIGFzIHByb2plbiBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBqYXZhc2NyaXB0LCB0eXBlIFByb2plY3QsIHR5cGUgU291cmNlQ29kZU9wdGlvbnMsIHR5cGUgdHlwZXNjcmlwdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50UmVzb2x1dGlvbkVycm9yLFxuICAgIEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcixcbiAgICBJbnZhbGlkRmlsZVBhdGhFcnJvcixcbiAgICBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcixcbiAgICBNYW5pZmVzdExvYWRFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RUeXBlIH0gZnJvbSBcIi4vcHJvamVjdC10eXBlXCI7XG5cbi8qKlxuICogRGVmYXVsdCBjb21wb25lbnRzIGFwcGxpZWQgdG8gYWxsIGdlbmVyYXRlZCBwcm9qZWN0c1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0Q29tcG9uZW50cygpOiBDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgeyBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy9taXNlXCIpLk1pc2UgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvdml0ZXN0XCIpLlZpdGVzdCxcbiAgICAgICAgICAgIG9wdGlvbnNQcm9wZXJ0eToge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLlZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICBkb2NzOiBcIlZpdGVzdCBjb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIF07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb21wb25lbnQgdG8gYmUgaW50ZWdyYXRlZCBpbnRvIGEgZ2VuZXJhdGVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBjbGFzcyByZWZlcmVuY2VcbiAgICAgKlxuICAgICAqIEBqc2lpIGlnbm9yZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudENsYXNzOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgYnkgc2VhcmNoaW5nIEpTSUkgbWFuaWZlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogT3B0aW9uYWwgLSBhdXRvLWRldGVjdGVkIGZyb20gY29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICAgICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIG9wdGlvbnMgcHJvcGVydHkgZ2VuZXJhdGlvbi5cbiAgICAgKiBTZXQgdG8gc3RyaW5nIG9yIG9iamVjdCB0byBjdXN0b21pemUgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3B0aW9uc1Byb3BlcnR5Pzogc3RyaW5nIHwgQ29tcG9uZW50T3B0aW9ucyB8IGZhbHNlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9wdGlvbnMgcHJvcGVydHlcbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIHN1bW1hcnkgKG9wdGlvbmFsLCBhdXRvLWRldGVjdGVkIGZyb20gY29tcG9uZW50IGNvbnN0cnVjdG9yKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRvY3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgUHJvamVjdEdlbmVyYXRvciBjb21wb25lbnRcbiAqXG4gKiBDb25maWd1cmVzIHRoZSBnZW5lcmF0aW9uIG9mIGEgVHlwZVNjcmlwdCBwcm9qZWN0IGNsYXNzIHRoYXQgZXh0ZW5kcyBhIFByb2plbiBiYXNlIGNsYXNzXG4gKiB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyBleHRlbmRzIFNvdXJjZUNvZGVPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKGUuZy4sIFwiVHlwZVNjcmlwdFByb2plY3RcIilcbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25zIGludGVyZmFjZSB3aWxsIGJlIG5hbWVkIGAke25hbWV9T3B0aW9uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCBQcm9qZW4gYmFzZSBjbGFzcyB0byBleHRlbmQgYW5kIHdoaWNoIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBhcHBseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLlRZUEVTQ1JJUFRcbiAgICAgKiBAZXhhbXBsZSBQcm9qZWN0VHlwZS5KU0lJXG4gICAgICovXG4gICAgcmVhZG9ubHkgcHJvamVjdFR5cGU6IFByb2plY3RUeXBlO1xuXG4gICAgLyoqXG4gICAgICogT3V0cHV0IGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc1xuICAgICAqXG4gICAgICogTXVzdCBjb250YWluIGEgZGlyZWN0b3J5IHNlcGFyYXRvci4gVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcInNyYy9wcm9qZWN0cy90eXBlc2NyaXB0LmdlbmVyYXRlZC50c1wiXG4gICAgICovXG4gICAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudHMgdG8gaW50ZWdyYXRlIGludG8gdGhlIHByb2plY3RcbiAgICAgKlxuICAgICAqIEVhY2ggY29tcG9uZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkIGR1cmluZyBwcm9qZWN0IGNvbnN0cnVjdGlvbiBhbmQgY2FuIGJlXG4gICAgICogY29uZmlndXJlZCB2aWEgYW4gb3B0aW9uYWwgb3B0aW9ucyBwcm9wZXJ0eSBpbiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFt7IGNvbXBvbmVudDogTWlzZSB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IHsgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsIHR5cGU6IFwiLi4uXCIsIGRvY3M6IFwiLi4uXCIgfSB9XVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBDb21wb25lbnRbXTtcblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gZXh0ZW5kIHRoZSBiYXNlIG9wdGlvbnMgd2l0aCBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0b1xuICAgICAqIHlvdXIgcHJvamVjdCB0eXBlLlxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkaXRpb25hbE9wdGlvbnM/OiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IG5hbWVzIHRvIG9taXQgZnJvbSB0aGUgYmFzZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gaGlkZSBiYXNlIGNsYXNzIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNvbmZpZ3VyYWJsZVxuICAgICAqIGluIHRoZSBnZW5lcmF0ZWQgcHJvamVjdCB0eXBlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9taXRPcHRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQnVmZmVyIGZvciBidWlsZGluZyBpbmRlbnRlZCBjb2RlIHdpdGggYXV0b21hdGljIGxpbmUgbWFuYWdlbWVudFxuICpcbiAqIE1haW50YWlucyBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIGxpbmVzLFxuICogb3BlbmluZy9jbG9zaW5nIGJsb2NrcywgYW5kIGZsdXNoaW5nIGFjY3VtdWxhdGVkIGNvbnRlbnQuXG4gKi9cbmNsYXNzIENvZGVCdWZmZXIge1xuICAgIHByaXZhdGUgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW5kZW50IC0gU3RyaW5nIHRvIHVzZSBmb3IgZWFjaCBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogc2luZ2xlIHNwYWNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5kZW50ID0gXCIgXCIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBhY2N1bXVsYXRlZCBsaW5lcyBhbmQgcmVzZXRzIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGNvZGUgbGluZXMgd2l0aCBwcm9wZXIgaW5kZW50YXRpb25cbiAgICAgKi9cbiAgICBmbHVzaCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmxpbmVzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW5lIG9mIGNvZGUgYXQgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gQ29kZSB0byBhZGQgKG9wdGlvbmFsLCBhZGRzIGJsYW5rIGxpbmUgaWYgb21pdHRlZClcbiAgICAgKi9cbiAgICBsaW5lKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5pbmRlbnQucmVwZWF0KHRoaXMuaW5kZW50TGV2ZWwpO1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2goKHByZWZpeCArIChjb2RlID8/IFwiXCIpKS50cmltRW5kKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbmV3IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGJlZm9yZSBpbmNyZWFzaW5nIGluZGVudCAoZS5nLiwgb3BlbmluZyBicmFjZSlcbiAgICAgKi9cbiAgICBvcGVuKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsKys7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGFmdGVyIGRlY3JlYXNpbmcgaW5kZW50IChlLmcuLCBjbG9zaW5nIGJyYWNlKVxuICAgICAqIEB0aHJvd3Mge0ludmFsaWRJbmRlbnRMZXZlbEVycm9yfSBXaGVuIGF0dGVtcHRpbmcgdG8gZGVjcmVhc2UgaW5kZW50IGJlbG93IHplcm9cbiAgICAgKi9cbiAgICBjbG9zZShjb2RlPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGVudExldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEluZGVudExldmVsRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsLS07XG4gICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJ1ZmZlciB0byBpbml0aWFsIHN0YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudExldmVsID0gMDtcbiAgICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBQcm9qZWN0R2VuZXJhdG9yIG9wdGlvbnNcbiAqXG4gKiBHZW5lcmF0ZXMgYSBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgaW5jbHVkaW5nIGltcG9ydHMsIG9wdGlvbnMgaW50ZXJmYWNlIGV4cG9ydCxcbiAqIGNsYXNzIGRlY2xhcmF0aW9uLCBhbmQgY29uc3RydWN0b3Igd2l0aCBjb21wb25lbnQgaW50ZWdyYXRpb24uXG4gKlxuICogVXNlcyBKU0lJIG1hbmlmZXN0IGludHJvc3BlY3Rpb24gdG8gdmFsaWRhdGUgYmFzZSBjbGFzc2VzIGFuZCBvcHRpb25zIGludGVyZmFjZXMuXG4gKi9cbmNsYXNzIFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyIHtcbiAgICBwcml2YXRlIGJ1ZmZlcjogQ29kZUJ1ZmZlcjtcbiAgICBwdWJsaWMganNpaU1hbmlmZXN0OiBBc3NlbWJseTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBOdW1iZXIgb2Ygc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogNClcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbmRlbnQgPSA0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IENvZGVCdWZmZXIoXCIgXCIucmVwZWF0KGluZGVudCkpO1xuICAgICAgICAvKiBMb2FkIFByb2plbidzIEpTSUkgbWFuaWZlc3QgZm9yIGJhc2UgY2xhc3MgaW50cm9zcGVjdGlvbiAqL1xuICAgICAgICBjb25zdCBwcm9qZW5QYWNrYWdlSnNvbiA9IHJlcXVpcmUucmVzb2x2ZShcInByb2plbi9wYWNrYWdlLmpzb25cIik7XG4gICAgICAgIGNvbnN0IHByb2plblJvb3QgPSBkaXJuYW1lKHByb2plblBhY2thZ2VKc29uKTtcbiAgICAgICAgY29uc3QganNpaVBhdGggPSBqb2luKHByb2plblJvb3QsIFwiLmpzaWlcIik7XG4gICAgICAgIHRoaXMuanNpaU1hbmlmZXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgY29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGZyb20gb3B0aW9uc1xuICAgICAqXG4gICAgICogT3JjaGVzdHJhdGVzIHRoZSByZW5kZXJpbmcgcHJvY2VzczogZGVyaXZlcyBuYW1lcywgZXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24sXG4gICAgICogYnVpbGRzIGltcG9ydCBzdGF0ZW1lbnRzLCBhbmQgcmVuZGVycyB0aGUgY2xhc3Mgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIENvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIHJlbmRlcihvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuYnVmZmVyLmZsdXNoKCk7XG5cbiAgICAgICAgLyogRGVyaXZlIGludGVyZmFjZSBhbmQgdHlwZSBuYW1lcyBmcm9tIHRoZSBjbGFzcyBuYW1lICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNUeXBlID0gYmFzZU9wdGlvbnNGcW4ucmVwbGFjZSgvXnByb2plblxcLi8sIFwiXCIpO1xuXG4gICAgICAgIC8qIFVzZSBwcm92aWRlZCBjb21wb25lbnRzIG9yIGZhbGwgYmFjayB0byBkZWZhdWx0cyAoTWlzZSArIFZpdGVzdCkgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuXG4gICAgICAgIC8qIEV4dHJhY3QgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gKi9cbiAgICAgICAgY29uc3QgeyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkgfSA9IHRoaXMuZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoY29tcG9uZW50cyk7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmV4dHJhY3RJbXBvcnRzKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFJlbmRlciBhbGwgc2VjdGlvbnMgb2YgdGhlIGNsYXNzIGZpbGUgKi9cbiAgICAgICAgdGhpcy5yZW5kZXJJbXBvcnRzKGltcG9ydHMpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ2xhc3Mob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5mbHVzaCgpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgZnJvbSBwcm9qZWN0IHR5cGVcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvamVuIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBieSBhcHBlbmRpbmcgXCJPcHRpb25zXCIgc3VmZml4IGFuZCBwcmVmaXhpbmcgd2l0aCBcInByb2plbi5cIiBuYW1lc3BhY2UuXG4gICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGJhc2UgY2xhc3MgZXhpc3RzIGluIFByb2plbidzIEpTSUkgbWFuaWZlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBvcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogQHRocm93cyB7SW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yfSBXaGVuIHByb2plY3RUeXBlIGZvcm1hdCBpcyBpbnZhbGlkIG9yIGNsYXNzIG5vdCBmb3VuZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5UWVBFU0NSSVBUKSAvLyBcInByb2plbi50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiXG4gICAgICogZ2V0QmFzZU9wdGlvbnNGcW4oUHJvamVjdFR5cGUuSlNJSSkgLy8gXCJwcm9qZW4uY2RrLkpzaWlQcm9qZWN0T3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0QmFzZU9wdGlvbnNGcW4ocHJvamVjdFR5cGU6IFByb2plY3RUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gcHJvamVjdFR5cGUudmFsdWVPZigpO1xuICAgICAgICAvKiBWYWxpZGF0ZSBiYXNlIGNsYXNzIGZvcm1hdDogbXVzdCBjb250YWluIG1vZHVsZS5DbGFzc05hbWUgc3RydWN0dXJlICovXG4gICAgICAgIGlmICghYmFzZUNsYXNzLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihiYXNlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzZUNsYXNzRnFuID0gYHByb2plbi4ke2Jhc2VDbGFzc31gO1xuICAgICAgICBjb25zdCBvcHRpb25zRnFuID0gYCR7YmFzZUNsYXNzRnFufU9wdGlvbnNgO1xuXG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW2Jhc2VDbGFzc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYEJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIEpTSUkgbWFuaWZlc3Q6ICR7YmFzZUNsYXNzRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyBpbnRlcmZhY2UgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGBPcHRpb25zIGludGVyZmFjZSBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtvcHRpb25zRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnNGcW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGNvZGUgZ2VuZXJhdGlvblxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgaW50bzpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZSBsaXN0OiB2YXJpYWJsZSBuYW1lcyB0byBleHRyYWN0IGZyb20gb3B0aW9uc1xuICAgICAqIDIuIENvbXBvbmVudCBhcnJheTogY29kZSBzdHJpbmcgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50cyAtIENvbXBvbmVudCBjb25maWd1cmF0aW9uc1xuICAgICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRlc3RydWN0dXJlIGFycmF5IGFuZCBjb21wb25lbnRBcnJheSBjb2RlIHN0cmluZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJbnB1dDogW3sgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgLi4uIH0gfV1cbiAgICAgKiBPdXRwdXQ6IHtcbiAgICAgKiAgIGRlc3RydWN0dXJlOiBbXCJ2aXRlc3RcIiwgXCJ2aXRlc3RPcHRpb25zXCJdLFxuICAgICAqICAgY29tcG9uZW50QXJyYXk6IFwiW3sgY29tcG9uZW50OiBWaXRlc3QsIGVuYWJsZWQ6IHZpdGVzdCwgb3B0aW9uczogdml0ZXN0T3B0aW9ucyB9XVwiXG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoY29tcG9uZW50czogQ29tcG9uZW50W10pOiB7IGRlc3RydWN0dXJlOiBzdHJpbmdbXTsgY29tcG9uZW50QXJyYXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAvKiBDb252ZXJ0IGNvbXBvbmVudCBjbGFzcyBuYW1lIHRvIGNhbWVsQ2FzZSB2YXJpYWJsZSBuYW1lIChlLmcuLCBWaXRlc3QgLT4gdml0ZXN0KSAqL1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGMuY29tcG9uZW50Q2xhc3MubmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIGRlc3RydWN0dXJlLnB1c2gobmFtZSk7XG5cbiAgICAgICAgICAgIC8qIEJ1aWxkIGNvbXBvbmVudCBjb25maWcgb2JqZWN0IGZvciBhcHBseURlZmF1bHRzKCkgY2FsbCAqL1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBbYGNvbXBvbmVudDogJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9YF07XG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkgJiYgdHlwZW9mIGMub3B0aW9uc1Byb3BlcnR5ICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgY29uZmlndXJhYmxlIG9wdGlvbnMgLSBpbmNsdWRlIGJvdGggZW5hYmxlZCBmbGFnIGFuZCBvcHRpb25zICovXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgPT09IFwic3RyaW5nXCIgPyBjLm9wdGlvbnNQcm9wZXJ0eSA6IGMub3B0aW9uc1Byb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgZW5hYmxlZDogJHtuYW1lfWAsIGBvcHRpb25zOiAke3Byb3BOYW1lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgLSBvbmx5IGluY2x1ZGUgZW5hYmxlZCBmbGFnICovXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgZW5hYmxlZDogJHtuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50UGFydHMucHVzaChgeyAke3BhcnRzLmpvaW4oXCIsIFwiKX0gfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5OiBgWyR7Y29tcG9uZW50UGFydHMuam9pbihcIiwgXCIpfV1gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGltcG9ydCBzdGF0ZW1lbnRzIG1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc1xuICAgICAqXG4gICAgICogQ29sbGVjdHMgYWxsIHJlcXVpcmVkIGltcG9ydHM6XG4gICAgICogLSBQcm9qZW4gYmFzZSBtb2R1bGUgKHR5cGVzY3JpcHQsIGNkaywgYXdzY2RrKVxuICAgICAqIC0gQ29uZmlnIHV0aWxpdGllcyAoYXBwbHlEZWZhdWx0cywgZGVmYXVsdE9wdGlvbnMpXG4gICAgICogLSBDb21wb25lbnQgY2xhc3Nlc1xuICAgICAqIC0gVXRpbGl0eSBmdW5jdGlvbnMgKGRlZXBNZXJnZSlcbiAgICAgKiAtIEdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZSAodHlwZS1vbmx5IGltcG9ydClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEByZXR1cm5zIE1hcCBvZiBtb2R1bGUgcGF0aHMgdG8gc2V0cyBvZiBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdEltcG9ydHMob3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBiYXNlIG1vZHVsZSBuYW1lIGZyb20gcHJvamVjdFR5cGUgKGUuZy4sIFwidHlwZXNjcmlwdFwiIGZyb20gXCJ0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XCIpICovXG4gICAgICAgIGNvbnN0IGJhc2VNb2R1bGUgPSBvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKS5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFByb2plbiBiYXNlIG1vZHVsZSBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCJwcm9qZW5cIiwgbmV3IFNldChbYmFzZU1vZHVsZV0pKTtcblxuICAgICAgICAvKiBDb25maWd1cmF0aW9uIHV0aWxpdGllcyBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCIuLi9jb25maWdcIiwgbmV3IFNldChbXCJhcHBseURlZmF1bHRzXCIsIFwiZGVmYXVsdE9wdGlvbnNcIl0pKTtcblxuICAgICAgICAvKiBDb21wb25lbnQgY2xhc3MgaW1wb3J0cyAtIGRlcml2ZSBtb2R1bGUgcGF0aCBmcm9tIGNvbXBvbmVudCBjbGFzcyBuYW1lICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBvcHRpb25zLmNvbXBvbmVudHMgPz8gZ2V0RGVmYXVsdENvbXBvbmVudHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjLmNvbXBvbmVudENsYXNzLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gYC4uL2NvbXBvbmVudHMvJHtjb21wb25lbnROYW1lLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgICAgICAgIGlmICghaW1wb3J0cy5oYXMobW9kdWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRzLnNldChtb2R1bGVQYXRoLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbW9kdWxlSW1wb3J0cyA9IGltcG9ydHMuZ2V0KG1vZHVsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKG1vZHVsZUltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGVJbXBvcnRzLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFV0aWxpdHkgZnVuY3Rpb25zIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL3V0aWxzXCIsIG5ldyBTZXQoW1wiZGVlcE1lcmdlXCJdKSk7XG5cbiAgICAgICAgLyogR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlIGltcG9ydCAodHlwZS1vbmx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcykgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoYC4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZGAsIG5ldyBTZXQoW29wdGlvbnNJbnRlcmZhY2VdKSk7XG5cbiAgICAgICAgcmV0dXJuIGltcG9ydHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgY29uZmlnIHBhdGggZm9yIGFjY2Vzc2luZyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgcGF0aCBpbiB0aGUgZGVmYXVsdE9wdGlvbnNcbiAgICAgKiBjb25maWd1cmF0aW9uIG9iamVjdCBleHBvcnRlZCBmcm9tIGNvbmZpZy50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgQ29uZmlnIHBhdGggZm9yIGFjY2Vzc2luZyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogZ2V0Q29uZmlnUGF0aChQcm9qZWN0VHlwZS5UWVBFU0NSSVBUKSAvLyBcImRlZmF1bHRPcHRpb25zLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q29uZmlnUGF0aChwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYGRlZmF1bHRPcHRpb25zLiR7cHJvamVjdFR5cGUudmFsdWVPZigpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBpbXBvcnQgc3RhdGVtZW50cyBpbiBzb3J0ZWQgb3JkZXJcbiAgICAgKlxuICAgICAqIFNvcnRzIGltcG9ydHMgd2l0aCBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzLlxuICAgICAqIFVzZXMgdHlwZS1vbmx5IGltcG9ydHMgZm9yIGdlbmVyYXRlZCBmaWxlcyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW1wb3J0cyAtIE1hcCBvZiBtb2R1bGUgcGF0aHMgdG8gaW1wb3J0ZWQgbmFtZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckltcG9ydHMoaW1wb3J0czogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KSB7XG4gICAgICAgIC8qIFNvcnQgbW9kdWxlczogZXh0ZXJuYWwgcGFja2FnZXMgZmlyc3QsIHRoZW4gcmVsYXRpdmUgaW1wb3J0cyBhbHBoYWJldGljYWxseSAqL1xuICAgICAgICBjb25zdCBzb3J0ZWRNb2R1bGVzID0gQXJyYXkuZnJvbShpbXBvcnRzLmtleXMoKSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYUlzUmVsYXRpdmUgPSBhLnN0YXJ0c1dpdGgoXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgYklzUmVsYXRpdmUgPSBiLnN0YXJ0c1dpdGgoXCIuXCIpO1xuICAgICAgICAgICAgaWYgKGFJc1JlbGF0aXZlICE9PSBiSXNSZWxhdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhSXNSZWxhdGl2ZSA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW9kIG9mIHNvcnRlZE1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShpbXBvcnRzLmdldChtb2QpIHx8IFtdKS5zb3J0KCk7XG4gICAgICAgICAgICAvKiBVc2UgdHlwZS1vbmx5IGltcG9ydCBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzICovXG4gICAgICAgICAgICBjb25zdCBpc1R5cGVPbmx5ID0gbW9kLmluY2x1ZGVzKFwiLmdlbmVyYXRlZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydFN0bXQgPSBpc1R5cGVPbmx5ID8gXCJpbXBvcnQgdHlwZVwiIDogXCJpbXBvcnRcIjtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYCR7aW1wb3J0U3RtdH0geyAke25hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHttb2R9XCI7YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHJlLWV4cG9ydCBzdGF0ZW1lbnQgZm9yIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdG8gZXhwb3J0XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICAvKiB0eXBlLW9ubHkgcmUtZXhwb3J0LCByZXF1aXJlZCBieSBgaXNvbGF0ZWRNb2R1bGVzYCAqL1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBleHBvcnQgdHlwZSB7ICR7b3B0aW9uc0ludGVyZmFjZX0gfSBmcm9tIFwiLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkXCI7YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY2xhc3MgZGVjbGFyYXRpb24gYW5kIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNsYXNzKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAgKiAke29wdGlvbnMubmFtZX0gd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25gKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogRXh0ZW5kcyBQcm9qZW4ncyBiYXNlIGNsYXNzIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGF1dG9tYXRpYyBjb21wb25lbnQgc2V0dXAuXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBleHBvcnQgY2xhc3MgJHtvcHRpb25zLm5hbWV9IGV4dGVuZHMgJHtvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKX0ge2ApO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnN0cnVjdG9yKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3I6XG4gICAgICogMS4gRGVzdHJ1Y3R1cmVzIGNvbXBvbmVudCBmbGFncyBhbmQgb3B0aW9ucyBmcm9tIHRoZSBvcHRpb25zIHBhcmFtZXRlclxuICAgICAqIDIuIE1lcmdlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgICAgKiAzLiBDYWxscyBzdXBlcigpIHdpdGggbWVyZ2VkIG9wdGlvbnNcbiAgICAgKiA0LiBBcHBsaWVzIGNvbXBvbmVudCBkZWZhdWx0cyB2aWEgYXBwbHlEZWZhdWx0cygpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGNvbnN0cnVjdG9yKG9wdGlvbnM6ICR7b3B0aW9uc0ludGVyZmFjZX0pIHtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIFNlcGFyYXRlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZyb20gYmFzZSBQcm9qZW4gb3B0aW9ucyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgY29uc3QgeyAke2Rlc3RydWN0dXJlLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgc3VwZXIoZGVlcE1lcmdlPCR7YmFzZU9wdGlvbnNUeXBlfT4oJHtjb25maWdQYXRofSwgYmFzZU9wdGlvbnMpKTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGFwcGx5RGVmYXVsdHModGhpcywgJHtjb21wb25lbnRBcnJheX0pO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBvcHRpb25zIGludGVyZmFjZSBuYW1lIHRvIGZpbGUgbmFtZVxuICAgICAqXG4gICAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBpbnRlcmZhY2UgbmFtZXMgdG8ga2ViYWItY2FzZSBmaWxlIG5hbWVzLlxuICAgICAqIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGNvbnZlcnNpb24gZm9yIHVubWFwcGVkIGludGVyZmFjZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAcmV0dXJucyBLZWJhYi1jYXNlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRPcHRpb25zRmlsZU5hbWUoXCJUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnNcIikgLy8gXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIlxuICAgICAqL1xuICAgIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zOiBcInR5cGVzY3JpcHQtb3B0aW9uc1wiLFxuICAgICAgICAgICAgSnNpaVByb2plY3RPcHRpb25zOiBcImpzaWktb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3RPcHRpb25zOiBcImF3c2Nkay10eXBlc2NyaXB0LWFwcC1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LW9wdGlvbnNcIixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdbb3B0aW9uc0ludGVyZmFjZV0gfHwgb3B0aW9uc0ludGVyZmFjZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9qZW4gY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIFR5cGVTY3JpcHQgcHJvamVjdCBjbGFzc2VzIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgcHJvamVjdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIFByb2plbiBiYXNlIGNsYXNzZXNcbiAqIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2plY3RHZW5lcmF0b3IgZXh0ZW5kcyBwcm9qZW4uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcjtcbiAgICBwcml2YXRlIHN0YXRpYyBlbnVtR2VuZXJhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcigpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlIFByb2plY3RUeXBlIGVudW0gb25jZSBvbiBmaXJzdCBpbnN0YW50aWF0aW9uICovXG4gICAgICAgIGlmICghUHJvamVjdEdlbmVyYXRvci5lbnVtR2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvamVjdFR5cGVFbnVtKCk7XG4gICAgICAgICAgICBQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogR2VuZXJhdGUgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHVzaW5nIFByb2plblN0cnVjdCBmb3IgSlNJSSBjb21wYXRpYmlsaXR5ICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5yZW5kZXJlci5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVQYXRoID0gdGhpcy5nZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuU3RydWN0IGdlbmVyYXRlcyBhIGNvbmNyZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZyb20gUHJvamVuJ3Mgb3B0aW9uc1xuICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEpTSUkgZG9lc24ndCBzdXBwb3J0IFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlcyBsaWtlIE9taXQ8PlxuICAgICAgICAgKiBUaGUgZ2VuZXJhdGVkIGludGVyZmFjZSBjYW4gYmUgY29uc3VtZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIChQeXRob24sIEphdmEsIEMjLCBHbykgKi9cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gbmV3IFByb2plblN0cnVjdCh0aGlzLmFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdCksIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgICAgICBmaWxlUGF0aDogb3B0aW9uc0ZpbGVQYXRoLFxuICAgICAgICAgICAgb3V0cHV0RmlsZU9wdGlvbnM6IHsgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5taXhpbih0aGlzLndpdGhvdXRQYWNrYWdlTWFuYWdlckluaXRpYWxWYWx1ZShTdHJ1Y3QuZnJvbUZxbihiYXNlT3B0aW9uc0ZxbikpKVxuICAgICAgICAgICAgLndpdGhvdXREZXByZWNhdGVkKCk7XG5cbiAgICAgICAgLyogUmVtb3ZlIHNwZWNpZmllZCBvcHRpb25zIGZyb20gdGhlIGJhc2UgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLm9taXRPcHRpb25zKSB7XG4gICAgICAgICAgICBzdHJ1Y3Qub21pdCguLi5vcHRpb25zLm9taXRPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjb21wb25lbnQtZGVyaXZlZCBvcHRpb25zIHRvIHRoZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBjb25zdCB7IFByaW1pdGl2ZVR5cGUgfSA9IHJlcXVpcmUoXCJAanNpaS9zcGVjXCIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZW5hYmxlZCBmbGFnIGZvciB0aGUgY29tcG9uZW50ICovXG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHsgcHJpbWl0aXZlOiBQcmltaXRpdmVUeXBlLkJvb2xlYW4gfSxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBFbmFibGUgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbXBvbmVudGAsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogQWRkIG9wdGlvbnMgcHJvcGVydHkgaWYgY29tcG9uZW50IGlzIGNvbmZpZ3VyYWJsZSAqL1xuICAgICAgICAgICAgaWYgKGMub3B0aW9uc1Byb3BlcnR5ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNUeXBlID0gdGhpcy5yZXNvbHZlQ29tcG9uZW50T3B0aW9uc1R5cGUoYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zVHlwZSAmJiAhdGhpcy5pc0ZxbkF2YWlsYWJsZShvcHRpb25zVHlwZS5mcW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgb3B0aW9ucyB0eXBlIGlzIG5vdCBpbiB0aGUgbWFuaWZlc3QgeWV0LCB3aGljaCBpcyBleHBlY3RlZCB3aGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogYSBuZXcgY29tcG9uZW50IGlzIGJlaW5nIGludHJvZHVjZWQ6IGl0cyB0eXBlIG9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hbmlmZXN0IG9uY2UgaXQgaGFzIGJlZW4gY29tcGlsZWQuIE5ldmVyIGxlYXZlIHRoaXMgc2lsZW50LCBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogc2tpcHBpbmcgdGhlIHByb3BlcnR5IHJlbW92ZXMgaXQgZnJvbSB0aGUgcHVibGljIEFQSSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrYWdlIC0gYSBzdGFsZSBvciB1bnJlYWRhYmxlIG1hbmlmZXN0IGxvb2tzIGV4YWN0bHkgdGhlIHNhbWUuICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDb21wb25lbnQgb3B0aW9ucyB0eXBlIGlzIG1pc3NpbmcgZnJvbSB0aGUgSlNJSSBtYW5pZmVzdCwgb21pdHRpbmcgdGhlIG9wdGlvbnMgcHJvcGVydHkuIENvbXBpbGUgdGhlIHBhY2thZ2UgYW5kIHN5bnRoZXNpemUgYWdhaW4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYy5jb21wb25lbnRDbGFzcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcW46IG9wdGlvbnNUeXBlLmZxbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uc1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNUeXBlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogeyBmcW46IG9wdGlvbnNUeXBlLmZxbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogb3B0aW9uc1R5cGUuZG9jcyA/PyBgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBgLSBkZWZhdWx0ICR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgcGFyYW1ldGVyIG9yIHJlc29sdXRpb24gZmFpbGVkIC0gc2tpcCAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcmVzb2x2ZSBjb21wb25lbnQgb3B0aW9ucyB0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudENsYXNzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjdXN0b20gb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zICYmIG9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RydWN0LmFkZCguLi5vcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSBgQHBqbmV3YCBhbm5vdGF0aW9uIGZyb20gdGhlIGBwYWNrYWdlTWFuYWdlcmAgb3B0aW9uLlxuICAgICAqXG4gICAgICogYHByb2plbiBuZXdgIHJlbmRlcnMgdGhhdCBhbm5vdGF0aW9uIGFzIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGluIHRoZSBgLnByb2plbnJjLnRzYFxuICAgICAqIGl0IGdlbmVyYXRlcywgd2hlcmUgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkZWZhdWx0cyB0aGVzZSBwcm9qZWN0IHR5cGVzXG4gICAgICogYXBwbHkuIFByb2plbiBhbm5vdGF0ZXMgYHBhY2thZ2VNYW5hZ2VyYCB3aXRoIHRoZSBgJFBBQ0tBR0VfTUFOQUdFUmAgbWFjcm8sIHdoaWNoXG4gICAgICogcmVzb2x2ZXMgdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB0aGF0IHJ1bnMgdGhlIGNvbW1hbmQsIHNvIGBucHggcHJvamVuIG5ldyAtLWZyb21gXG4gICAgICogd291bGQgcGluIGEgbmV3IHByb2plY3QgdG8gbnBtLiBXaXRob3V0IGFuIGFubm90YXRpb24gdGhlIG9wdGlvbiBpcyBsZWZ0IG91dCBvZlxuICAgICAqIHRoZSBnZW5lcmF0ZWQgYC5wcm9qZW5yYy50c2AgYW5kIHRoZSBkZWZhdWx0IG9mIHRoaXMgbGlicmFyeSBhcHBsaWVzLlxuICAgICAqXG4gICAgICogVGhlIGFubm90YXRpb24gY2Fubm90IGJlIHJlLXBvaW50ZWQgYXQgcG5wbSBpbnN0ZWFkOiBwcm9qZW4gb25seSBhY2NlcHRzIGEgbWFjcm9cbiAgICAgKiBvciBhIHByaW1pdGl2ZSB2YWx1ZSBhcyBhbiBpbml0aWFsIHZhbHVlLCBhbmQgdGhpcyBvcHRpb24gaXMgYW4gZW51bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXNlIC0gVGhlIHByb2plbiBvcHRpb25zIHN0cnVjdCB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBpcyBkZXJpdmVkIGZyb21cbiAgICAgKi9cbiAgICBwcml2YXRlIHdpdGhvdXRQYWNrYWdlTWFuYWdlckluaXRpYWxWYWx1ZShiYXNlOiBTdHJ1Y3QpOiBTdHJ1Y3Qge1xuICAgICAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGJhc2UucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gXCJwYWNrYWdlTWFuYWdlclwiKTtcblxuICAgICAgICBpZiAoIXBhY2thZ2VNYW5hZ2VyPy5kb2NzPy5jdXN0b20/LnBqbmV3KSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcGpuZXcsIC4uLmN1c3RvbSB9ID0gcGFja2FnZU1hbmFnZXIuZG9jcy5jdXN0b207XG5cbiAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZShcInBhY2thZ2VNYW5hZ2VyXCIsIHtcbiAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLmRvY3MsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYC0gJHtqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5QTlBNfWAsXG4gICAgICAgICAgICAgICAgY3VzdG9tLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRlFOIGlzIGF2YWlsYWJsZSBpbiBhbnkgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcW5BdmFpbGFibGUoZnFuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5sb2FkTWFuaWZlc3RGb3JGcW4oZnFuKTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdC50eXBlcz8uW2Zxbl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBjb21wb25lbnQgb3B0aW9ucyB0eXBlIGZyb20gSlNJSSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQXV0by1kZXRlY3RzIG9wdGlvbnMgZnJvbSBKU0lJIG1hbmlmZXN0IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIHVuZGVmaW5lZC5cbiAgICAgKiBSZXR1cm5zIG51bGwgb25seSB3aGVuIG9wdGlvbnNQcm9wZXJ0eSBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjb21wb25lbnQ6IENvbXBvbmVudCk6IHsgbmFtZTogc3RyaW5nOyBmcW46IHN0cmluZzsgZG9jcz86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgICAgIC8qIE5vcm1hbGl6ZSBvcHRpb25zUHJvcGVydHkgdG8gQ29tcG9uZW50T3B0aW9ucyAqL1xuICAgICAgICBsZXQgb3B0aW9uc0NvbmZpZzogQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0geyBuYW1lOiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5IH07XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgb3B0aW9uc0NvbmZpZyA9IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVc2UgZXhwbGljaXQgdHlwZSBpZiBwcm92aWRlZCAqL1xuICAgICAgICBpZiAob3B0aW9uc0NvbmZpZz8udHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgZnFuOiBvcHRpb25zQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgZG9jczogb3B0aW9uc0NvbmZpZy5kb2NzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEZpbmQgY29tcG9uZW50IGluIEpTSUkgbWFuaWZlc3RzICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZxbiA9IGNvbXBvbmVudC5mcW4gPz8gdGhpcy5maW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihjb21wb25lbnRGcW4pO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bY29tcG9uZW50RnFuXTtcbiAgICAgICAgaWYgKCFjbGFzc1R5cGUgfHwgY2xhc3NUeXBlLmtpbmQgIT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnRGcW4sIFwiQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSAoY2xhc3NUeXBlIGFzIHsgaW5pdGlhbGl6ZXI/OiB7IHBhcmFtZXRlcnM/OiBBcnJheTx7IHR5cGU/OiB7IGZxbj86IHN0cmluZyB9IH0+IH0gfSlcbiAgICAgICAgICAgIC5pbml0aWFsaXplcjtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplcj8ucGFyYW1ldGVycz8uWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhcmFtID0gaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZxbiA9IG9wdGlvbnNQYXJhbS50eXBlPy5mcW47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zRnFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIG5vIEZRTiAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSBtYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dO1xuICAgICAgICBjb25zdCBkb2NzID0gKG9wdGlvbnNUeXBlIGFzIHsgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQpPy5kb2NzPy5zdW1tYXJ5O1xuXG4gICAgICAgIC8qIEF1dG8tZ2VuZXJhdGUgcHJvcGVydHkgbmFtZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IGAke25hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcHRpb25zQ29uZmlnPy5uYW1lID8/IGRlZmF1bHROYW1lO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3BlcnR5TmFtZSwgZnFuOiBvcHRpb25zRnFuLCBkb2NzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgY29tcG9uZW50IEZRTiBieSBzZWFyY2hpbmcgYWxsIEpTSUkgbWFuaWZlc3RzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSBmaXJzdCAqL1xuICAgICAgICBjb25zdCBvd25GcW4gPSBgQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLiR7Y29tcG9uZW50TmFtZX1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3duTWFuaWZlc3QgPSB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICAgICAgaWYgKG93bk1hbmlmZXN0LnR5cGVzPy5bb3duRnFuXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvd25GcW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvKiBPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZSB5ZXQgZHVyaW5nIGRldmVsb3BtZW50IC0gdGhpcyBpcyBleHBlY3RlZCAqL1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2VhcmNoIGluIG5vZGVfbW9kdWxlcyBmb3IgSlNJSSBwYWNrYWdlcyAqL1xuICAgICAgICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBqb2luKF9fZGlybmFtZSwgXCIuLi8uLi9ub2RlX21vZHVsZXNcIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5maW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBrZyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMobWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcW4uZW5kc1dpdGgoYC4ke2NvbXBvbmVudE5hbWV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIFNraXAgcGFja2FnZXMgd2l0aCBpbnZhbGlkIG1hbmlmZXN0cyAtIGxvZyBmb3IgZGVidWdnaW5nICovXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBsb2FkIG1hbmlmZXN0IGZyb20gcGFja2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IoY29tcG9uZW50TmFtZSwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIGFueSBKU0lJIG1hbmlmZXN0XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBKU0lJIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEpzaWlQYWNrYWdlcyhub2RlTW9kdWxlc1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCBleGlzdHNTeW5jIH0gPSByZXF1aXJlKFwibm9kZTpmc1wiKTtcblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgsIGVudHJ5KTtcblxuICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICAgICAgLyogU2NvcGVkIHBhY2thZ2UgLSByZWN1cnNlIGludG8gc2NvcGUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBlbnRyeVBhdGg7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiByZWFkZGlyU3luYyhzY29wZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZ1BhdGggPSByZXNvbHZlKHNjb3BlUGF0aCwgc2NvcGVkRW50cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGtnUGF0aCwgXCIuanNpaVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2gocGtnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRTeW5jKGVudHJ5UGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgcGFja2FnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZW50cnlQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIEpTSUkgbWFuaWZlc3QgZm9yIGEgZ2l2ZW4gRlFOXG4gICAgICpcbiAgICAgKiBFeHRyYWN0cyBwYWNrYWdlIG5hbWUgZnJvbSBGUU4uIEZvciBzY29wZWQgcGFja2FnZXMgbGlrZSBAc2NvcGUvcGFja2FnZS5DbGFzc05hbWUsXG4gICAgICogdGhlIHBhY2thZ2UgbmFtZSBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgZG90IChpLmUuLCBAc2NvcGUvcGFja2FnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTWFuaWZlc3RGb3JGcW4oZnFuOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZnFuLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGRvdEluZGV4ID4gMCA/IGZxbi5zdWJzdHJpbmcoMCwgZG90SW5kZXgpIDogZnFuO1xuXG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSAqL1xuICAgICAgICBpZiAocGFja2FnZU5hbWUgPT09IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVHJ5IG5vZGVfbW9kdWxlcyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UoZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0TG9hZEVycm9yKHBhY2thZ2VOYW1lLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmcm9tIGEgcGFja2FnZSBkaXJlY3RvcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCIuanNpaVwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpzaWlQYXRoLCBcInV0Zi04XCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGlzIHBhY2thZ2UncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT3duTWFuaWZlc3QoKTogQXNzZW1ibHkge1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQcm9qZWN0VHlwZSBlbnVtIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2plY3RUeXBlcyA9IHRoaXMuZGlzY292ZXJQcm9qZWN0VHlwZXMoKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBFYWNoIHByb2plY3QgdHlwZSBjb3JyZXNwb25kcyB0byBhIGdlbmVyYXRlZCBwcm9qZWN0IGNsYXNzIGFuZCBpdHMgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBAZ2VuZXJhdGVkIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqL1wiKTtcbiAgICAgICAgbGluZXMucHVzaChcImV4cG9ydCBlbnVtIFByb2plY3RUeXBlIHtcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZW51bU5hbWUsIHZhbHVlLCBkb2NzXSBvZiBwcm9qZWN0VHlwZXMpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgLyoqXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICAqICR7ZG9jc31gKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgICovXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICR7ZW51bU5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goXCJ9XCIpO1xuXG4gICAgICAgIG5ldyBwcm9qZW4uVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBcInNyYy9wcm9qZWN0LXR5cGUudHNcIiwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY292ZXJzIGFsbCBwcm9qZWN0IHR5cGVzIHRoYXQgZXh0ZW5kIHByb2plbi5Qcm9qZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNjb3ZlclByb2plY3RUeXBlcygpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IFwicHJvamVuLlByb2plY3RcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmcW4sIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzID8/IHt9KSkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IHR5cGUgYXMge1xuICAgICAgICAgICAgICAgIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBiYXNlPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGRvY3M/OiB7IHN1bW1hcnk/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dGVuZHNCYXNlKGNsYXNzVHlwZSwgYmFzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGZxbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0c1swXSAhPT0gXCJwcm9qZW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZW51bU5hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCBcIl8kMVwiKVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke21vZHVsZX0uJHtjbGFzc05hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBjbGFzc1R5cGUuZG9jcz8uc3VtbWFyeSA/PyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgIHByb2plY3RUeXBlcy5wdXNoKFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRlbmRzQmFzZShjbGFzc1R5cGU6IHsgaW5oZXJpdGFuY2VQYXRoPzogc3RyaW5nW107IGJhc2U/OiBzdHJpbmcgfSwgYmFzZUNsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc1R5cGUuaW5oZXJpdGFuY2VQYXRoLmluY2x1ZGVzKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudEJhc2UgPSBjbGFzc1R5cGUuYmFzZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCYXNlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2UgPT09IGJhc2VDbGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLnJlbmRlcmVyLmpzaWlNYW5pZmVzdC50eXBlcz8uW2N1cnJlbnRCYXNlXTtcbiAgICAgICAgICAgIGlmICghYmFzZVR5cGUgfHwgYmFzZVR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QmFzZSA9IChiYXNlVHlwZSBhcyB7IGJhc2U/OiBzdHJpbmcgfSkuYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgcHJvamVuLlRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|
|
@@ -782,9 +782,8 @@ export interface AwsCdkConstructLibraryProjectOptions {
|
|
|
782
782
|
readonly packageName?: string;
|
|
783
783
|
/**
|
|
784
784
|
* The Node Package Manager used to execute scripts.
|
|
785
|
-
* @default -
|
|
785
|
+
* @default - pnpm
|
|
786
786
|
* @stability experimental
|
|
787
|
-
* @pjnew $PACKAGE_MANAGER
|
|
788
787
|
*/
|
|
789
788
|
readonly packageManager?: javascript.NodePackageManager;
|
|
790
789
|
/**
|