@nikovirtala/projen-constructs 0.1.7 → 0.2.0
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 +659 -84
- package/API.md +807 -36
- package/README.md +37 -8
- package/lib/components/typedoc-config.d.ts +321 -0
- package/lib/components/typedoc-config.js +73 -1
- package/lib/components/typedoc.d.ts +19 -0
- package/lib/components/typedoc.js +10 -1
- package/lib/components/vitest.d.ts +197 -0
- package/lib/components/vitest.js +72 -2
- package/lib/config.d.ts +4 -4
- package/lib/errors.d.ts +16 -0
- package/lib/errors.js +26 -2
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/project-generator.d.ts +95 -73
- package/lib/project-generator.js +362 -77
- package/lib/project-type.d.ts +94 -0
- package/lib/project-type.js +99 -0
- package/lib/projects/awscdk-construct-library.generated.js +4 -4
- package/lib/projects/awscdk-typescript-app.generated.js +4 -4
- package/lib/projects/jsii.generated.js +4 -4
- package/lib/projects/typescript.generated.js +4 -4
- package/lib/utils.d.ts +2 -2
- package/lib/utils.js +3 -3
- package/package.json +1 -1
- package/scripts/generate-project-types.ts +103 -0
package/lib/project-generator.js
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.ProjectGenerator = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
4
8
|
const jsii_struct_builder_1 = require("@mrgrain/jsii-struct-builder");
|
|
5
|
-
const
|
|
9
|
+
const projen = require("projen");
|
|
6
10
|
const errors_1 = require("./errors");
|
|
7
11
|
/**
|
|
8
12
|
* Default components applied to all generated projects
|
|
9
13
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
function getDefaultComponents() {
|
|
15
|
+
return [
|
|
16
|
+
{ componentClass: require("./components/mise").Mise },
|
|
17
|
+
{
|
|
18
|
+
componentClass: require("./components/vitest").Vitest,
|
|
19
|
+
optionsProperty: {
|
|
20
|
+
name: "vitestOptions",
|
|
21
|
+
type: "@nikovirtala/projen-constructs.VitestOptions",
|
|
22
|
+
docs: "Vitest configuration",
|
|
23
|
+
},
|
|
18
24
|
},
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
];
|
|
26
|
+
}
|
|
21
27
|
/**
|
|
22
28
|
* Buffer for building indented code with automatic line management
|
|
23
29
|
*
|
|
@@ -91,6 +97,8 @@ class CodeBuffer {
|
|
|
91
97
|
*
|
|
92
98
|
* Generates a complete TypeScript class file including imports, options interface export,
|
|
93
99
|
* class declaration, and constructor with component integration.
|
|
100
|
+
*
|
|
101
|
+
* Uses JSII manifest introspection to validate base classes and options interfaces.
|
|
94
102
|
*/
|
|
95
103
|
class TypeScriptClassRenderer {
|
|
96
104
|
/**
|
|
@@ -98,6 +106,11 @@ class TypeScriptClassRenderer {
|
|
|
98
106
|
*/
|
|
99
107
|
constructor(indent = 4) {
|
|
100
108
|
this.buffer = new CodeBuffer(" ".repeat(indent));
|
|
109
|
+
/* Load Projen's JSII manifest for base class introspection */
|
|
110
|
+
const projenPackageJson = require.resolve("projen/package.json");
|
|
111
|
+
const projenRoot = (0, node_path_1.dirname)(projenPackageJson);
|
|
112
|
+
const jsiiPath = (0, node_path_1.join)(projenRoot, ".jsii");
|
|
113
|
+
this.jsiiManifest = JSON.parse((0, node_fs_1.readFileSync)(jsiiPath, "utf-8"));
|
|
101
114
|
}
|
|
102
115
|
/**
|
|
103
116
|
* Renders complete TypeScript class code from options
|
|
@@ -112,10 +125,10 @@ class TypeScriptClassRenderer {
|
|
|
112
125
|
this.buffer.flush();
|
|
113
126
|
/* Derive interface and type names from the class name */
|
|
114
127
|
const optionsInterface = `${options.name}Options`;
|
|
115
|
-
const baseOptionsFqn = this.getBaseOptionsFqn(options.
|
|
128
|
+
const baseOptionsFqn = this.getBaseOptionsFqn(options.projectType);
|
|
116
129
|
const baseOptionsType = baseOptionsFqn.replace(/^projen\./, "");
|
|
117
130
|
/* Use provided components or fall back to defaults (Mise + Vitest) */
|
|
118
|
-
const components = options.components ??
|
|
131
|
+
const components = options.components ?? getDefaultComponents();
|
|
119
132
|
/* Extract component configuration for constructor generation */
|
|
120
133
|
const { destructure, componentArray } = this.extractComponentOptions(components);
|
|
121
134
|
const imports = this.extractImports(options, optionsInterface);
|
|
@@ -125,29 +138,40 @@ class TypeScriptClassRenderer {
|
|
|
125
138
|
this.renderExport(optionsInterface);
|
|
126
139
|
this.buffer.line();
|
|
127
140
|
this.renderClass(options, optionsInterface, baseOptionsType, destructure, componentArray);
|
|
128
|
-
this.buffer.line();
|
|
129
141
|
return this.buffer.flush().join("\n");
|
|
130
142
|
}
|
|
131
143
|
/**
|
|
132
|
-
* Derives the fully qualified options interface name from
|
|
144
|
+
* Derives the fully qualified options interface name from project type
|
|
133
145
|
*
|
|
134
|
-
* Transforms
|
|
146
|
+
* Transforms project type into the corresponding Projen options interface name
|
|
135
147
|
* by appending "Options" suffix and prefixing with "projen." namespace.
|
|
148
|
+
* Validates that the base class exists in Projen's JSII manifest.
|
|
136
149
|
*
|
|
137
|
-
* @param
|
|
150
|
+
* @param projectType - Project type identifier
|
|
138
151
|
* @returns Fully qualified options interface name
|
|
139
|
-
* @throws {InvalidBaseClassFormatError} When
|
|
152
|
+
* @throws {InvalidBaseClassFormatError} When projectType format is invalid or class not found
|
|
140
153
|
*
|
|
141
154
|
* @example
|
|
142
|
-
* getBaseOptionsFqn(
|
|
143
|
-
* getBaseOptionsFqn(
|
|
155
|
+
* getBaseOptionsFqn(ProjectType.TYPESCRIPT) // "projen.typescript.TypeScriptProjectOptions"
|
|
156
|
+
* getBaseOptionsFqn(ProjectType.JSII) // "projen.cdk.JsiiProjectOptions"
|
|
144
157
|
*/
|
|
145
|
-
getBaseOptionsFqn(
|
|
158
|
+
getBaseOptionsFqn(projectType) {
|
|
159
|
+
const baseClass = projectType.valueOf();
|
|
146
160
|
/* Validate base class format: must contain module.ClassName structure */
|
|
147
161
|
if (!baseClass.includes(".")) {
|
|
148
162
|
throw new errors_1.InvalidBaseClassFormatError(baseClass);
|
|
149
163
|
}
|
|
150
|
-
|
|
164
|
+
const baseClassFqn = `projen.${baseClass}`;
|
|
165
|
+
const optionsFqn = `${baseClassFqn}Options`;
|
|
166
|
+
/* Validate base class exists in JSII manifest */
|
|
167
|
+
if (!this.jsiiManifest.types?.[baseClassFqn]) {
|
|
168
|
+
throw new errors_1.InvalidBaseClassFormatError(`Base class not found in JSII manifest: ${baseClassFqn}`);
|
|
169
|
+
}
|
|
170
|
+
/* Validate options interface exists in JSII manifest */
|
|
171
|
+
if (!this.jsiiManifest.types?.[optionsFqn]) {
|
|
172
|
+
throw new errors_1.InvalidBaseClassFormatError(`Options interface not found in JSII manifest: ${optionsFqn}`);
|
|
173
|
+
}
|
|
174
|
+
return optionsFqn;
|
|
151
175
|
}
|
|
152
176
|
/**
|
|
153
177
|
* Extracts component configuration for constructor code generation
|
|
@@ -171,14 +195,15 @@ class TypeScriptClassRenderer {
|
|
|
171
195
|
const componentParts = [];
|
|
172
196
|
for (const c of components) {
|
|
173
197
|
/* Convert component class name to camelCase variable name (e.g., Vitest -> vitest) */
|
|
174
|
-
const name = c.
|
|
198
|
+
const name = c.componentClass.name.charAt(0).toLowerCase() + c.componentClass.name.slice(1);
|
|
175
199
|
destructure.push(name);
|
|
176
200
|
/* Build component config object for applyDefaults() call */
|
|
177
|
-
const parts = [`component: ${c.
|
|
178
|
-
if (c.optionsProperty) {
|
|
201
|
+
const parts = [`component: ${c.componentClass.name}`];
|
|
202
|
+
if (c.optionsProperty && typeof c.optionsProperty !== "boolean") {
|
|
179
203
|
/* Component has configurable options - include both enabled flag and options */
|
|
180
|
-
|
|
181
|
-
|
|
204
|
+
const propName = typeof c.optionsProperty === "string" ? c.optionsProperty : c.optionsProperty.name;
|
|
205
|
+
destructure.push(propName);
|
|
206
|
+
parts.push(`enabled: ${name}`, `options: ${propName}`);
|
|
182
207
|
}
|
|
183
208
|
else {
|
|
184
209
|
/* Component has no options - only include enabled flag */
|
|
@@ -204,17 +229,17 @@ class TypeScriptClassRenderer {
|
|
|
204
229
|
*/
|
|
205
230
|
extractImports(options, optionsInterface) {
|
|
206
231
|
const imports = new Map();
|
|
207
|
-
/* Extract base module name from
|
|
208
|
-
const baseModule = options.
|
|
232
|
+
/* Extract base module name from projectType (e.g., "typescript" from "typescript.TypeScriptProject") */
|
|
233
|
+
const baseModule = options.projectType.valueOf().split(".")[0];
|
|
209
234
|
const optionsFileName = this.getOptionsFileName(optionsInterface);
|
|
210
235
|
/* Projen base module import */
|
|
211
236
|
imports.set("projen", new Set([baseModule]));
|
|
212
237
|
/* Configuration utilities import */
|
|
213
238
|
imports.set("../config", new Set(["applyDefaults", "defaultOptions"]));
|
|
214
239
|
/* Component class imports - derive module path from component class name */
|
|
215
|
-
const components = options.components ??
|
|
240
|
+
const components = options.components ?? getDefaultComponents();
|
|
216
241
|
for (const c of components) {
|
|
217
|
-
const componentName = c.
|
|
242
|
+
const componentName = c.componentClass.name;
|
|
218
243
|
const modulePath = `../components/${componentName.toLowerCase()}`;
|
|
219
244
|
if (!imports.has(modulePath)) {
|
|
220
245
|
imports.set(modulePath, new Set());
|
|
@@ -233,17 +258,17 @@ class TypeScriptClassRenderer {
|
|
|
233
258
|
/**
|
|
234
259
|
* Derives the config path for accessing default options
|
|
235
260
|
*
|
|
236
|
-
* Transforms
|
|
261
|
+
* Transforms project type into the corresponding path in the defaultOptions
|
|
237
262
|
* configuration object exported from config.ts.
|
|
238
263
|
*
|
|
239
|
-
* @param
|
|
264
|
+
* @param projectType - Project type identifier
|
|
240
265
|
* @returns Config path for accessing default options
|
|
241
266
|
*
|
|
242
267
|
* @example
|
|
243
|
-
* getConfigPath(
|
|
268
|
+
* getConfigPath(ProjectType.TYPESCRIPT) // "defaultOptions.typescript.TypeScriptProject"
|
|
244
269
|
*/
|
|
245
|
-
getConfigPath(
|
|
246
|
-
return `defaultOptions.${
|
|
270
|
+
getConfigPath(projectType) {
|
|
271
|
+
return `defaultOptions.${projectType.valueOf()}`;
|
|
247
272
|
}
|
|
248
273
|
/**
|
|
249
274
|
* Renders import statements in sorted order
|
|
@@ -278,7 +303,6 @@ class TypeScriptClassRenderer {
|
|
|
278
303
|
*/
|
|
279
304
|
renderExport(optionsInterface) {
|
|
280
305
|
const optionsFileName = this.getOptionsFileName(optionsInterface);
|
|
281
|
-
this.buffer.line();
|
|
282
306
|
this.buffer.line(`export { ${optionsInterface} } from "./${optionsFileName}.generated";`);
|
|
283
307
|
}
|
|
284
308
|
/**
|
|
@@ -291,13 +315,12 @@ class TypeScriptClassRenderer {
|
|
|
291
315
|
* @param componentArray - Code string for component array
|
|
292
316
|
*/
|
|
293
317
|
renderClass(options, optionsInterface, baseOptionsType, destructure, componentArray) {
|
|
294
|
-
this.buffer.line();
|
|
295
318
|
this.buffer.line("/**");
|
|
296
319
|
this.buffer.line(` * ${options.name} with standard configuration and component integration`);
|
|
297
320
|
this.buffer.line(" *");
|
|
298
321
|
this.buffer.line(" * Extends Projen's base class with opinionated defaults and automatic component setup.");
|
|
299
322
|
this.buffer.line(" */");
|
|
300
|
-
this.buffer.open(`export class ${options.name} extends ${options.
|
|
323
|
+
this.buffer.open(`export class ${options.name} extends ${options.projectType.valueOf()} {`);
|
|
301
324
|
this.renderConstructor(options, optionsInterface, baseOptionsType, destructure, componentArray);
|
|
302
325
|
this.buffer.close("}");
|
|
303
326
|
}
|
|
@@ -317,7 +340,7 @@ class TypeScriptClassRenderer {
|
|
|
317
340
|
* @param componentArray - Code string for component array
|
|
318
341
|
*/
|
|
319
342
|
renderConstructor(options, optionsInterface, baseOptionsType, destructure, componentArray) {
|
|
320
|
-
const configPath = this.getConfigPath(options.
|
|
343
|
+
const configPath = this.getConfigPath(options.projectType);
|
|
321
344
|
this.buffer.line("/**");
|
|
322
345
|
this.buffer.line(" * @param options - Project configuration");
|
|
323
346
|
this.buffer.line(" */");
|
|
@@ -358,27 +381,9 @@ class TypeScriptClassRenderer {
|
|
|
358
381
|
* Projen component that generates TypeScript project classes with standard configuration
|
|
359
382
|
*
|
|
360
383
|
* This component automates the creation of project classes that extend Projen base classes
|
|
361
|
-
* with opinionated defaults and component integration.
|
|
362
|
-
* 1. An options interface (via ProjenStruct) that extends the base Projen options
|
|
363
|
-
* 2. A project class that applies default configuration and instantiates components
|
|
364
|
-
*
|
|
365
|
-
* The generated code follows a consistent pattern:
|
|
366
|
-
* - Imports required modules and components
|
|
367
|
-
* - Re-exports the generated options interface
|
|
368
|
-
* - Defines a class extending the Projen base class
|
|
369
|
-
* - Constructor merges defaults with user options and applies components
|
|
370
|
-
*
|
|
371
|
-
* @example
|
|
372
|
-
* ```typescript
|
|
373
|
-
* new ProjectGenerator(project, {
|
|
374
|
-
* name: "TypeScriptProject",
|
|
375
|
-
* baseClass: "typescript.TypeScriptProject",
|
|
376
|
-
* filePath: "src/projects/typescript.generated.ts",
|
|
377
|
-
* components: [{ component: Vitest, optionsProperty: "vitestOptions" }]
|
|
378
|
-
* });
|
|
379
|
-
* ```
|
|
384
|
+
* with opinionated defaults and component integration.
|
|
380
385
|
*/
|
|
381
|
-
class ProjectGenerator extends
|
|
386
|
+
class ProjectGenerator extends projen.Component {
|
|
382
387
|
/**
|
|
383
388
|
* @param project - Projen project instance
|
|
384
389
|
* @param options - Generator configuration
|
|
@@ -387,9 +392,14 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
387
392
|
super(project);
|
|
388
393
|
this.options = options;
|
|
389
394
|
this.renderer = new TypeScriptClassRenderer();
|
|
395
|
+
/* Generate ProjectType enum once on first instantiation */
|
|
396
|
+
if (!ProjectGenerator.enumGenerated) {
|
|
397
|
+
this.generateProjectTypeEnum();
|
|
398
|
+
ProjectGenerator.enumGenerated = true;
|
|
399
|
+
}
|
|
390
400
|
/* Generate the options interface using ProjenStruct for JSII compatibility */
|
|
391
401
|
const optionsInterface = `${options.name}Options`;
|
|
392
|
-
const baseOptionsFqn = this.renderer.getBaseOptionsFqn(options.
|
|
402
|
+
const baseOptionsFqn = this.renderer.getBaseOptionsFqn(options.projectType);
|
|
393
403
|
const optionsFilePath = this.getOptionsFilePath(optionsInterface);
|
|
394
404
|
/* ProjenStruct generates a concrete TypeScript interface from Projen's options
|
|
395
405
|
* This is necessary because JSII doesn't support TypeScript utility types like Omit<>
|
|
@@ -406,35 +416,48 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
406
416
|
struct.omit(...options.omitOptions);
|
|
407
417
|
}
|
|
408
418
|
/* Add component-derived options to the interface */
|
|
409
|
-
const components = options.components ??
|
|
419
|
+
const components = options.components ?? getDefaultComponents();
|
|
410
420
|
const { PrimitiveType } = require("@jsii/spec");
|
|
411
421
|
for (const c of components) {
|
|
412
|
-
const name = c.
|
|
422
|
+
const name = c.componentClass.name.charAt(0).toLowerCase() + c.componentClass.name.slice(1);
|
|
413
423
|
/* Add enabled flag for the component */
|
|
414
424
|
struct.add({
|
|
415
425
|
name,
|
|
416
426
|
type: { primitive: PrimitiveType.Boolean },
|
|
417
427
|
optional: true,
|
|
418
428
|
docs: {
|
|
419
|
-
summary: `Enable ${c.
|
|
429
|
+
summary: `Enable ${c.componentClass.name} component`,
|
|
420
430
|
default: "true",
|
|
421
431
|
},
|
|
422
432
|
});
|
|
423
433
|
/* Add options property if component is configurable */
|
|
424
|
-
if (c.optionsProperty) {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
+
if (c.optionsProperty !== false) {
|
|
435
|
+
try {
|
|
436
|
+
const optionsType = this.resolveComponentOptionsType(c);
|
|
437
|
+
if (optionsType && this.isFqnAvailable(optionsType.fqn)) {
|
|
438
|
+
struct.add({
|
|
439
|
+
name: optionsType.name,
|
|
440
|
+
type: { fqn: optionsType.fqn },
|
|
441
|
+
optional: true,
|
|
442
|
+
docs: {
|
|
443
|
+
summary: optionsType.docs ?? `${c.componentClass.name} configuration`,
|
|
444
|
+
default: `- default ${c.componentClass.name} configuration`,
|
|
445
|
+
},
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
/* Component has no options parameter or resolution failed - skip */
|
|
451
|
+
console.warn(JSON.stringify({
|
|
452
|
+
message: "Failed to resolve component options type",
|
|
453
|
+
component: c.componentClass.name,
|
|
454
|
+
error: error instanceof Error ? error.message : String(error),
|
|
455
|
+
}));
|
|
456
|
+
}
|
|
434
457
|
}
|
|
435
458
|
}
|
|
436
459
|
/* Add custom options to the interface */
|
|
437
|
-
if (options.additionalOptions) {
|
|
460
|
+
if (options.additionalOptions && options.additionalOptions.length > 0) {
|
|
438
461
|
struct.add(...options.additionalOptions);
|
|
439
462
|
}
|
|
440
463
|
}
|
|
@@ -484,15 +507,277 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
484
507
|
readonly: this.options.readonly ?? true,
|
|
485
508
|
});
|
|
486
509
|
}
|
|
510
|
+
/**
|
|
511
|
+
* Checks if an FQN is available in any JSII manifest
|
|
512
|
+
*/
|
|
513
|
+
isFqnAvailable(fqn) {
|
|
514
|
+
try {
|
|
515
|
+
const manifest = this.loadManifestForFqn(fqn);
|
|
516
|
+
return manifest.types?.[fqn] !== undefined;
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Resolves component options type from JSII manifest
|
|
524
|
+
*
|
|
525
|
+
* Auto-detects options from JSII manifest when optionsProperty is undefined.
|
|
526
|
+
* Returns null only when optionsProperty is explicitly set to false.
|
|
527
|
+
*/
|
|
528
|
+
resolveComponentOptionsType(component) {
|
|
529
|
+
/* Normalize optionsProperty to ComponentOptions */
|
|
530
|
+
let optionsConfig;
|
|
531
|
+
if (typeof component.optionsProperty === "string") {
|
|
532
|
+
optionsConfig = { name: component.optionsProperty };
|
|
533
|
+
}
|
|
534
|
+
else if (component.optionsProperty && typeof component.optionsProperty === "object") {
|
|
535
|
+
optionsConfig = component.optionsProperty;
|
|
536
|
+
}
|
|
537
|
+
/* Use explicit type if provided */
|
|
538
|
+
if (optionsConfig?.type) {
|
|
539
|
+
return {
|
|
540
|
+
name: optionsConfig.name,
|
|
541
|
+
fqn: optionsConfig.type,
|
|
542
|
+
docs: optionsConfig.docs,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
/* Find component in JSII manifests */
|
|
546
|
+
const componentFqn = component.fqn ?? this.findComponentFqn(component.componentClass.name);
|
|
547
|
+
const manifest = this.loadManifestForFqn(componentFqn);
|
|
548
|
+
const classType = manifest.types?.[componentFqn];
|
|
549
|
+
if (!classType || classType.kind !== "class") {
|
|
550
|
+
throw new errors_1.ComponentResolutionError(componentFqn, "Component not found in JSII manifest");
|
|
551
|
+
}
|
|
552
|
+
const initializer = classType
|
|
553
|
+
.initializer;
|
|
554
|
+
if (!initializer?.parameters?.[1]) {
|
|
555
|
+
return null; /* Component has no options parameter */
|
|
556
|
+
}
|
|
557
|
+
const optionsParam = initializer.parameters[1];
|
|
558
|
+
const optionsFqn = optionsParam.type?.fqn;
|
|
559
|
+
if (!optionsFqn) {
|
|
560
|
+
return null; /* Options parameter has no FQN */
|
|
561
|
+
}
|
|
562
|
+
const optionsType = manifest.types?.[optionsFqn];
|
|
563
|
+
const docs = optionsType?.docs?.summary;
|
|
564
|
+
/* Auto-generate property name if not provided */
|
|
565
|
+
const name = component.componentClass.name;
|
|
566
|
+
const defaultName = `${name.charAt(0).toLowerCase()}${name.slice(1)}Options`;
|
|
567
|
+
const propertyName = optionsConfig?.name ?? defaultName;
|
|
568
|
+
return { name: propertyName, fqn: optionsFqn, docs };
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Finds component FQN by searching all JSII manifests
|
|
572
|
+
*/
|
|
573
|
+
findComponentFqn(componentName) {
|
|
574
|
+
/* Try own package first */
|
|
575
|
+
const ownFqn = `@nikovirtala/projen-constructs.${componentName}`;
|
|
576
|
+
try {
|
|
577
|
+
const ownManifest = this.loadOwnManifest();
|
|
578
|
+
if (ownManifest.types?.[ownFqn]) {
|
|
579
|
+
return ownFqn;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
/* Own manifest not available yet during development - this is expected */
|
|
584
|
+
console.warn(JSON.stringify({
|
|
585
|
+
message: "Own manifest not available",
|
|
586
|
+
component: componentName,
|
|
587
|
+
error: error instanceof Error ? error.message : String(error),
|
|
588
|
+
}));
|
|
589
|
+
}
|
|
590
|
+
/* Search in node_modules for JSII packages */
|
|
591
|
+
const nodeModulesPath = (0, node_path_1.join)(__dirname, "../../node_modules");
|
|
592
|
+
const packages = this.findJsiiPackages(nodeModulesPath);
|
|
593
|
+
for (const pkg of packages) {
|
|
594
|
+
try {
|
|
595
|
+
const manifest = this.loadManifestFromPackage(pkg);
|
|
596
|
+
for (const fqn of Object.keys(manifest.types ?? {})) {
|
|
597
|
+
if (fqn.endsWith(`.${componentName}`)) {
|
|
598
|
+
return fqn;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
/* Skip packages with invalid manifests - log for debugging */
|
|
604
|
+
console.warn(JSON.stringify({
|
|
605
|
+
message: "Failed to load manifest from package",
|
|
606
|
+
package: pkg,
|
|
607
|
+
error: error instanceof Error ? error.message : String(error),
|
|
608
|
+
}));
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
throw new errors_1.ComponentResolutionError(componentName, "Component not found in any JSII manifest");
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Finds all JSII packages in node_modules
|
|
615
|
+
*/
|
|
616
|
+
findJsiiPackages(nodeModulesPath) {
|
|
617
|
+
const packages = [];
|
|
618
|
+
const { readdirSync, statSync, existsSync } = require("node:fs");
|
|
619
|
+
if (!existsSync(nodeModulesPath)) {
|
|
620
|
+
return packages;
|
|
621
|
+
}
|
|
622
|
+
const resolvedBase = (0, node_path_1.resolve)(nodeModulesPath);
|
|
623
|
+
for (const entry of readdirSync(nodeModulesPath)) {
|
|
624
|
+
const entryPath = (0, node_path_1.resolve)(nodeModulesPath, entry);
|
|
625
|
+
/* Prevent path traversal attacks */
|
|
626
|
+
if (!entryPath.startsWith(resolvedBase)) {
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
if (entry.startsWith("@")) {
|
|
630
|
+
/* Scoped package - recurse into scope */
|
|
631
|
+
const scopePath = entryPath;
|
|
632
|
+
for (const scopedEntry of readdirSync(scopePath)) {
|
|
633
|
+
const pkgPath = (0, node_path_1.resolve)(scopePath, scopedEntry);
|
|
634
|
+
/* Prevent path traversal attacks */
|
|
635
|
+
if (!pkgPath.startsWith(resolvedBase)) {
|
|
636
|
+
continue;
|
|
637
|
+
}
|
|
638
|
+
if (existsSync((0, node_path_1.join)(pkgPath, ".jsii"))) {
|
|
639
|
+
packages.push(pkgPath);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
else if (statSync(entryPath).isDirectory()) {
|
|
644
|
+
/* Regular package */
|
|
645
|
+
if (existsSync((0, node_path_1.join)(entryPath, ".jsii"))) {
|
|
646
|
+
packages.push(entryPath);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return packages;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Loads JSII manifest for a given FQN
|
|
654
|
+
*
|
|
655
|
+
* Extracts package name from FQN. For scoped packages like @scope/package.ClassName,
|
|
656
|
+
* the package name is everything before the first dot (i.e., @scope/package).
|
|
657
|
+
*/
|
|
658
|
+
loadManifestForFqn(fqn) {
|
|
659
|
+
const dotIndex = fqn.indexOf(".");
|
|
660
|
+
const packageName = dotIndex > 0 ? fqn.substring(0, dotIndex) : fqn;
|
|
661
|
+
/* Try own package */
|
|
662
|
+
if (packageName === "@nikovirtala/projen-constructs") {
|
|
663
|
+
return this.loadOwnManifest();
|
|
664
|
+
}
|
|
665
|
+
/* Try node_modules */
|
|
666
|
+
try {
|
|
667
|
+
const pkgJsonPath = require.resolve(`${packageName}/package.json`);
|
|
668
|
+
return this.loadManifestFromPackage((0, node_path_1.dirname)(pkgJsonPath));
|
|
669
|
+
}
|
|
670
|
+
catch (error) {
|
|
671
|
+
throw new errors_1.ManifestLoadError(packageName, error instanceof Error ? error.message : String(error));
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Loads JSII manifest from a package directory
|
|
676
|
+
*/
|
|
677
|
+
loadManifestFromPackage(packagePath) {
|
|
678
|
+
const jsiiPath = (0, node_path_1.join)(packagePath, ".jsii");
|
|
679
|
+
return JSON.parse((0, node_fs_1.readFileSync)(jsiiPath, "utf-8"));
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Loads this package's JSII manifest
|
|
683
|
+
*/
|
|
684
|
+
loadOwnManifest() {
|
|
685
|
+
const jsiiPath = (0, node_path_1.join)(__dirname, "../.jsii");
|
|
686
|
+
return JSON.parse((0, node_fs_1.readFileSync)(jsiiPath, "utf-8"));
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Generates ProjectType enum from Projen's JSII manifest
|
|
690
|
+
*/
|
|
691
|
+
generateProjectTypeEnum() {
|
|
692
|
+
const projectTypes = this.discoverProjectTypes();
|
|
693
|
+
const lines = [];
|
|
694
|
+
lines.push("/**");
|
|
695
|
+
lines.push(" * Enum defining all supported project types");
|
|
696
|
+
lines.push(" *");
|
|
697
|
+
lines.push(" * Each project type corresponds to a generated project class and its configuration");
|
|
698
|
+
lines.push(" * in the defaultOptions structure.");
|
|
699
|
+
lines.push(" *");
|
|
700
|
+
lines.push(" * @generated Automatically generated from Projen's JSII manifest");
|
|
701
|
+
lines.push(" */");
|
|
702
|
+
lines.push("export enum ProjectType {");
|
|
703
|
+
for (const [enumName, value, docs] of projectTypes) {
|
|
704
|
+
lines.push(" /**");
|
|
705
|
+
lines.push(` * ${docs}`);
|
|
706
|
+
lines.push(" */");
|
|
707
|
+
lines.push(` ${enumName} = "${value}",`);
|
|
708
|
+
lines.push("");
|
|
709
|
+
}
|
|
710
|
+
lines.push("}");
|
|
711
|
+
new projen.TextFile(this.project, "src/project-type.ts", {
|
|
712
|
+
readonly: true,
|
|
713
|
+
lines,
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Discovers all project types that extend projen.Project
|
|
718
|
+
*/
|
|
719
|
+
discoverProjectTypes() {
|
|
720
|
+
const projectTypes = [];
|
|
721
|
+
const baseClass = "projen.Project";
|
|
722
|
+
for (const [fqn, type] of Object.entries(this.renderer.jsiiManifest.types ?? {})) {
|
|
723
|
+
if (type.kind !== "class") {
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
const classType = type;
|
|
727
|
+
if (classType.abstract) {
|
|
728
|
+
continue;
|
|
729
|
+
}
|
|
730
|
+
if (!this.extendsBase(classType, baseClass)) {
|
|
731
|
+
continue;
|
|
732
|
+
}
|
|
733
|
+
const parts = fqn.split(".");
|
|
734
|
+
if (parts.length < 3 || parts[0] !== "projen") {
|
|
735
|
+
continue;
|
|
736
|
+
}
|
|
737
|
+
const module = parts[1];
|
|
738
|
+
const className = parts.slice(2).join(".");
|
|
739
|
+
const enumName = className
|
|
740
|
+
.replace(/([A-Z])/g, "_$1")
|
|
741
|
+
.toUpperCase()
|
|
742
|
+
.replace(/^_/, "");
|
|
743
|
+
const value = `${module}.${className}`;
|
|
744
|
+
const docs = classType.docs?.summary ?? className;
|
|
745
|
+
projectTypes.push([enumName, value, docs]);
|
|
746
|
+
}
|
|
747
|
+
return projectTypes.sort((a, b) => a[0].localeCompare(b[0]));
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Checks if a class extends the base class
|
|
751
|
+
*/
|
|
752
|
+
extendsBase(classType, baseClass) {
|
|
753
|
+
if (classType.inheritancePath) {
|
|
754
|
+
return classType.inheritancePath.includes(baseClass);
|
|
755
|
+
}
|
|
756
|
+
let currentBase = classType.base;
|
|
757
|
+
while (currentBase) {
|
|
758
|
+
if (currentBase === baseClass) {
|
|
759
|
+
return true;
|
|
760
|
+
}
|
|
761
|
+
const baseType = this.renderer.jsiiManifest.types?.[currentBase];
|
|
762
|
+
if (!baseType || baseType.kind !== "class") {
|
|
763
|
+
break;
|
|
764
|
+
}
|
|
765
|
+
currentBase = baseType.base;
|
|
766
|
+
}
|
|
767
|
+
return false;
|
|
768
|
+
}
|
|
487
769
|
}
|
|
488
770
|
exports.ProjectGenerator = ProjectGenerator;
|
|
771
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
772
|
+
ProjectGenerator[_a] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.2.0" };
|
|
773
|
+
ProjectGenerator.enumGenerated = false;
|
|
489
774
|
/**
|
|
490
775
|
* Text file for generated TypeScript class code
|
|
491
776
|
*
|
|
492
777
|
* Extends Projen's TextFile to add the generated file marker comment
|
|
493
778
|
* at the beginning of the file.
|
|
494
779
|
*/
|
|
495
|
-
class TypeScriptClassFile extends
|
|
780
|
+
class TypeScriptClassFile extends projen.TextFile {
|
|
496
781
|
/**
|
|
497
782
|
* @param project - Projen project instance
|
|
498
783
|
* @param filePath - Output file path
|
|
@@ -506,4 +791,4 @@ class TypeScriptClassFile extends projen_1.TextFile {
|
|
|
506
791
|
this.addLine(content);
|
|
507
792
|
}
|
|
508
793
|
}
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esc0VBQW9FO0FBRXBFLG1DQUE2QztBQUM3QyxxQ0FBc0c7QUFLdEc7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFzQjtJQUMxQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFDaEQ7UUFDSSxTQUFTLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTTtRQUNoRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsZUFBZTtZQUNyQixJQUFJLEVBQUUsOENBQThDO1lBQ3BELElBQUksRUFBRSxzQkFBc0I7U0FDL0I7S0FDSjtDQUNKLENBQUM7QUFvSEY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFJWjs7T0FFRztJQUNILFlBQTZCLFNBQVMsR0FBRztRQUFaLFdBQU0sR0FBTixNQUFNLENBQU07UUFOakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUtvQixDQUFDO0lBRTdDOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMs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UUFDMUQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sR0FBRyxHQUFHLElBQUksZUFBZSxlQUFlLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYTtRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFO1lBQ2xFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQzFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTNIRCw0Q0EySEM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsaUJBQVE7SUFDdEM7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAanNpaS9zcGVjXCI7XG5pbXBvcnQgeyBQcm9qZW5TdHJ1Y3QsIFN0cnVjdCB9IGZyb20gXCJAbXJncmFpbi9qc2lpLXN0cnVjdC1idWlsZGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QsIFNvdXJjZUNvZGVPcHRpb25zLCB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBUZXh0RmlsZSB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvciwgSW52YWxpZEZpbGVQYXRoRXJyb3IsIEludmFsaWRJbmRlbnRMZXZlbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbnR5cGUgUHJvamVuTW9kdWxlID0gXCJ0eXBlc2NyaXB0XCIgfCBcImNka1wiIHwgXCJhd3NjZGtcIjtcbnR5cGUgUHJvamVuQmFzZUNsYXNzPE0gZXh0ZW5kcyBQcm9qZW5Nb2R1bGU+ID0gYCR7TX0uJHtzdHJpbmd9YDtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09NUE9ORU5UUzogQ29tcG9uZW50Q29uZmlnW10gPSBbXG4gICAgeyBjb21wb25lbnQ6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvbWlzZVwiKS5NaXNlIH0sXG4gICAge1xuICAgICAgICBjb21wb25lbnQ6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvdml0ZXN0XCIpLlZpdGVzdCxcbiAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgIHR5cGU6IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLlZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgfSxcbiAgICB9LFxuXTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHtcbiAqICAgY29tcG9uZW50OiBWaXRlc3QsXG4gKiAgIG9wdGlvbnNQcm9wZXJ0eTogXCJ2aXRlc3RPcHRpb25zXCJcbiAqIH07XG4gKiBgYGBcbiAqL1xuaW50ZXJmYWNlIENvbXBvbmVudENvbmZpZzxUIGV4dGVuZHMgQ29tcG9uZW50ID0gQ29tcG9uZW50PiB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50OiBuZXcgKFxuICAgICAgICBwcm9qZWN0OiBuZXZlcixcbiAgICAgICAgb3B0aW9ucz86IG5ldmVyLFxuICAgICkgPT4gVDtcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogV2hlbiBzcGVjaWZpZWQsIGFkZHMgYW4gb3B0aW9ucyBwcm9wZXJ0eSB0byB0aGUgaW50ZXJmYWNlIGFsbG93aW5nXG4gICAgICogdXNlcnMgdG8gY29uZmlndXJlIHRoZSBjb21wb25lbnQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3B0aW9uc1Byb3BlcnR5Pzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eSAoZS5nLiwgXCJ2aXRlc3RPcHRpb25zXCIpXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChlLmcuLCBcIkBuaWtvdmlydGFsYS9wcm9qZW4tY29uc3RydWN0cy5WaXRlc3RPcHRpb25zXCIpXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEb2N1bWVudGF0aW9uIHN1bW1hcnlcbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGRvY3M/OiBzdHJpbmc7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgUHJvamVjdEdlbmVyYXRvcihwcm9qZWN0LCB7XG4gKiAgIG5hbWU6IFwiVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgYmFzZUNsYXNzOiBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgZmlsZVBhdGg6IFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCIsXG4gKiAgIGNvbXBvbmVudHM6IFt7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IFwidml0ZXN0T3B0aW9uc1wiIH1dXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zPE0gZXh0ZW5kcyBQcm9qZW5Nb2R1bGUgPSBQcm9qZW5Nb2R1bGU+IGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgYmFzZSBjbGFzcyB0byBleHRlbmQgaW4gZm9ybWF0IFwibW9kdWxlLkNsYXNzTmFtZVwiXG4gICAgICpcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgUHJvamVuIGNsYXNzIHJlZmVyZW5jZSBsaWtlIFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiLFxuICAgICAqIFwiY2RrLkpzaWlQcm9qZWN0XCIsIG9yIFwiYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHBcIi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICogQGV4YW1wbGUgXCJjZGsuSnNpaVByb2plY3RcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhc2VDbGFzczogUHJvamVuQmFzZUNsYXNzPE0+O1xuXG4gICAgLyoqXG4gICAgICogT3V0cHV0IGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc1xuICAgICAqXG4gICAgICogTXVzdCBjb250YWluIGEgZGlyZWN0b3J5IHNlcGFyYXRvci4gVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcInNyYy9wcm9qZWN0cy90eXBlc2NyaXB0LmdlbmVyYXRlZC50c1wiXG4gICAgICovXG4gICAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudHMgdG8gaW50ZWdyYXRlIGludG8gdGhlIHByb2plY3RcbiAgICAgKlxuICAgICAqIEVhY2ggY29tcG9uZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkIGR1cmluZyBwcm9qZWN0IGNvbnN0cnVjdGlvbiBhbmQgY2FuIGJlXG4gICAgICogY29uZmlndXJlZCB2aWEgYW4gb3B0aW9uYWwgb3B0aW9ucyBwcm9wZXJ0eSBpbiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFt7IGNvbXBvbmVudDogTWlzZSB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IHsgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsIHR5cGU6IFwiLi4uXCIsIGRvY3M6IFwiLi4uXCIgfSB9XVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBDb21wb25lbnRDb25maWdbXTtcblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gZXh0ZW5kIHRoZSBiYXNlIG9wdGlvbnMgd2l0aCBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0b1xuICAgICAqIHlvdXIgcHJvamVjdCB0eXBlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFkZGl0aW9uYWxPcHRpb25zPzogUHJvcGVydHlbXTtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IG5hbWVzIHRvIG9taXQgZnJvbSB0aGUgYmFzZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gaGlkZSBiYXNlIGNsYXNzIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNvbmZpZ3VyYWJsZVxuICAgICAqIGluIHRoZSBnZW5lcmF0ZWQgcHJvamVjdCB0eXBlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9taXRPcHRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQnVmZmVyIGZvciBidWlsZGluZyBpbmRlbnRlZCBjb2RlIHdpdGggYXV0b21hdGljIGxpbmUgbWFuYWdlbWVudFxuICpcbiAqIE1haW50YWlucyBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIGxpbmVzLFxuICogb3BlbmluZy9jbG9zaW5nIGJsb2NrcywgYW5kIGZsdXNoaW5nIGFjY3VtdWxhdGVkIGNvbnRlbnQuXG4gKi9cbmNsYXNzIENvZGVCdWZmZXIge1xuICAgIHByaXZhdGUgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW5kZW50IC0gU3RyaW5nIHRvIHVzZSBmb3IgZWFjaCBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogc2luZ2xlIHNwYWNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5kZW50ID0gXCIgXCIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBhY2N1bXVsYXRlZCBsaW5lcyBhbmQgcmVzZXRzIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGNvZGUgbGluZXMgd2l0aCBwcm9wZXIgaW5kZW50YXRpb25cbiAgICAgKi9cbiAgICBmbHVzaCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmxpbmVzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW5lIG9mIGNvZGUgYXQgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gQ29kZSB0byBhZGQgKG9wdGlvbmFsLCBhZGRzIGJsYW5rIGxpbmUgaWYgb21pdHRlZClcbiAgICAgKi9cbiAgICBsaW5lKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5pbmRlbnQucmVwZWF0KHRoaXMuaW5kZW50TGV2ZWwpO1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2goKHByZWZpeCArIChjb2RlID8/IFwiXCIpKS50cmltRW5kKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbmV3IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGJlZm9yZSBpbmNyZWFzaW5nIGluZGVudCAoZS5nLiwgb3BlbmluZyBicmFjZSlcbiAgICAgKi9cbiAgICBvcGVuKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsKys7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGFmdGVyIGRlY3JlYXNpbmcgaW5kZW50IChlLmcuLCBjbG9zaW5nIGJyYWNlKVxuICAgICAqIEB0aHJvd3Mge0ludmFsaWRJbmRlbnRMZXZlbEVycm9yfSBXaGVuIGF0dGVtcHRpbmcgdG8gZGVjcmVhc2UgaW5kZW50IGJlbG93IHplcm9cbiAgICAgKi9cbiAgICBjbG9zZShjb2RlPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGVudExldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEluZGVudExldmVsRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsLS07XG4gICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJ1ZmZlciB0byBpbml0aWFsIHN0YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudExldmVsID0gMDtcbiAgICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBQcm9qZWN0R2VuZXJhdG9yIG9wdGlvbnNcbiAqXG4gKiBHZW5lcmF0ZXMgYSBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgaW5jbHVkaW5nIGltcG9ydHMsIG9wdGlvbnMgaW50ZXJmYWNlIGV4cG9ydCxcbiAqIGNsYXNzIGRlY2xhcmF0aW9uLCBhbmQgY29uc3RydWN0b3Igd2l0aCBjb21wb25lbnQgaW50ZWdyYXRpb24uXG4gKi9cbmNsYXNzIFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyIHtcbiAgICBwcml2YXRlIGJ1ZmZlcjogQ29kZUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBOdW1iZXIgb2Ygc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogNClcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbmRlbnQgPSA0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IENvZGVCdWZmZXIoXCIgXCIucmVwZWF0KGluZGVudCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgY29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGZyb20gb3B0aW9uc1xuICAgICAqXG4gICAgICogT3JjaGVzdHJhdGVzIHRoZSByZW5kZXJpbmcgcHJvY2VzczogZGVyaXZlcyBuYW1lcywgZXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24sXG4gICAgICogYnVpbGRzIGltcG9ydCBzdGF0ZW1lbnRzLCBhbmQgcmVuZGVycyB0aGUgY2xhc3Mgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIENvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIHJlbmRlcihvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9uczxQcm9qZW5Nb2R1bGU+KTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMuYmFzZUNsYXNzKTtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNUeXBlID0gYmFzZU9wdGlvbnNGcW4ucmVwbGFjZSgvXnByb2plblxcLi8sIFwiXCIpO1xuXG4gICAgICAgIC8qIFVzZSBwcm92aWRlZCBjb21wb25lbnRzIG9yIGZhbGwgYmFjayB0byBkZWZhdWx0cyAoTWlzZSArIFZpdGVzdCkgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBERUZBVUxUX0NPTVBPTkVOVFM7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzKTtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IHRoaXMuZXh0cmFjdEltcG9ydHMob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUmVuZGVyIGFsbCBzZWN0aW9ucyBvZiB0aGUgY2xhc3MgZmlsZSAqL1xuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuZmx1c2goKS5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBvcHRpb25zIGludGVyZmFjZSBuYW1lIGZyb20gYmFzZSBjbGFzc1xuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBiYXNlIGNsYXNzIHJlZmVyZW5jZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIFByb2plbiBvcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogYnkgYXBwZW5kaW5nIFwiT3B0aW9uc1wiIHN1ZmZpeCBhbmQgcHJlZml4aW5nIHdpdGggXCJwcm9qZW4uXCIgbmFtZXNwYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2VDbGFzcyAtIEJhc2UgY2xhc3MgaW4gZm9ybWF0IFwibW9kdWxlLkNsYXNzTmFtZVwiXG4gICAgICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3J9IFdoZW4gYmFzZUNsYXNzIGZvcm1hdCBpcyBpbnZhbGlkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiKSAvLyBcInByb2plbi50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiXG4gICAgICogZ2V0QmFzZU9wdGlvbnNGcW4oXCJjZGsuSnNpaVByb2plY3RcIikgLy8gXCJwcm9qZW4uY2RrLkpzaWlQcm9qZWN0T3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0QmFzZU9wdGlvbnNGcW4oYmFzZUNsYXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvKiBWYWxpZGF0ZSBiYXNlIGNsYXNzIGZvcm1hdDogbXVzdCBjb250YWluIG1vZHVsZS5DbGFzc05hbWUgc3RydWN0dXJlICovXG4gICAgICAgIGlmICghYmFzZUNsYXNzLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihiYXNlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGBwcm9qZW4uJHtiYXNlQ2xhc3N9T3B0aW9uc2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGNvZGUgZ2VuZXJhdGlvblxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgaW50bzpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZSBsaXN0OiB2YXJpYWJsZSBuYW1lcyB0byBleHRyYWN0IGZyb20gb3B0aW9uc1xuICAgICAqIDIuIENvbXBvbmVudCBhcnJheTogY29kZSBzdHJpbmcgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50cyAtIENvbXBvbmVudCBjb25maWd1cmF0aW9uc1xuICAgICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRlc3RydWN0dXJlIGFycmF5IGFuZCBjb21wb25lbnRBcnJheSBjb2RlIHN0cmluZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJbnB1dDogW3sgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgLi4uIH0gfV1cbiAgICAgKiBPdXRwdXQ6IHtcbiAgICAgKiAgIGRlc3RydWN0dXJlOiBbXCJ2aXRlc3RcIiwgXCJ2aXRlc3RPcHRpb25zXCJdLFxuICAgICAqICAgY29tcG9uZW50QXJyYXk6IFwiW3sgY29tcG9uZW50OiBWaXRlc3QsIGVuYWJsZWQ6IHZpdGVzdCwgb3B0aW9uczogdml0ZXN0T3B0aW9ucyB9XVwiXG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoY29tcG9uZW50czogQ29tcG9uZW50Q29uZmlnW10pOiB7IGRlc3RydWN0dXJlOiBzdHJpbmdbXTsgY29tcG9uZW50QXJyYXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAvKiBDb252ZXJ0IGNvbXBvbmVudCBjbGFzcyBuYW1lIHRvIGNhbWVsQ2FzZSB2YXJpYWJsZSBuYW1lIChlLmcuLCBWaXRlc3QgLT4gdml0ZXN0KSAqL1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Lm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjLmNvbXBvbmVudC5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Lm5hbWV9YF07XG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIGNvbmZpZ3VyYWJsZSBvcHRpb25zIC0gaW5jbHVkZSBib3RoIGVuYWJsZWQgZmxhZyBhbmQgb3B0aW9ucyAqL1xuICAgICAgICAgICAgICAgIGRlc3RydWN0dXJlLnB1c2goYy5vcHRpb25zUHJvcGVydHkubmFtZSk7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgZW5hYmxlZDogJHtuYW1lfWAsIGBvcHRpb25zOiAke2Mub3B0aW9uc1Byb3BlcnR5Lm5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyAtIG9ubHkgaW5jbHVkZSBlbmFibGVkIGZsYWcgKi9cbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRQYXJ0cy5wdXNoKGB7ICR7cGFydHMuam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXk6IGBbJHtjb21wb25lbnRQYXJ0cy5qb2luKFwiLCBcIil9XWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgaW1wb3J0IHN0YXRlbWVudHMgbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBDb2xsZWN0cyBhbGwgcmVxdWlyZWQgaW1wb3J0czpcbiAgICAgKiAtIFByb2plbiBiYXNlIG1vZHVsZSAodHlwZXNjcmlwdCwgY2RrLCBhd3NjZGspXG4gICAgICogLSBDb25maWcgdXRpbGl0aWVzIChhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucylcbiAgICAgKiAtIENvbXBvbmVudCBjbGFzc2VzXG4gICAgICogLSBVdGlsaXR5IGZ1bmN0aW9ucyAoZGVlcE1lcmdlKVxuICAgICAqIC0gR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlICh0eXBlLW9ubHkgaW1wb3J0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgTWFwIG9mIG1vZHVsZSBwYXRocyB0byBzZXRzIG9mIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhcbiAgICAgICAgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnM8UHJvamVuTW9kdWxlPixcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICk6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBiYXNlIG1vZHVsZSBuYW1lIGZyb20gYmFzZUNsYXNzIChlLmcuLCBcInR5cGVzY3JpcHRcIiBmcm9tIFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiKSAqL1xuICAgICAgICBjb25zdCBiYXNlTW9kdWxlID0gb3B0aW9ucy5iYXNlQ2xhc3Muc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW4gYmFzZSBtb2R1bGUgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwicHJvamVuXCIsIG5ldyBTZXQoW2Jhc2VNb2R1bGVdKSk7XG5cbiAgICAgICAgLyogQ29uZmlndXJhdGlvbiB1dGlsaXRpZXMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vY29uZmlnXCIsIG5ldyBTZXQoW1wiYXBwbHlEZWZhdWx0c1wiLCBcImRlZmF1bHRPcHRpb25zXCJdKSk7XG5cbiAgICAgICAgLyogQ29tcG9uZW50IGNsYXNzIGltcG9ydHMgLSBkZXJpdmUgbW9kdWxlIHBhdGggZnJvbSBjb21wb25lbnQgY2xhc3MgbmFtZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IERFRkFVTFRfQ09NUE9ORU5UUztcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjLmNvbXBvbmVudC5uYW1lO1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IGAuLi9jb21wb25lbnRzLyR7Y29tcG9uZW50TmFtZS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgICAgICAgICBpZiAoIWltcG9ydHMuaGFzKG1vZHVsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5zZXQobW9kdWxlUGF0aCwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUltcG9ydHMgPSBpbXBvcnRzLmdldChtb2R1bGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVJbXBvcnRzKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlSW1wb3J0cy5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVdGlsaXR5IGZ1bmN0aW9ucyBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCIuLi91dGlsc1wiLCBuZXcgU2V0KFtcImRlZXBNZXJnZVwiXSkpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZSBpbXBvcnQgKHR5cGUtb25seSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMpICovXG4gICAgICAgIGltcG9ydHMuc2V0KGAuLyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWRgLCBuZXcgU2V0KFtvcHRpb25zSW50ZXJmYWNlXSkpO1xuXG4gICAgICAgIHJldHVybiBpbXBvcnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGNvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGJhc2UgY2xhc3MgcmVmZXJlbmNlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgcGF0aCBpbiB0aGUgZGVmYXVsdE9wdGlvbnNcbiAgICAgKiBjb25maWd1cmF0aW9uIG9iamVjdCBleHBvcnRlZCBmcm9tIGNvbmZpZy50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBCYXNlIGNsYXNzIGluIGZvcm1hdCBcIm1vZHVsZS5DbGFzc05hbWVcIlxuICAgICAqIEByZXR1cm5zIENvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldENvbmZpZ1BhdGgoXCJ0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XCIpIC8vIFwiZGVmYXVsdE9wdGlvbnMudHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb25maWdQYXRoKGJhc2VDbGFzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBkZWZhdWx0T3B0aW9ucy4ke2Jhc2VDbGFzc31gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgaW1wb3J0IHN0YXRlbWVudHMgaW4gc29ydGVkIG9yZGVyXG4gICAgICpcbiAgICAgKiBTb3J0cyBpbXBvcnRzIHdpdGggZXh0ZXJuYWwgcGFja2FnZXMgZmlyc3QsIHRoZW4gcmVsYXRpdmUgaW1wb3J0cy5cbiAgICAgKiBVc2VzIHR5cGUtb25seSBpbXBvcnRzIGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGltcG9ydHMgLSBNYXAgb2YgbW9kdWxlIHBhdGhzIHRvIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJJbXBvcnRzKGltcG9ydHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pikge1xuICAgICAgICAvKiBTb3J0IG1vZHVsZXM6IGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMgYWxwaGFiZXRpY2FsbHkgKi9cbiAgICAgICAgY29uc3Qgc29ydGVkTW9kdWxlcyA9IEFycmF5LmZyb20oaW1wb3J0cy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFJc1JlbGF0aXZlID0gYS5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGJJc1JlbGF0aXZlID0gYi5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGlmIChhSXNSZWxhdGl2ZSAhPT0gYklzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYUlzUmVsYXRpdmUgPyAxIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vZCBvZiBzb3J0ZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IEFycmF5LmZyb20oaW1wb3J0cy5nZXQobW9kKSB8fCBbXSkuc29ydCgpO1xuICAgICAgICAgICAgLyogVXNlIHR5cGUtb25seSBpbXBvcnQgZm9yIGdlbmVyYXRlZCBmaWxlcyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY2llcyAqL1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlT25seSA9IG1vZC5pbmNsdWRlcyhcIi5nZW5lcmF0ZWRcIik7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRTdG10ID0gaXNUeXBlT25seSA/IFwiaW1wb3J0IHR5cGVcIiA6IFwiaW1wb3J0XCI7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAke2ltcG9ydFN0bXR9IHsgJHtuYW1lcy5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7bW9kfVwiO2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyByZS1leHBvcnQgc3RhdGVtZW50IGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBleHBvcnQgeyAke29wdGlvbnNJbnRlcmZhY2V9IH0gZnJvbSBcIi4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZFwiO2ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gYmFzZU9wdGlvbnNUeXBlIC0gQmFzZSBvcHRpb25zIHR5cGUgd2l0aG91dCBcInByb2plbi5cIiBwcmVmaXhcbiAgICAgKiBAcGFyYW0gZGVzdHJ1Y3R1cmUgLSBWYXJpYWJsZSBuYW1lcyB0byBkZXN0cnVjdHVyZSBmcm9tIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50QXJyYXkgLSBDb2RlIHN0cmluZyBmb3IgY29tcG9uZW50IGFycmF5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJDbGFzcyhcbiAgICAgICAgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnM8UHJvamVuTW9kdWxlPixcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYCAqICR7b3B0aW9ucy5uYW1lfSB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbmApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICpcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBFeHRlbmRzIFByb2plbidzIGJhc2UgY2xhc3Mgd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgYXV0b21hdGljIGNvbXBvbmVudCBzZXR1cC5cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGV4cG9ydCBjbGFzcyAke29wdGlvbnMubmFtZX0gZXh0ZW5kcyAke29wdGlvbnMuYmFzZUNsYXNzfSB7YCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ29uc3RydWN0b3Iob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvcjpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZXMgY29tcG9uZW50IGZsYWdzIGFuZCBvcHRpb25zIGZyb20gdGhlIG9wdGlvbnMgcGFyYW1ldGVyXG4gICAgICogMi4gTWVyZ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXItcHJvdmlkZWQgb3B0aW9uc1xuICAgICAqIDMuIENhbGxzIHN1cGVyKCkgd2l0aCBtZXJnZWQgb3B0aW9uc1xuICAgICAqIDQuIEFwcGxpZXMgY29tcG9uZW50IGRlZmF1bHRzIHZpYSBhcHBseURlZmF1bHRzKClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGJhc2VPcHRpb25zVHlwZSAtIEJhc2Ugb3B0aW9ucyB0eXBlIHdpdGhvdXQgXCJwcm9qZW4uXCIgcHJlZml4XG4gICAgICogQHBhcmFtIGRlc3RydWN0dXJlIC0gVmFyaWFibGUgbmFtZXMgdG8gZGVzdHJ1Y3R1cmUgZnJvbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGNvbXBvbmVudEFycmF5IC0gQ29kZSBzdHJpbmcgZm9yIGNvbXBvbmVudCBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyQ29uc3RydWN0b3IoXG4gICAgICAgIG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zPFByb2plbk1vZHVsZT4sXG4gICAgICAgIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyxcbiAgICAgICAgYmFzZU9wdGlvbnNUeXBlOiBzdHJpbmcsXG4gICAgICAgIGRlc3RydWN0dXJlOiBzdHJpbmdbXSxcbiAgICAgICAgY29tcG9uZW50QXJyYXk6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZ2V0Q29uZmlnUGF0aChvcHRpb25zLmJhc2VDbGFzcyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBAcGFyYW0gb3B0aW9ucyAtIFByb2plY3QgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgY29uc3RydWN0b3Iob3B0aW9uczogJHtvcHRpb25zSW50ZXJmYWNlfSkge2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogU2VwYXJhdGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBiYXNlIFByb2plbiBvcHRpb25zICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBjb25zdCB7ICR7ZGVzdHJ1Y3R1cmUuam9pbihcIiwgXCIpfSwgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIE1lcmdlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXIgb3B0aW9ucyBhbmQgaW5pdGlhbGl6ZSBiYXNlIGNsYXNzICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBzdXBlcihkZWVwTWVyZ2U8JHtiYXNlT3B0aW9uc1R5cGV9Pigke2NvbmZpZ1BhdGh9LCBiYXNlT3B0aW9ucykpO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBBcHBseSBjb21wb25lbnQgZGVmYXVsdHMgYW5kIGluc3RhbnRpYXRlIGVuYWJsZWQgY29tcG9uZW50cyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgYXBwbHlEZWZhdWx0cyh0aGlzLCAke2NvbXBvbmVudEFycmF5fSk7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNsb3NlKFwifVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgdG8gZmlsZSBuYW1lXG4gICAgICpcbiAgICAgKiBDb252ZXJ0cyBQYXNjYWxDYXNlIGludGVyZmFjZSBuYW1lcyB0byBrZWJhYi1jYXNlIGZpbGUgbmFtZXMuXG4gICAgICogRmFsbHMgYmFjayB0byBsb3dlcmNhc2UgY29udmVyc2lvbiBmb3IgdW5tYXBwZWQgaW50ZXJmYWNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gT3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIEByZXR1cm5zIEtlYmFiLWNhc2UgZmlsZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldE9wdGlvbnNGaWxlTmFtZShcIlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiKSAvLyBcInR5cGVzY3JpcHQtb3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM6IFwidHlwZXNjcmlwdC1vcHRpb25zXCIsXG4gICAgICAgICAgICBKc2lpUHJvamVjdE9wdGlvbnM6IFwianNpaS1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLXR5cGVzY3JpcHQtYXBwLW9wdGlvbnNcIixcbiAgICAgICAgICAgIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlQcm9qZWN0T3B0aW9uczogXCJhd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9uc1wiLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWFwcGluZ1tvcHRpb25zSW50ZXJmYWNlXSB8fCBvcHRpb25zSW50ZXJmYWNlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb2plbiBjb21wb25lbnQgdGhhdCBnZW5lcmF0ZXMgVHlwZVNjcmlwdCBwcm9qZWN0IGNsYXNzZXMgd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uXG4gKlxuICogVGhpcyBjb21wb25lbnQgYXV0b21hdGVzIHRoZSBjcmVhdGlvbiBvZiBwcm9qZWN0IGNsYXNzZXMgdGhhdCBleHRlbmQgUHJvamVuIGJhc2UgY2xhc3Nlc1xuICogd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLiBJdCBnZW5lcmF0ZXMgYm90aDpcbiAqIDEuIEFuIG9wdGlvbnMgaW50ZXJmYWNlICh2aWEgUHJvamVuU3RydWN0KSB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgUHJvamVuIG9wdGlvbnNcbiAqIDIuIEEgcHJvamVjdCBjbGFzcyB0aGF0IGFwcGxpZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFuZCBpbnN0YW50aWF0ZXMgY29tcG9uZW50c1xuICpcbiAqIFRoZSBnZW5lcmF0ZWQgY29kZSBmb2xsb3dzIGEgY29uc2lzdGVudCBwYXR0ZXJuOlxuICogLSBJbXBvcnRzIHJlcXVpcmVkIG1vZHVsZXMgYW5kIGNvbXBvbmVudHNcbiAqIC0gUmUtZXhwb3J0cyB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiAtIERlZmluZXMgYSBjbGFzcyBleHRlbmRpbmcgdGhlIFByb2plbiBiYXNlIGNsYXNzXG4gKiAtIENvbnN0cnVjdG9yIG1lcmdlcyBkZWZhdWx0cyB3aXRoIHVzZXIgb3B0aW9ucyBhbmQgYXBwbGllcyBjb21wb25lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBQcm9qZWN0R2VuZXJhdG9yKHByb2plY3QsIHtcbiAqICAgbmFtZTogXCJUeXBlU2NyaXB0UHJvamVjdFwiLFxuICogICBiYXNlQ2xhc3M6IFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiLFxuICogICBmaWxlUGF0aDogXCJzcmMvcHJvamVjdHMvdHlwZXNjcmlwdC5nZW5lcmF0ZWQudHNcIixcbiAqICAgY29tcG9uZW50czogW3sgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogXCJ2aXRlc3RPcHRpb25zXCIgfV1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZWN0R2VuZXJhdG9yIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnM8UHJvamVuTW9kdWxlPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIoKTtcblxuICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdXNpbmcgUHJvamVuU3RydWN0IGZvciBKU0lJIGNvbXBhdGliaWxpdHkgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLnJlbmRlcmVyLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMuYmFzZUNsYXNzKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVQYXRoID0gdGhpcy5nZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuU3RydWN0IGdlbmVyYXRlcyBhIGNvbmNyZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZyb20gUHJvamVuJ3Mgb3B0aW9uc1xuICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEpTSUkgZG9lc24ndCBzdXBwb3J0IFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlcyBsaWtlIE9taXQ8PlxuICAgICAgICAgKiBUaGUgZ2VuZXJhdGVkIGludGVyZmFjZSBjYW4gYmUgY29uc3VtZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIChQeXRob24sIEphdmEsIEMjLCBHbykgKi9cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gbmV3IFByb2plblN0cnVjdCh0aGlzLmFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdCksIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgICAgICBmaWxlUGF0aDogb3B0aW9uc0ZpbGVQYXRoLFxuICAgICAgICAgICAgb3V0cHV0RmlsZU9wdGlvbnM6IHsgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5taXhpbihTdHJ1Y3QuZnJvbUZxbihiYXNlT3B0aW9uc0ZxbikpXG4gICAgICAgICAgICAud2l0aG91dERlcHJlY2F0ZWQoKTtcblxuICAgICAgICAvKiBSZW1vdmUgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSB0aGUgYmFzZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN0cnVjdC5vbWl0KC4uLm9wdGlvbnMub21pdE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGNvbXBvbmVudC1kZXJpdmVkIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IERFRkFVTFRfQ09NUE9ORU5UUztcbiAgICAgICAgY29uc3QgeyBQcmltaXRpdmVUeXBlIH0gPSByZXF1aXJlKFwiQGpzaWkvc3BlY1wiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Lm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjLmNvbXBvbmVudC5uYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZW5hYmxlZCBmbGFnIGZvciB0aGUgY29tcG9uZW50ICovXG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHsgcHJpbWl0aXZlOiBQcmltaXRpdmVUeXBlLkJvb2xlYW4gfSxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBFbmFibGUgJHtjLmNvbXBvbmVudC5uYW1lfSBjb21wb25lbnRgLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcInRydWVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBvcHRpb25zIHByb3BlcnR5IGlmIGNvbXBvbmVudCBpcyBjb25maWd1cmFibGUgKi9cbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjLm9wdGlvbnNQcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB7IGZxbjogYy5vcHRpb25zUHJvcGVydHkudHlwZSB9LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYy5vcHRpb25zUHJvcGVydHkuZG9jcyA/PyBgJHtjLmNvbXBvbmVudC5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGAtIGRlZmF1bHQgJHtjLmNvbXBvbmVudC5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjdXN0b20gb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zKSB7XG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKC4uLm9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgVGV4dEZpbGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBPdXRwdXQgZmlsZSBwYXRoXG4gICAgICogQHBhcmFtIGNvbnRlbnQgLSBUeXBlU2NyaXB0IGNsYXNzIGNvZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNvdXJjZSBjb2RlIG9wdGlvbnMgKHJlYWRvbmx5LCBldGMuKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogU291cmNlQ29kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0LCBmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIC8qIEFkZCBnZW5lcmF0ZWQgZmlsZSBtYXJrZXIgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZyAqL1xuICAgICAgICB0aGlzLmFkZExpbmUoYC8vICR7dGhpcy5tYXJrZXJ9YCk7XG4gICAgICAgIHRoaXMuYWRkTGluZShjb250ZW50KTtcbiAgICB9XG59XG4iXX0=
|
|
794
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBdUM7QUFDdkMseUNBQW1EO0FBRW5ELHNFQUFvRTtBQUVwRSxpQ0FBaUM7QUFDakMscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFJWjs7T0FFRztJQUNILFlBQTZCLFNBQVMsR0FBRztRQUFaLFdBQU0sR0FBTixNQUFNLENBQU07UUFOakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUtvQixDQUFDO0lBRTdDOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMs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SyxDQUFDO0FBbWN6Qzs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgKiBhcyBwcm9qZW4gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/OiBzdHJpbmcgfCBDb21wb25lbnRPcHRpb25zIHwgZmFsc2U7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChvcHRpb25hbCwgYXV0by1kZXRlY3RlZCBmcm9tIGNvbXBvbmVudCBjb25zdHJ1Y3RvcilcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gc3VtbWFyeSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9jcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICpcbiAgICAgKiBAanNpaSBpZ25vcmVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGRpdGlvbmFsT3B0aW9ucz86IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBVc2VzIEpTSUkgbWFuaWZlc3QgaW50cm9zcGVjdGlvbiB0byB2YWxpZGF0ZSBiYXNlIGNsYXNzZXMgYW5kIG9wdGlvbnMgaW50ZXJmYWNlcy5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuICAgIHB1YmxpYyBqc2lpTWFuaWZlc3Q6IEFzc2VtYmx5O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgICAgIC8qIExvYWQgUHJvamVuJ3MgSlNJSSBtYW5pZmVzdCBmb3IgYmFzZSBjbGFzcyBpbnRyb3NwZWN0aW9uICovXG4gICAgICAgIGNvbnN0IHByb2plblBhY2thZ2VKc29uID0gcmVxdWlyZS5yZXNvbHZlKFwicHJvamVuL3BhY2thZ2UuanNvblwiKTtcbiAgICAgICAgY29uc3QgcHJvamVuUm9vdCA9IGRpcm5hbWUocHJvamVuUGFja2FnZUpzb24pO1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4ocHJvamVuUm9vdCwgXCIuanNpaVwiKTtcbiAgICAgICAgdGhpcy5qc2lpTWFuaWZlc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzKTtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IHRoaXMuZXh0cmFjdEltcG9ydHMob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUmVuZGVyIGFsbCBzZWN0aW9ucyBvZiB0aGUgY2xhc3MgZmlsZSAqL1xuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZsdXNoKCkuam9pbihcIlxcblwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgb3B0aW9ucyBpbnRlcmZhY2UgbmFtZSBmcm9tIHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBQcm9qZW4gb3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIGJ5IGFwcGVuZGluZyBcIk9wdGlvbnNcIiBzdWZmaXggYW5kIHByZWZpeGluZyB3aXRoIFwicHJvamVuLlwiIG5hbWVzcGFjZS5cbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3J9IFdoZW4gcHJvamVjdFR5cGUgZm9ybWF0IGlzIGludmFsaWQgb3IgY2xhc3Mgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwicHJvamVuLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCJcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5KU0lJKSAvLyBcInByb2plbi5jZGsuSnNpaVByb2plY3RPcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRCYXNlT3B0aW9uc0Zxbihwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBwcm9qZWN0VHlwZS52YWx1ZU9mKCk7XG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZm9ybWF0OiBtdXN0IGNvbnRhaW4gbW9kdWxlLkNsYXNzTmFtZSBzdHJ1Y3R1cmUgKi9cbiAgICAgICAgaWYgKCFiYXNlQ2xhc3MuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlQ2xhc3NGcW4gPSBgcHJvamVuLiR7YmFzZUNsYXNzfWA7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGcW4gPSBgJHtiYXNlQ2xhc3NGcW59T3B0aW9uc2A7XG5cbiAgICAgICAgLyogVmFsaWRhdGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bYmFzZUNsYXNzRnFuXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihgQmFzZSBjbGFzcyBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtiYXNlQ2xhc3NGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zIGludGVyZmFjZSBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYE9wdGlvbnMgaW50ZXJmYWNlIG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0OiAke29wdGlvbnNGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uc0ZxbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgY29kZSBnZW5lcmF0aW9uXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyBpbnRvOlxuICAgICAqIDEuIERlc3RydWN0dXJlIGxpc3Q6IHZhcmlhYmxlIG5hbWVzIHRvIGV4dHJhY3QgZnJvbSBvcHRpb25zXG4gICAgICogMi4gQ29tcG9uZW50IGFycmF5OiBjb2RlIHN0cmluZyBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggZGVzdHJ1Y3R1cmUgYXJyYXkgYW5kIGNvbXBvbmVudEFycmF5IGNvZGUgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElucHV0OiBbeyBjb21wb25lbnQ6IFZpdGVzdCwgb3B0aW9uc1Byb3BlcnR5OiB7IG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLCAuLi4gfSB9XVxuICAgICAqIE91dHB1dDoge1xuICAgICAqICAgZGVzdHJ1Y3R1cmU6IFtcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl0sXG4gICAgICogICBjb21wb25lbnRBcnJheTogXCJbeyBjb21wb25lbnQ6IFZpdGVzdCwgZW5hYmxlZDogdml0ZXN0LCBvcHRpb25zOiB2aXRlc3RPcHRpb25zIH1dXCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzOiBDb21wb25lbnRbXSk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Q2xhc3MubmFtZX1gXTtcbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBjb25maWd1cmFibGUgb3B0aW9ucyAtIGluY2x1ZGUgYm90aCBlbmFibGVkIGZsYWcgYW5kIG9wdGlvbnMgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVvZiBjLm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGMub3B0aW9uc1Byb3BlcnR5IDogYy5vcHRpb25zUHJvcGVydHkubmFtZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdHVyZS5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCwgYG9wdGlvbnM6ICR7cHJvcE5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyAtIG9ubHkgaW5jbHVkZSBlbmFibGVkIGZsYWcgKi9cbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRQYXJ0cy5wdXNoKGB7ICR7cGFydHMuam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXk6IGBbJHtjb21wb25lbnRQYXJ0cy5qb2luKFwiLCBcIil9XWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgaW1wb3J0IHN0YXRlbWVudHMgbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBDb2xsZWN0cyBhbGwgcmVxdWlyZWQgaW1wb3J0czpcbiAgICAgKiAtIFByb2plbiBiYXNlIG1vZHVsZSAodHlwZXNjcmlwdCwgY2RrLCBhd3NjZGspXG4gICAgICogLSBDb25maWcgdXRpbGl0aWVzIChhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucylcbiAgICAgKiAtIENvbXBvbmVudCBjbGFzc2VzXG4gICAgICogLSBVdGlsaXR5IGZ1bmN0aW9ucyAoZGVlcE1lcmdlKVxuICAgICAqIC0gR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlICh0eXBlLW9ubHkgaW1wb3J0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgTWFwIG9mIG1vZHVsZSBwYXRocyB0byBzZXRzIG9mIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgICAgICAvKiBFeHRyYWN0IGJhc2UgbW9kdWxlIG5hbWUgZnJvbSBwcm9qZWN0VHlwZSAoZS5nLiwgXCJ0eXBlc2NyaXB0XCIgZnJvbSBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIikgKi9cbiAgICAgICAgY29uc3QgYmFzZU1vZHVsZSA9IG9wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuIGJhc2UgbW9kdWxlIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcInByb2plblwiLCBuZXcgU2V0KFtiYXNlTW9kdWxlXSkpO1xuXG4gICAgICAgIC8qIENvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL2NvbmZpZ1wiLCBuZXcgU2V0KFtcImFwcGx5RGVmYXVsdHNcIiwgXCJkZWZhdWx0T3B0aW9uc1wiXSkpO1xuXG4gICAgICAgIC8qIENvbXBvbmVudCBjbGFzcyBpbXBvcnRzIC0gZGVyaXZlIG1vZHVsZSBwYXRoIGZyb20gY29tcG9uZW50IGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBgLi4vY29tcG9uZW50cy8ke2NvbXBvbmVudE5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLmhhcyhtb2R1bGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMuc2V0KG1vZHVsZVBhdGgsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbXBvcnRzID0gaW1wb3J0cy5nZXQobW9kdWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobW9kdWxlSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUltcG9ydHMuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogVXRpbGl0eSBmdW5jdGlvbnMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vdXRpbHNcIiwgbmV3IFNldChbXCJkZWVwTWVyZ2VcIl0pKTtcblxuICAgICAgICAvKiBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgaW1wb3J0ICh0eXBlLW9ubHkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzKSAqL1xuICAgICAgICBpbXBvcnRzLnNldChgLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkYCwgbmV3IFNldChbb3B0aW9uc0ludGVyZmFjZV0pKTtcblxuICAgICAgICByZXR1cm4gaW1wb3J0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBjb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBwYXRoIGluIHRoZSBkZWZhdWx0T3B0aW9uc1xuICAgICAqIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGV4cG9ydGVkIGZyb20gY29uZmlnLnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2plY3RUeXBlIC0gUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJucyBDb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRDb25maWdQYXRoKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwiZGVmYXVsdE9wdGlvbnMudHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb25maWdQYXRoKHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGVmYXVsdE9wdGlvbnMuJHtwcm9qZWN0VHlwZS52YWx1ZU9mKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGltcG9ydCBzdGF0ZW1lbnRzIGluIHNvcnRlZCBvcmRlclxuICAgICAqXG4gICAgICogU29ydHMgaW1wb3J0cyB3aXRoIGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMuXG4gICAgICogVXNlcyB0eXBlLW9ubHkgaW1wb3J0cyBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbXBvcnRzIC0gTWFwIG9mIG1vZHVsZSBwYXRocyB0byBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVySW1wb3J0cyhpbXBvcnRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4pIHtcbiAgICAgICAgLyogU29ydCBtb2R1bGVzOiBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzIGFscGhhYmV0aWNhbGx5ICovXG4gICAgICAgIGNvbnN0IHNvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKGltcG9ydHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhSXNSZWxhdGl2ZSA9IGEuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBiSXNSZWxhdGl2ZSA9IGIuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBpZiAoYUlzUmVsYXRpdmUgIT09IGJJc1JlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFJc1JlbGF0aXZlID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2Ygc29ydGVkTW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGltcG9ydHMuZ2V0KG1vZCkgfHwgW10pLnNvcnQoKTtcbiAgICAgICAgICAgIC8qIFVzZSB0eXBlLW9ubHkgaW1wb3J0IGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVHlwZU9ubHkgPSBtb2QuaW5jbHVkZXMoXCIuZ2VuZXJhdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3RtdCA9IGlzVHlwZU9ubHkgPyBcImltcG9ydCB0eXBlXCIgOiBcImltcG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIubGluZShgJHtpbXBvcnRTdG10fSB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke21vZH1cIjtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgcmUtZXhwb3J0IHN0YXRlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZSB0byBleHBvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckV4cG9ydChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGV4cG9ydCB7ICR7b3B0aW9uc0ludGVyZmFjZX0gfSBmcm9tIFwiLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkXCI7YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY2xhc3MgZGVjbGFyYXRpb24gYW5kIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNsYXNzKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAgKiAke29wdGlvbnMubmFtZX0gd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25gKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogRXh0ZW5kcyBQcm9qZW4ncyBiYXNlIGNsYXNzIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGF1dG9tYXRpYyBjb21wb25lbnQgc2V0dXAuXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBleHBvcnQgY2xhc3MgJHtvcHRpb25zLm5hbWV9IGV4dGVuZHMgJHtvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKX0ge2ApO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnN0cnVjdG9yKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3I6XG4gICAgICogMS4gRGVzdHJ1Y3R1cmVzIGNvbXBvbmVudCBmbGFncyBhbmQgb3B0aW9ucyBmcm9tIHRoZSBvcHRpb25zIHBhcmFtZXRlclxuICAgICAqIDIuIE1lcmdlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgICAgKiAzLiBDYWxscyBzdXBlcigpIHdpdGggbWVyZ2VkIG9wdGlvbnNcbiAgICAgKiA0LiBBcHBsaWVzIGNvbXBvbmVudCBkZWZhdWx0cyB2aWEgYXBwbHlEZWZhdWx0cygpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGNvbnN0cnVjdG9yKG9wdGlvbnM6ICR7b3B0aW9uc0ludGVyZmFjZX0pIHtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIFNlcGFyYXRlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZyb20gYmFzZSBQcm9qZW4gb3B0aW9ucyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgY29uc3QgeyAke2Rlc3RydWN0dXJlLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgc3VwZXIoZGVlcE1lcmdlPCR7YmFzZU9wdGlvbnNUeXBlfT4oJHtjb25maWdQYXRofSwgYmFzZU9wdGlvbnMpKTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGFwcGx5RGVmYXVsdHModGhpcywgJHtjb21wb25lbnRBcnJheX0pO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBvcHRpb25zIGludGVyZmFjZSBuYW1lIHRvIGZpbGUgbmFtZVxuICAgICAqXG4gICAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBpbnRlcmZhY2UgbmFtZXMgdG8ga2ViYWItY2FzZSBmaWxlIG5hbWVzLlxuICAgICAqIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGNvbnZlcnNpb24gZm9yIHVubWFwcGVkIGludGVyZmFjZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAcmV0dXJucyBLZWJhYi1jYXNlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRPcHRpb25zRmlsZU5hbWUoXCJUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnNcIikgLy8gXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIlxuICAgICAqL1xuICAgIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zOiBcInR5cGVzY3JpcHQtb3B0aW9uc1wiLFxuICAgICAgICAgICAgSnNpaVByb2plY3RPcHRpb25zOiBcImpzaWktb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3RPcHRpb25zOiBcImF3c2Nkay10eXBlc2NyaXB0LWFwcC1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LW9wdGlvbnNcIixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdbb3B0aW9uc0ludGVyZmFjZV0gfHwgb3B0aW9uc0ludGVyZmFjZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9qZW4gY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIFR5cGVTY3JpcHQgcHJvamVjdCBjbGFzc2VzIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgcHJvamVjdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIFByb2plbiBiYXNlIGNsYXNzZXNcbiAqIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2plY3RHZW5lcmF0b3IgZXh0ZW5kcyBwcm9qZW4uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcjtcbiAgICBwcml2YXRlIHN0YXRpYyBlbnVtR2VuZXJhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcigpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlIFByb2plY3RUeXBlIGVudW0gb25jZSBvbiBmaXJzdCBpbnN0YW50aWF0aW9uICovXG4gICAgICAgIGlmICghUHJvamVjdEdlbmVyYXRvci5lbnVtR2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvamVjdFR5cGVFbnVtKCk7XG4gICAgICAgICAgICBQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogR2VuZXJhdGUgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHVzaW5nIFByb2plblN0cnVjdCBmb3IgSlNJSSBjb21wYXRpYmlsaXR5ICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5yZW5kZXJlci5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVQYXRoID0gdGhpcy5nZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuU3RydWN0IGdlbmVyYXRlcyBhIGNvbmNyZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZyb20gUHJvamVuJ3Mgb3B0aW9uc1xuICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEpTSUkgZG9lc24ndCBzdXBwb3J0IFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlcyBsaWtlIE9taXQ8PlxuICAgICAgICAgKiBUaGUgZ2VuZXJhdGVkIGludGVyZmFjZSBjYW4gYmUgY29uc3VtZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIChQeXRob24sIEphdmEsIEMjLCBHbykgKi9cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gbmV3IFByb2plblN0cnVjdCh0aGlzLmFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdCksIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgICAgICBmaWxlUGF0aDogb3B0aW9uc0ZpbGVQYXRoLFxuICAgICAgICAgICAgb3V0cHV0RmlsZU9wdGlvbnM6IHsgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5taXhpbihTdHJ1Y3QuZnJvbUZxbihiYXNlT3B0aW9uc0ZxbikpXG4gICAgICAgICAgICAud2l0aG91dERlcHJlY2F0ZWQoKTtcblxuICAgICAgICAvKiBSZW1vdmUgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSB0aGUgYmFzZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN0cnVjdC5vbWl0KC4uLm9wdGlvbnMub21pdE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGNvbXBvbmVudC1kZXJpdmVkIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbnN0IHsgUHJpbWl0aXZlVHlwZSB9ID0gcmVxdWlyZShcIkBqc2lpL3NwZWNcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjLmNvbXBvbmVudENsYXNzLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjLmNvbXBvbmVudENsYXNzLm5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBlbmFibGVkIGZsYWcgZm9yIHRoZSBjb21wb25lbnQgKi9cbiAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBwcmltaXRpdmU6IFByaW1pdGl2ZVR5cGUuQm9vbGVhbiB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEVuYWJsZSAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBBZGQgb3B0aW9ucyBwcm9wZXJ0eSBpZiBjb21wb25lbnQgaXMgY29uZmlndXJhYmxlICovXG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSB0aGlzLnJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNUeXBlICYmIHRoaXMuaXNGcW5BdmFpbGFibGUob3B0aW9uc1R5cGUuZnFuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9uc1R5cGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7IGZxbjogb3B0aW9uc1R5cGUuZnFuIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBvcHRpb25zVHlwZS5kb2NzID8/IGAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGAtIGRlZmF1bHQgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyBwYXJhbWV0ZXIgb3IgcmVzb2x1dGlvbiBmYWlsZWQgLSBza2lwICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byByZXNvbHZlIGNvbXBvbmVudCBvcHRpb25zIHR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGMuY29tcG9uZW50Q2xhc3MubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMgJiYgb3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKC4uLm9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRlFOIGlzIGF2YWlsYWJsZSBpbiBhbnkgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcW5BdmFpbGFibGUoZnFuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5sb2FkTWFuaWZlc3RGb3JGcW4oZnFuKTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdC50eXBlcz8uW2Zxbl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBjb21wb25lbnQgb3B0aW9ucyB0eXBlIGZyb20gSlNJSSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQXV0by1kZXRlY3RzIG9wdGlvbnMgZnJvbSBKU0lJIG1hbmlmZXN0IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIHVuZGVmaW5lZC5cbiAgICAgKiBSZXR1cm5zIG51bGwgb25seSB3aGVuIG9wdGlvbnNQcm9wZXJ0eSBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjb21wb25lbnQ6IENvbXBvbmVudCk6IHsgbmFtZTogc3RyaW5nOyBmcW46IHN0cmluZzsgZG9jcz86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgICAgIC8qIE5vcm1hbGl6ZSBvcHRpb25zUHJvcGVydHkgdG8gQ29tcG9uZW50T3B0aW9ucyAqL1xuICAgICAgICBsZXQgb3B0aW9uc0NvbmZpZzogQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0geyBuYW1lOiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5IH07XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgb3B0aW9uc0NvbmZpZyA9IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVc2UgZXhwbGljaXQgdHlwZSBpZiBwcm92aWRlZCAqL1xuICAgICAgICBpZiAob3B0aW9uc0NvbmZpZz8udHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgZnFuOiBvcHRpb25zQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgZG9jczogb3B0aW9uc0NvbmZpZy5kb2NzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEZpbmQgY29tcG9uZW50IGluIEpTSUkgbWFuaWZlc3RzICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZxbiA9IGNvbXBvbmVudC5mcW4gPz8gdGhpcy5maW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihjb21wb25lbnRGcW4pO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bY29tcG9uZW50RnFuXTtcbiAgICAgICAgaWYgKCFjbGFzc1R5cGUgfHwgY2xhc3NUeXBlLmtpbmQgIT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnRGcW4sIFwiQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSAoY2xhc3NUeXBlIGFzIHsgaW5pdGlhbGl6ZXI/OiB7IHBhcmFtZXRlcnM/OiBBcnJheTx7IHR5cGU/OiB7IGZxbj86IHN0cmluZyB9IH0+IH0gfSlcbiAgICAgICAgICAgIC5pbml0aWFsaXplcjtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplcj8ucGFyYW1ldGVycz8uWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhcmFtID0gaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZxbiA9IG9wdGlvbnNQYXJhbS50eXBlPy5mcW47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zRnFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIG5vIEZRTiAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSBtYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dO1xuICAgICAgICBjb25zdCBkb2NzID0gKG9wdGlvbnNUeXBlIGFzIHsgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQpPy5kb2NzPy5zdW1tYXJ5O1xuXG4gICAgICAgIC8qIEF1dG8tZ2VuZXJhdGUgcHJvcGVydHkgbmFtZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IGAke25hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcHRpb25zQ29uZmlnPy5uYW1lID8/IGRlZmF1bHROYW1lO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3BlcnR5TmFtZSwgZnFuOiBvcHRpb25zRnFuLCBkb2NzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgY29tcG9uZW50IEZRTiBieSBzZWFyY2hpbmcgYWxsIEpTSUkgbWFuaWZlc3RzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSBmaXJzdCAqL1xuICAgICAgICBjb25zdCBvd25GcW4gPSBgQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLiR7Y29tcG9uZW50TmFtZX1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3duTWFuaWZlc3QgPSB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICAgICAgaWYgKG93bk1hbmlmZXN0LnR5cGVzPy5bb3duRnFuXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvd25GcW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvKiBPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZSB5ZXQgZHVyaW5nIGRldmVsb3BtZW50IC0gdGhpcyBpcyBleHBlY3RlZCAqL1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2VhcmNoIGluIG5vZGVfbW9kdWxlcyBmb3IgSlNJSSBwYWNrYWdlcyAqL1xuICAgICAgICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBqb2luKF9fZGlybmFtZSwgXCIuLi8uLi9ub2RlX21vZHVsZXNcIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5maW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBrZyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMobWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcW4uZW5kc1dpdGgoYC4ke2NvbXBvbmVudE5hbWV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIFNraXAgcGFja2FnZXMgd2l0aCBpbnZhbGlkIG1hbmlmZXN0cyAtIGxvZyBmb3IgZGVidWdnaW5nICovXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBsb2FkIG1hbmlmZXN0IGZyb20gcGFja2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IoY29tcG9uZW50TmFtZSwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIGFueSBKU0lJIG1hbmlmZXN0XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBKU0lJIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEpzaWlQYWNrYWdlcyhub2RlTW9kdWxlc1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCBleGlzdHNTeW5jIH0gPSByZXF1aXJlKFwibm9kZTpmc1wiKTtcblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgsIGVudHJ5KTtcblxuICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICAgICAgLyogU2NvcGVkIHBhY2thZ2UgLSByZWN1cnNlIGludG8gc2NvcGUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBlbnRyeVBhdGg7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiByZWFkZGlyU3luYyhzY29wZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZ1BhdGggPSByZXNvbHZlKHNjb3BlUGF0aCwgc2NvcGVkRW50cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGtnUGF0aCwgXCIuanNpaVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2gocGtnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRTeW5jKGVudHJ5UGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgcGFja2FnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZW50cnlQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIEpTSUkgbWFuaWZlc3QgZm9yIGEgZ2l2ZW4gRlFOXG4gICAgICpcbiAgICAgKiBFeHRyYWN0cyBwYWNrYWdlIG5hbWUgZnJvbSBGUU4uIEZvciBzY29wZWQgcGFja2FnZXMgbGlrZSBAc2NvcGUvcGFja2FnZS5DbGFzc05hbWUsXG4gICAgICogdGhlIHBhY2thZ2UgbmFtZSBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgZG90IChpLmUuLCBAc2NvcGUvcGFja2FnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTWFuaWZlc3RGb3JGcW4oZnFuOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZnFuLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGRvdEluZGV4ID4gMCA/IGZxbi5zdWJzdHJpbmcoMCwgZG90SW5kZXgpIDogZnFuO1xuXG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSAqL1xuICAgICAgICBpZiAocGFja2FnZU5hbWUgPT09IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVHJ5IG5vZGVfbW9kdWxlcyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UoZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0TG9hZEVycm9yKHBhY2thZ2VOYW1lLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmcm9tIGEgcGFja2FnZSBkaXJlY3RvcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCIuanNpaVwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpzaWlQYXRoLCBcInV0Zi04XCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGlzIHBhY2thZ2UncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT3duTWFuaWZlc3QoKTogQXNzZW1ibHkge1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQcm9qZWN0VHlwZSBlbnVtIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2plY3RUeXBlcyA9IHRoaXMuZGlzY292ZXJQcm9qZWN0VHlwZXMoKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBFYWNoIHByb2plY3QgdHlwZSBjb3JyZXNwb25kcyB0byBhIGdlbmVyYXRlZCBwcm9qZWN0IGNsYXNzIGFuZCBpdHMgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBAZ2VuZXJhdGVkIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqL1wiKTtcbiAgICAgICAgbGluZXMucHVzaChcImV4cG9ydCBlbnVtIFByb2plY3RUeXBlIHtcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZW51bU5hbWUsIHZhbHVlLCBkb2NzXSBvZiBwcm9qZWN0VHlwZXMpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgLyoqXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICAqICR7ZG9jc31gKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgICovXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICR7ZW51bU5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goXCJ9XCIpO1xuXG4gICAgICAgIG5ldyBwcm9qZW4uVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBcInNyYy9wcm9qZWN0LXR5cGUudHNcIiwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY292ZXJzIGFsbCBwcm9qZWN0IHR5cGVzIHRoYXQgZXh0ZW5kIHByb2plbi5Qcm9qZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNjb3ZlclByb2plY3RUeXBlcygpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IFwicHJvamVuLlByb2plY3RcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmcW4sIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzID8/IHt9KSkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IHR5cGUgYXMge1xuICAgICAgICAgICAgICAgIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBiYXNlPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGRvY3M/OiB7IHN1bW1hcnk/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dGVuZHNCYXNlKGNsYXNzVHlwZSwgYmFzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGZxbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0c1swXSAhPT0gXCJwcm9qZW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZW51bU5hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCBcIl8kMVwiKVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke21vZHVsZX0uJHtjbGFzc05hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBjbGFzc1R5cGUuZG9jcz8uc3VtbWFyeSA/PyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgIHByb2plY3RUeXBlcy5wdXNoKFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRlbmRzQmFzZShjbGFzc1R5cGU6IHsgaW5oZXJpdGFuY2VQYXRoPzogc3RyaW5nW107IGJhc2U/OiBzdHJpbmcgfSwgYmFzZUNsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc1R5cGUuaW5oZXJpdGFuY2VQYXRoLmluY2x1ZGVzKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudEJhc2UgPSBjbGFzc1R5cGUuYmFzZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCYXNlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2UgPT09IGJhc2VDbGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLnJlbmRlcmVyLmpzaWlNYW5pZmVzdC50eXBlcz8uW2N1cnJlbnRCYXNlXTtcbiAgICAgICAgICAgIGlmICghYmFzZVR5cGUgfHwgYmFzZVR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QmFzZSA9IChiYXNlVHlwZSBhcyB7IGJhc2U/OiBzdHJpbmcgfSkuYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgcHJvamVuLlRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|