@nikovirtala/projen-constructs 0.1.8 → 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 +622 -97
- package/API.md +769 -52
- 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 +1 -0
- package/lib/index.js +2 -1
- package/lib/project-generator.d.ts +87 -63
- package/lib/project-generator.js +344 -60
- package/lib/project-type.d.ts +78 -16
- package/lib/project-type.js +79 -17
- 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
|
|
@@ -115,7 +128,7 @@ class TypeScriptClassRenderer {
|
|
|
115
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,7 +138,6 @@ 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
|
/**
|
|
@@ -133,10 +145,11 @@ class TypeScriptClassRenderer {
|
|
|
133
145
|
*
|
|
134
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
150
|
* @param projectType - Project type identifier
|
|
138
151
|
* @returns Fully qualified options interface name
|
|
139
|
-
* @throws {InvalidBaseClassFormatError} When projectType format is invalid
|
|
152
|
+
* @throws {InvalidBaseClassFormatError} When projectType format is invalid or class not found
|
|
140
153
|
*
|
|
141
154
|
* @example
|
|
142
155
|
* getBaseOptionsFqn(ProjectType.TYPESCRIPT) // "projen.typescript.TypeScriptProjectOptions"
|
|
@@ -148,7 +161,17 @@ class TypeScriptClassRenderer {
|
|
|
148
161
|
if (!baseClass.includes(".")) {
|
|
149
162
|
throw new errors_1.InvalidBaseClassFormatError(baseClass);
|
|
150
163
|
}
|
|
151
|
-
|
|
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;
|
|
152
175
|
}
|
|
153
176
|
/**
|
|
154
177
|
* Extracts component configuration for constructor code generation
|
|
@@ -172,14 +195,15 @@ class TypeScriptClassRenderer {
|
|
|
172
195
|
const componentParts = [];
|
|
173
196
|
for (const c of components) {
|
|
174
197
|
/* Convert component class name to camelCase variable name (e.g., Vitest -> vitest) */
|
|
175
|
-
const name = c.
|
|
198
|
+
const name = c.componentClass.name.charAt(0).toLowerCase() + c.componentClass.name.slice(1);
|
|
176
199
|
destructure.push(name);
|
|
177
200
|
/* Build component config object for applyDefaults() call */
|
|
178
|
-
const parts = [`component: ${c.
|
|
179
|
-
if (c.optionsProperty) {
|
|
201
|
+
const parts = [`component: ${c.componentClass.name}`];
|
|
202
|
+
if (c.optionsProperty && typeof c.optionsProperty !== "boolean") {
|
|
180
203
|
/* Component has configurable options - include both enabled flag and options */
|
|
181
|
-
|
|
182
|
-
|
|
204
|
+
const propName = typeof c.optionsProperty === "string" ? c.optionsProperty : c.optionsProperty.name;
|
|
205
|
+
destructure.push(propName);
|
|
206
|
+
parts.push(`enabled: ${name}`, `options: ${propName}`);
|
|
183
207
|
}
|
|
184
208
|
else {
|
|
185
209
|
/* Component has no options - only include enabled flag */
|
|
@@ -213,9 +237,9 @@ class TypeScriptClassRenderer {
|
|
|
213
237
|
/* Configuration utilities import */
|
|
214
238
|
imports.set("../config", new Set(["applyDefaults", "defaultOptions"]));
|
|
215
239
|
/* Component class imports - derive module path from component class name */
|
|
216
|
-
const components = options.components ??
|
|
240
|
+
const components = options.components ?? getDefaultComponents();
|
|
217
241
|
for (const c of components) {
|
|
218
|
-
const componentName = c.
|
|
242
|
+
const componentName = c.componentClass.name;
|
|
219
243
|
const modulePath = `../components/${componentName.toLowerCase()}`;
|
|
220
244
|
if (!imports.has(modulePath)) {
|
|
221
245
|
imports.set(modulePath, new Set());
|
|
@@ -279,7 +303,6 @@ class TypeScriptClassRenderer {
|
|
|
279
303
|
*/
|
|
280
304
|
renderExport(optionsInterface) {
|
|
281
305
|
const optionsFileName = this.getOptionsFileName(optionsInterface);
|
|
282
|
-
this.buffer.line();
|
|
283
306
|
this.buffer.line(`export { ${optionsInterface} } from "./${optionsFileName}.generated";`);
|
|
284
307
|
}
|
|
285
308
|
/**
|
|
@@ -292,7 +315,6 @@ class TypeScriptClassRenderer {
|
|
|
292
315
|
* @param componentArray - Code string for component array
|
|
293
316
|
*/
|
|
294
317
|
renderClass(options, optionsInterface, baseOptionsType, destructure, componentArray) {
|
|
295
|
-
this.buffer.line();
|
|
296
318
|
this.buffer.line("/**");
|
|
297
319
|
this.buffer.line(` * ${options.name} with standard configuration and component integration`);
|
|
298
320
|
this.buffer.line(" *");
|
|
@@ -359,27 +381,9 @@ class TypeScriptClassRenderer {
|
|
|
359
381
|
* Projen component that generates TypeScript project classes with standard configuration
|
|
360
382
|
*
|
|
361
383
|
* This component automates the creation of project classes that extend Projen base classes
|
|
362
|
-
* with opinionated defaults and component integration.
|
|
363
|
-
* 1. An options interface (via ProjenStruct) that extends the base Projen options
|
|
364
|
-
* 2. A project class that applies default configuration and instantiates components
|
|
365
|
-
*
|
|
366
|
-
* The generated code follows a consistent pattern:
|
|
367
|
-
* - Imports required modules and components
|
|
368
|
-
* - Re-exports the generated options interface
|
|
369
|
-
* - Defines a class extending the Projen base class
|
|
370
|
-
* - Constructor merges defaults with user options and applies components
|
|
371
|
-
*
|
|
372
|
-
* @example
|
|
373
|
-
* ```typescript
|
|
374
|
-
* new ProjectGenerator(project, {
|
|
375
|
-
* name: "TypeScriptProject",
|
|
376
|
-
* baseClass: "typescript.TypeScriptProject",
|
|
377
|
-
* filePath: "src/projects/typescript.generated.ts",
|
|
378
|
-
* components: [{ component: Vitest, optionsProperty: "vitestOptions" }]
|
|
379
|
-
* });
|
|
380
|
-
* ```
|
|
384
|
+
* with opinionated defaults and component integration.
|
|
381
385
|
*/
|
|
382
|
-
class ProjectGenerator extends
|
|
386
|
+
class ProjectGenerator extends projen.Component {
|
|
383
387
|
/**
|
|
384
388
|
* @param project - Projen project instance
|
|
385
389
|
* @param options - Generator configuration
|
|
@@ -388,6 +392,11 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
388
392
|
super(project);
|
|
389
393
|
this.options = options;
|
|
390
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
|
+
}
|
|
391
400
|
/* Generate the options interface using ProjenStruct for JSII compatibility */
|
|
392
401
|
const optionsInterface = `${options.name}Options`;
|
|
393
402
|
const baseOptionsFqn = this.renderer.getBaseOptionsFqn(options.projectType);
|
|
@@ -407,35 +416,48 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
407
416
|
struct.omit(...options.omitOptions);
|
|
408
417
|
}
|
|
409
418
|
/* Add component-derived options to the interface */
|
|
410
|
-
const components = options.components ??
|
|
419
|
+
const components = options.components ?? getDefaultComponents();
|
|
411
420
|
const { PrimitiveType } = require("@jsii/spec");
|
|
412
421
|
for (const c of components) {
|
|
413
|
-
const name = c.
|
|
422
|
+
const name = c.componentClass.name.charAt(0).toLowerCase() + c.componentClass.name.slice(1);
|
|
414
423
|
/* Add enabled flag for the component */
|
|
415
424
|
struct.add({
|
|
416
425
|
name,
|
|
417
426
|
type: { primitive: PrimitiveType.Boolean },
|
|
418
427
|
optional: true,
|
|
419
428
|
docs: {
|
|
420
|
-
summary: `Enable ${c.
|
|
429
|
+
summary: `Enable ${c.componentClass.name} component`,
|
|
421
430
|
default: "true",
|
|
422
431
|
},
|
|
423
432
|
});
|
|
424
433
|
/* Add options property if component is configurable */
|
|
425
|
-
if (c.optionsProperty) {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
+
}
|
|
435
457
|
}
|
|
436
458
|
}
|
|
437
459
|
/* Add custom options to the interface */
|
|
438
|
-
if (options.additionalOptions) {
|
|
460
|
+
if (options.additionalOptions && options.additionalOptions.length > 0) {
|
|
439
461
|
struct.add(...options.additionalOptions);
|
|
440
462
|
}
|
|
441
463
|
}
|
|
@@ -485,15 +507,277 @@ class ProjectGenerator extends projen_1.Component {
|
|
|
485
507
|
readonly: this.options.readonly ?? true,
|
|
486
508
|
});
|
|
487
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
|
+
}
|
|
488
769
|
}
|
|
489
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;
|
|
490
774
|
/**
|
|
491
775
|
* Text file for generated TypeScript class code
|
|
492
776
|
*
|
|
493
777
|
* Extends Projen's TextFile to add the generated file marker comment
|
|
494
778
|
* at the beginning of the file.
|
|
495
779
|
*/
|
|
496
|
-
class TypeScriptClassFile extends
|
|
780
|
+
class TypeScriptClassFile extends projen.TextFile {
|
|
497
781
|
/**
|
|
498
782
|
* @param project - Projen project instance
|
|
499
783
|
* @param filePath - Output file path
|
|
@@ -507,4 +791,4 @@ class TypeScriptClassFile extends projen_1.TextFile {
|
|
|
507
791
|
this.addLine(content);
|
|
508
792
|
}
|
|
509
793
|
}
|
|
510
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esc0VBQW9FO0FBRXBFLG1DQUE2QztBQUM3QyxxQ0FBc0c7QUFHdEc7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFzQjtJQUMxQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFDaEQ7UUFDSSxTQUFTLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTTtRQUNoRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsZUFBZTtZQUNyQixJQUFJLEVBQUUsOENBQThDO1lBQ3BELElBQUksRUFBRSxzQkFBc0I7U0FDL0I7S0FDSjtDQUNKLENBQUM7QUFtSEY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFJWjs7T0FFRztJQUNILFlBQTZCLFNBQVMsR0FBRztRQUFaLFdBQU0sR0FBTixNQUFNLENBQU07UUFOakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUtvQixDQUFDO0lBRTdDOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMs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cnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIFRleHRGaWxlIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLCBJbnZhbGlkRmlsZVBhdGhFcnJvciwgSW52YWxpZEluZGVudExldmVsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09NUE9ORU5UUzogQ29tcG9uZW50Q29uZmlnW10gPSBbXG4gICAgeyBjb21wb25lbnQ6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvbWlzZVwiKS5NaXNlIH0sXG4gICAge1xuICAgICAgICBjb21wb25lbnQ6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvdml0ZXN0XCIpLlZpdGVzdCxcbiAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgIHR5cGU6IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLlZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgfSxcbiAgICB9LFxuXTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHtcbiAqICAgY29tcG9uZW50OiBWaXRlc3QsXG4gKiAgIG9wdGlvbnNQcm9wZXJ0eTogXCJ2aXRlc3RPcHRpb25zXCJcbiAqIH07XG4gKiBgYGBcbiAqL1xuaW50ZXJmYWNlIENvbXBvbmVudENvbmZpZzxUIGV4dGVuZHMgQ29tcG9uZW50ID0gQ29tcG9uZW50PiB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50OiBuZXcgKFxuICAgICAgICBwcm9qZWN0OiBuZXZlcixcbiAgICAgICAgb3B0aW9ucz86IG5ldmVyLFxuICAgICkgPT4gVDtcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogV2hlbiBzcGVjaWZpZWQsIGFkZHMgYW4gb3B0aW9ucyBwcm9wZXJ0eSB0byB0aGUgaW50ZXJmYWNlIGFsbG93aW5nXG4gICAgICogdXNlcnMgdG8gY29uZmlndXJlIHRoZSBjb21wb25lbnQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3B0aW9uc1Byb3BlcnR5Pzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eSAoZS5nLiwgXCJ2aXRlc3RPcHRpb25zXCIpXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChlLmcuLCBcIkBuaWtvdmlydGFsYS9wcm9qZW4tY29uc3RydWN0cy5WaXRlc3RPcHRpb25zXCIpXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEb2N1bWVudGF0aW9uIHN1bW1hcnlcbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGRvY3M/OiBzdHJpbmc7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgUHJvamVjdEdlbmVyYXRvcihwcm9qZWN0LCB7XG4gKiAgIG5hbWU6IFwiVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgYmFzZUNsYXNzOiBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgZmlsZVBhdGg6IFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCIsXG4gKiAgIGNvbXBvbmVudHM6IFt7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IFwidml0ZXN0T3B0aW9uc1wiIH1dXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkaXRpb25hbE9wdGlvbnM/OiBQcm9wZXJ0eVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IERFRkFVTFRfQ09NUE9ORU5UUztcblxuICAgICAgICAvKiBFeHRyYWN0IGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZvciBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uICovXG4gICAgICAgIGNvbnN0IHsgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5IH0gPSB0aGlzLmV4dHJhY3RDb21wb25lbnRPcHRpb25zKGNvbXBvbmVudHMpO1xuICAgICAgICBjb25zdCBpbXBvcnRzID0gdGhpcy5leHRyYWN0SW1wb3J0cyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBSZW5kZXIgYWxsIHNlY3Rpb25zIG9mIHRoZSBjbGFzcyBmaWxlICovXG4gICAgICAgIHRoaXMucmVuZGVySW1wb3J0cyhpbXBvcnRzKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLnJlbmRlckV4cG9ydChvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLnJlbmRlckNsYXNzKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5mbHVzaCgpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgZnJvbSBwcm9qZWN0IHR5cGVcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvamVuIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBieSBhcHBlbmRpbmcgXCJPcHRpb25zXCIgc3VmZml4IGFuZCBwcmVmaXhpbmcgd2l0aCBcInByb2plbi5cIiBuYW1lc3BhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBvcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogQHRocm93cyB7SW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yfSBXaGVuIHByb2plY3RUeXBlIGZvcm1hdCBpcyBpbnZhbGlkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwicHJvamVuLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCJcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5KU0lJKSAvLyBcInByb2plbi5jZGsuSnNpaVByb2plY3RPcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRCYXNlT3B0aW9uc0Zxbihwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBwcm9qZWN0VHlwZS52YWx1ZU9mKCk7XG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZm9ybWF0OiBtdXN0IGNvbnRhaW4gbW9kdWxlLkNsYXNzTmFtZSBzdHJ1Y3R1cmUgKi9cbiAgICAgICAgaWYgKCFiYXNlQ2xhc3MuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYHByb2plbi4ke2Jhc2VDbGFzc31PcHRpb25zYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgY29kZSBnZW5lcmF0aW9uXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyBpbnRvOlxuICAgICAqIDEuIERlc3RydWN0dXJlIGxpc3Q6IHZhcmlhYmxlIG5hbWVzIHRvIGV4dHJhY3QgZnJvbSBvcHRpb25zXG4gICAgICogMi4gQ29tcG9uZW50IGFycmF5OiBjb2RlIHN0cmluZyBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggZGVzdHJ1Y3R1cmUgYXJyYXkgYW5kIGNvbXBvbmVudEFycmF5IGNvZGUgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElucHV0OiBbeyBjb21wb25lbnQ6IFZpdGVzdCwgb3B0aW9uc1Byb3BlcnR5OiB7IG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLCAuLi4gfSB9XVxuICAgICAqIE91dHB1dDoge1xuICAgICAqICAgZGVzdHJ1Y3R1cmU6IFtcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl0sXG4gICAgICogICBjb21wb25lbnRBcnJheTogXCJbeyBjb21wb25lbnQ6IFZpdGVzdCwgZW5hYmxlZDogdml0ZXN0LCBvcHRpb25zOiB2aXRlc3RPcHRpb25zIH1dXCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzOiBDb21wb25lbnRDb25maWdbXSk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnQubmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGMuY29tcG9uZW50Lm5hbWUuc2xpY2UoMSk7XG4gICAgICAgICAgICBkZXN0cnVjdHVyZS5wdXNoKG5hbWUpO1xuXG4gICAgICAgICAgICAvKiBCdWlsZCBjb21wb25lbnQgY29uZmlnIG9iamVjdCBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGwgKi9cbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gW2Bjb21wb25lbnQ6ICR7Yy5jb21wb25lbnQubmFtZX1gXTtcbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgY29uZmlndXJhYmxlIG9wdGlvbnMgLSBpbmNsdWRlIGJvdGggZW5hYmxlZCBmbGFnIGFuZCBvcHRpb25zICovXG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChjLm9wdGlvbnNQcm9wZXJ0eS5uYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCwgYG9wdGlvbnM6ICR7Yy5vcHRpb25zUHJvcGVydHkubmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIC0gb25seSBpbmNsdWRlIGVuYWJsZWQgZmxhZyAqL1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goYGVuYWJsZWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudFBhcnRzLnB1c2goYHsgJHtwYXJ0cy5qb2luKFwiLCBcIil9IH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheTogYFske2NvbXBvbmVudFBhcnRzLmpvaW4oXCIsIFwiKX1dYCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBpbXBvcnQgc3RhdGVtZW50cyBtYXAgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3NcbiAgICAgKlxuICAgICAqIENvbGxlY3RzIGFsbCByZXF1aXJlZCBpbXBvcnRzOlxuICAgICAqIC0gUHJvamVuIGJhc2UgbW9kdWxlICh0eXBlc2NyaXB0LCBjZGssIGF3c2NkaylcbiAgICAgKiAtIENvbmZpZyB1dGlsaXRpZXMgKGFwcGx5RGVmYXVsdHMsIGRlZmF1bHRPcHRpb25zKVxuICAgICAqIC0gQ29tcG9uZW50IGNsYXNzZXNcbiAgICAgKiAtIFV0aWxpdHkgZnVuY3Rpb25zIChkZWVwTWVyZ2UpXG4gICAgICogLSBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgKHR5cGUtb25seSBpbXBvcnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcmV0dXJucyBNYXAgb2YgbW9kdWxlIHBhdGhzIHRvIHNldHMgb2YgaW1wb3J0ZWQgbmFtZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RJbXBvcnRzKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgICAgIC8qIEV4dHJhY3QgYmFzZSBtb2R1bGUgbmFtZSBmcm9tIHByb2plY3RUeXBlIChlLmcuLCBcInR5cGVzY3JpcHRcIiBmcm9tIFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiKSAqL1xuICAgICAgICBjb25zdCBiYXNlTW9kdWxlID0gb3B0aW9ucy5wcm9qZWN0VHlwZS52YWx1ZU9mKCkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW4gYmFzZSBtb2R1bGUgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwicHJvamVuXCIsIG5ldyBTZXQoW2Jhc2VNb2R1bGVdKSk7XG5cbiAgICAgICAgLyogQ29uZmlndXJhdGlvbiB1dGlsaXRpZXMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vY29uZmlnXCIsIG5ldyBTZXQoW1wiYXBwbHlEZWZhdWx0c1wiLCBcImRlZmF1bHRPcHRpb25zXCJdKSk7XG5cbiAgICAgICAgLyogQ29tcG9uZW50IGNsYXNzIGltcG9ydHMgLSBkZXJpdmUgbW9kdWxlIHBhdGggZnJvbSBjb21wb25lbnQgY2xhc3MgbmFtZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IERFRkFVTFRfQ09NUE9ORU5UUztcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjLmNvbXBvbmVudC5uYW1lO1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IGAuLi9jb21wb25lbnRzLyR7Y29tcG9uZW50TmFtZS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgICAgICAgICBpZiAoIWltcG9ydHMuaGFzKG1vZHVsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5zZXQobW9kdWxlUGF0aCwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUltcG9ydHMgPSBpbXBvcnRzLmdldChtb2R1bGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVJbXBvcnRzKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlSW1wb3J0cy5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVdGlsaXR5IGZ1bmN0aW9ucyBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCIuLi91dGlsc1wiLCBuZXcgU2V0KFtcImRlZXBNZXJnZVwiXSkpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZSBpbXBvcnQgKHR5cGUtb25seSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMpICovXG4gICAgICAgIGltcG9ydHMuc2V0KGAuLyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWRgLCBuZXcgU2V0KFtvcHRpb25zSW50ZXJmYWNlXSkpO1xuXG4gICAgICAgIHJldHVybiBpbXBvcnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGNvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIHByb2plY3QgdHlwZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHBhdGggaW4gdGhlIGRlZmF1bHRPcHRpb25zXG4gICAgICogY29uZmlndXJhdGlvbiBvYmplY3QgZXhwb3J0ZWQgZnJvbSBjb25maWcudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIENvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldENvbmZpZ1BhdGgoUHJvamVjdFR5cGUuVFlQRVNDUklQVCkgLy8gXCJkZWZhdWx0T3B0aW9ucy50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XCJcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENvbmZpZ1BhdGgocHJvamVjdFR5cGU6IFByb2plY3RUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBkZWZhdWx0T3B0aW9ucy4ke3Byb2plY3RUeXBlLnZhbHVlT2YoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgaW1wb3J0IHN0YXRlbWVudHMgaW4gc29ydGVkIG9yZGVyXG4gICAgICpcbiAgICAgKiBTb3J0cyBpbXBvcnRzIHdpdGggZXh0ZXJuYWwgcGFja2FnZXMgZmlyc3QsIHRoZW4gcmVsYXRpdmUgaW1wb3J0cy5cbiAgICAgKiBVc2VzIHR5cGUtb25seSBpbXBvcnRzIGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGltcG9ydHMgLSBNYXAgb2YgbW9kdWxlIHBhdGhzIHRvIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJJbXBvcnRzKGltcG9ydHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pikge1xuICAgICAgICAvKiBTb3J0IG1vZHVsZXM6IGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMgYWxwaGFiZXRpY2FsbHkgKi9cbiAgICAgICAgY29uc3Qgc29ydGVkTW9kdWxlcyA9IEFycmF5LmZyb20oaW1wb3J0cy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFJc1JlbGF0aXZlID0gYS5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGJJc1JlbGF0aXZlID0gYi5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGlmIChhSXNSZWxhdGl2ZSAhPT0gYklzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYUlzUmVsYXRpdmUgPyAxIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vZCBvZiBzb3J0ZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IEFycmF5LmZyb20oaW1wb3J0cy5nZXQobW9kKSB8fCBbXSkuc29ydCgpO1xuICAgICAgICAgICAgLyogVXNlIHR5cGUtb25seSBpbXBvcnQgZm9yIGdlbmVyYXRlZCBmaWxlcyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY2llcyAqL1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlT25seSA9IG1vZC5pbmNsdWRlcyhcIi5nZW5lcmF0ZWRcIik7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRTdG10ID0gaXNUeXBlT25seSA/IFwiaW1wb3J0IHR5cGVcIiA6IFwiaW1wb3J0XCI7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAke2ltcG9ydFN0bXR9IHsgJHtuYW1lcy5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7bW9kfVwiO2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyByZS1leHBvcnQgc3RhdGVtZW50IGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBleHBvcnQgeyAke29wdGlvbnNJbnRlcmZhY2V9IH0gZnJvbSBcIi4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZFwiO2ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gYmFzZU9wdGlvbnNUeXBlIC0gQmFzZSBvcHRpb25zIHR5cGUgd2l0aG91dCBcInByb2plbi5cIiBwcmVmaXhcbiAgICAgKiBAcGFyYW0gZGVzdHJ1Y3R1cmUgLSBWYXJpYWJsZSBuYW1lcyB0byBkZXN0cnVjdHVyZSBmcm9tIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50QXJyYXkgLSBDb2RlIHN0cmluZyBmb3IgY29tcG9uZW50IGFycmF5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJDbGFzcyhcbiAgICAgICAgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyxcbiAgICAgICAgYmFzZU9wdGlvbnNUeXBlOiBzdHJpbmcsXG4gICAgICAgIGRlc3RydWN0dXJlOiBzdHJpbmdbXSxcbiAgICAgICAgY29tcG9uZW50QXJyYXk6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAgKiAke29wdGlvbnMubmFtZX0gd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25gKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogRXh0ZW5kcyBQcm9qZW4ncyBiYXNlIGNsYXNzIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGF1dG9tYXRpYyBjb21wb25lbnQgc2V0dXAuXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBleHBvcnQgY2xhc3MgJHtvcHRpb25zLm5hbWV9IGV4dGVuZHMgJHtvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKX0ge2ApO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnN0cnVjdG9yKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3I6XG4gICAgICogMS4gRGVzdHJ1Y3R1cmVzIGNvbXBvbmVudCBmbGFncyBhbmQgb3B0aW9ucyBmcm9tIHRoZSBvcHRpb25zIHBhcmFtZXRlclxuICAgICAqIDIuIE1lcmdlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgICAgKiAzLiBDYWxscyBzdXBlcigpIHdpdGggbWVyZ2VkIG9wdGlvbnNcbiAgICAgKiA0LiBBcHBsaWVzIGNvbXBvbmVudCBkZWZhdWx0cyB2aWEgYXBwbHlEZWZhdWx0cygpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGNvbnN0cnVjdG9yKG9wdGlvbnM6ICR7b3B0aW9uc0ludGVyZmFjZX0pIHtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIFNlcGFyYXRlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZyb20gYmFzZSBQcm9qZW4gb3B0aW9ucyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgY29uc3QgeyAke2Rlc3RydWN0dXJlLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgc3VwZXIoZGVlcE1lcmdlPCR7YmFzZU9wdGlvbnNUeXBlfT4oJHtjb25maWdQYXRofSwgYmFzZU9wdGlvbnMpKTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGFwcGx5RGVmYXVsdHModGhpcywgJHtjb21wb25lbnRBcnJheX0pO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBvcHRpb25zIGludGVyZmFjZSBuYW1lIHRvIGZpbGUgbmFtZVxuICAgICAqXG4gICAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBpbnRlcmZhY2UgbmFtZXMgdG8ga2ViYWItY2FzZSBmaWxlIG5hbWVzLlxuICAgICAqIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGNvbnZlcnNpb24gZm9yIHVubWFwcGVkIGludGVyZmFjZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAcmV0dXJucyBLZWJhYi1jYXNlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRPcHRpb25zRmlsZU5hbWUoXCJUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnNcIikgLy8gXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIlxuICAgICAqL1xuICAgIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zOiBcInR5cGVzY3JpcHQtb3B0aW9uc1wiLFxuICAgICAgICAgICAgSnNpaVByb2plY3RPcHRpb25zOiBcImpzaWktb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3RPcHRpb25zOiBcImF3c2Nkay10eXBlc2NyaXB0LWFwcC1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LW9wdGlvbnNcIixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdbb3B0aW9uc0ludGVyZmFjZV0gfHwgb3B0aW9uc0ludGVyZmFjZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9qZW4gY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIFR5cGVTY3JpcHQgcHJvamVjdCBjbGFzc2VzIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgcHJvamVjdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIFByb2plbiBiYXNlIGNsYXNzZXNcbiAqIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi4gSXQgZ2VuZXJhdGVzIGJvdGg6XG4gKiAxLiBBbiBvcHRpb25zIGludGVyZmFjZSAodmlhIFByb2plblN0cnVjdCkgdGhhdCBleHRlbmRzIHRoZSBiYXNlIFByb2plbiBvcHRpb25zXG4gKiAyLiBBIHByb2plY3QgY2xhc3MgdGhhdCBhcHBsaWVzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgaW5zdGFudGlhdGVzIGNvbXBvbmVudHNcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9sbG93cyBhIGNvbnNpc3RlbnQgcGF0dGVybjpcbiAqIC0gSW1wb3J0cyByZXF1aXJlZCBtb2R1bGVzIGFuZCBjb21wb25lbnRzXG4gKiAtIFJlLWV4cG9ydHMgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICogLSBEZWZpbmVzIGEgY2xhc3MgZXh0ZW5kaW5nIHRoZSBQcm9qZW4gYmFzZSBjbGFzc1xuICogLSBDb25zdHJ1Y3RvciBtZXJnZXMgZGVmYXVsdHMgd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGFwcGxpZXMgY29tcG9uZW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgUHJvamVjdEdlbmVyYXRvcihwcm9qZWN0LCB7XG4gKiAgIG5hbWU6IFwiVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgYmFzZUNsYXNzOiBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIixcbiAqICAgZmlsZVBhdGg6IFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCIsXG4gKiAgIGNvbXBvbmVudHM6IFt7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IFwidml0ZXN0T3B0aW9uc1wiIH1dXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEdlbmVyYXRvciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSByZW5kZXJlcjogVHlwZVNjcmlwdENsYXNzUmVuZGVyZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcigpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlIHRoZSBvcHRpb25zIGludGVyZmFjZSB1c2luZyBQcm9qZW5TdHJ1Y3QgZm9yIEpTSUkgY29tcGF0aWJpbGl0eSAqL1xuICAgICAgICBjb25zdCBvcHRpb25zSW50ZXJmYWNlID0gYCR7b3B0aW9ucy5uYW1lfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc0ZxbiA9IHRoaXMucmVuZGVyZXIuZ2V0QmFzZU9wdGlvbnNGcW4ob3B0aW9ucy5wcm9qZWN0VHlwZSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlUGF0aCA9IHRoaXMuZ2V0T3B0aW9uc0ZpbGVQYXRoKG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFByb2plblN0cnVjdCBnZW5lcmF0ZXMgYSBjb25jcmV0ZSBUeXBlU2NyaXB0IGludGVyZmFjZSBmcm9tIFByb2plbidzIG9wdGlvbnNcbiAgICAgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBKU0lJIGRvZXNuJ3Qgc3VwcG9ydCBUeXBlU2NyaXB0IHV0aWxpdHkgdHlwZXMgbGlrZSBPbWl0PD5cbiAgICAgICAgICogVGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgY2FuIGJlIGNvbnN1bWVkIGJ5IG90aGVyIGxhbmd1YWdlcyAoUHl0aG9uLCBKYXZhLCBDIywgR28pICovXG4gICAgICAgIGNvbnN0IHN0cnVjdCA9IG5ldyBQcm9qZW5TdHJ1Y3QodGhpcy5hc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3QpLCB7XG4gICAgICAgICAgICBuYW1lOiBvcHRpb25zSW50ZXJmYWNlLFxuICAgICAgICAgICAgZmlsZVBhdGg6IG9wdGlvbnNGaWxlUGF0aCxcbiAgICAgICAgICAgIG91dHB1dEZpbGVPcHRpb25zOiB7IHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgIH0pXG4gICAgICAgICAgICAubWl4aW4oU3RydWN0LmZyb21GcW4oYmFzZU9wdGlvbnNGcW4pKVxuICAgICAgICAgICAgLndpdGhvdXREZXByZWNhdGVkKCk7XG5cbiAgICAgICAgLyogUmVtb3ZlIHNwZWNpZmllZCBvcHRpb25zIGZyb20gdGhlIGJhc2UgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLm9taXRPcHRpb25zKSB7XG4gICAgICAgICAgICBzdHJ1Y3Qub21pdCguLi5vcHRpb25zLm9taXRPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjb21wb25lbnQtZGVyaXZlZCBvcHRpb25zIHRvIHRoZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBERUZBVUxUX0NPTVBPTkVOVFM7XG4gICAgICAgIGNvbnN0IHsgUHJpbWl0aXZlVHlwZSB9ID0gcmVxdWlyZShcIkBqc2lpL3NwZWNcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjLmNvbXBvbmVudC5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnQubmFtZS5zbGljZSgxKTtcblxuICAgICAgICAgICAgLyogQWRkIGVuYWJsZWQgZmxhZyBmb3IgdGhlIGNvbXBvbmVudCAqL1xuICAgICAgICAgICAgc3RydWN0LmFkZCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHByaW1pdGl2ZTogUHJpbWl0aXZlVHlwZS5Cb29sZWFuIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgRW5hYmxlICR7Yy5jb21wb25lbnQubmFtZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBBZGQgb3B0aW9ucyBwcm9wZXJ0eSBpZiBjb21wb25lbnQgaXMgY29uZmlndXJhYmxlICovXG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYy5vcHRpb25zUHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyBmcW46IGMub3B0aW9uc1Byb3BlcnR5LnR5cGUgfSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGMub3B0aW9uc1Byb3BlcnR5LmRvY3MgPz8gYCR7Yy5jb21wb25lbnQubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBgLSBkZWZhdWx0ICR7Yy5jb21wb25lbnQubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBZGQgY3VzdG9tIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucykge1xuICAgICAgICAgICAgc3RydWN0LmFkZCguLi5vcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIHByb2plY3QgdG8gVHlwZVNjcmlwdCBwcm9qZWN0IHR5cGVcbiAgICAgKlxuICAgICAqIFByb2plblN0cnVjdCByZXF1aXJlcyBhIFR5cGVTY3JpcHRQcm9qZWN0IGluc3RhbmNlLiBUaGlzIGdlbmVyYXRvciBpcyBvbmx5IHVzZWRcbiAgICAgKiB3aXRoaW4gVHlwZVNjcmlwdCBwcm9qZWN0cywgc28gdGhlIGNhc3QgaXMgc2FmZSBpbiBwcmFjdGljZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFR5cGUgYXNzZXJ0aW9uIGlzIG5lY2Vzc2FyeSBoZXJlIGJlY2F1c2UgUHJvamVuJ3MgdHlwZSBzeXN0ZW0gZG9lc24ndCBwcm92aWRlXG4gICAgICogYSBydW50aW1lIHR5cGUgZ3VhcmQgZm9yIFR5cGVTY3JpcHRQcm9qZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2plY3QgLSBQcm9qZW4gcHJvamVjdCBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIFR5cGVTY3JpcHQgcHJvamVjdCBpbnN0YW5jZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXNUeXBlU2NyaXB0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0KTogdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0IGFzIHVua25vd24gYXMgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBmaWxlIHBhdGggZm9yIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKlxuICAgICAqIFBsYWNlcyB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNsYXNzIGZpbGVcbiAgICAgKiB3aXRoIGEgXCIuZ2VuZXJhdGVkLnRzXCIgc3VmZml4LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEByZXR1cm5zIEZpbGUgcGF0aCBmb3IgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHRocm93cyB7SW52YWxpZEZpbGVQYXRoRXJyb3J9IFdoZW4gZmlsZVBhdGggZG9lc24ndCBjb250YWluIGEgZGlyZWN0b3J5IHNlcGFyYXRvclxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0T3B0aW9uc0ZpbGVQYXRoKG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IHRoaXMub3B0aW9ucy5maWxlUGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICAgIGlmIChsYXN0U2xhc2ggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEZpbGVQYXRoRXJyb3IodGhpcy5vcHRpb25zLmZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpciA9IHRoaXMub3B0aW9ucy5maWxlUGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5yZW5kZXJlci5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHJldHVybiBgJHtkaXJ9LyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWQudHNgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgVHlwZVNjcmlwdCBjbGFzcyBmaWxlIGR1cmluZyBQcm9qZW4gc3ludGhlc2lzXG4gICAgICpcbiAgICAgKiBDYWxsZWQgYnkgUHJvamVuIGR1cmluZyB0aGUgc3ludGhlc2lzIHBoYXNlIHRvIGdlbmVyYXRlIHRoZSBwcm9qZWN0IGNsYXNzIGZpbGUuXG4gICAgICogVGhlIGZpbGUgaXMgbWFya2VkIGFzIHJlYWRvbmx5IHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcuXG4gICAgICovXG4gICAgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgbmV3IFR5cGVTY3JpcHRDbGFzc0ZpbGUodGhpcy5wcm9qZWN0LCB0aGlzLm9wdGlvbnMuZmlsZVBhdGgsIGNvbnRlbnQsIHtcbiAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLm9wdGlvbnMucmVhZG9ubHkgPz8gdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRleHQgZmlsZSBmb3IgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgY2xhc3MgY29kZVxuICpcbiAqIEV4dGVuZHMgUHJvamVuJ3MgVGV4dEZpbGUgdG8gYWRkIHRoZSBnZW5lcmF0ZWQgZmlsZSBtYXJrZXIgY29tbWVudFxuICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzRmlsZSBleHRlbmRzIFRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|
|
794
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBdUM7QUFDdkMseUNBQW1EO0FBRW5ELHNFQUFvRTtBQUVwRSxpQ0FBaUM7QUFDakMscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFJWjs7T0FFRztJQUNILFlBQTZCLFNBQVMsR0FBRztRQUFaLFdBQU0sR0FBTixNQUFNLENBQU07UUFOakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUtvQixDQUFDO0lBRTdDOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksZ0NBQXVCLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCO0lBSXpCOztPQUVHO0lBQ0gsWUFBWSxNQUFNLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCw4REFBOEQ7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxPQUFnQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBCLHlEQUF5RDtRQUN6RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEUsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUVoRSxnRUFBZ0U7UUFDaEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRCwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFMUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUF3QjtRQUN0QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLG9DQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxVQUFVLFNBQVMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsWUFBWSxTQUFTLENBQUM7UUFFNUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLG9DQUEyQixDQUFDLDBDQUEwQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksb0NBQTJCLENBQUMsaURBQWlELFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNLLHVCQUF1QixDQUFDLFVBQXVCO1FBQ25ELE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN6QixzRkFBc0Y7WUFDdEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZCLDREQUE0RDtZQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlELGdGQUFnRjtnQkFDaEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDBEQUEwRDtnQkFDMUQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLGNBQWMsQ0FBQyxPQUFnQyxFQUFFLGdCQUF3QjtRQUM3RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUUvQyx3R0FBd0c7UUFDeEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEUsK0JBQStCO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdDLG9DQUFvQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RSw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhELG1GQUFtRjtRQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssZUFBZSxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxhQUFhLENBQUMsV0FBd0I7UUFDMUMsT0FBTyxrQkFBa0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxhQUFhLENBQUMsT0FBaUM7UUFDbkQsaUZBQWlGO1FBQ2pGLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELCtFQUErRTtZQUMvRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxnQkFBd0I7UUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxnQkFBZ0IsY0FBYyxlQUFlLGNBQWMsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFdBQVcsQ0FDZixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSx3REFBd0QsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLFlBQVksT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLGlCQUFpQixDQUNyQixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsZUFBZSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsa0JBQWtCLENBQUMsZ0JBQXdCO1FBQ3ZDLE1BQU0sT0FBTyxHQUEyQjtZQUNwQyx3QkFBd0IsRUFBRSxvQkFBb0I7WUFDOUMsa0JBQWtCLEVBQUUsY0FBYztZQUNsQyxpQ0FBaUMsRUFBRSwrQkFBK0I7WUFDbEUsb0NBQW9DLEVBQUUsa0NBQWtDO1NBQzNFLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7Q0FDSjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxNQUFNLENBQUMsU0FBUztJQUlsRDs7O09BR0c7SUFDSCxZQUNJLE9BQWdCLEVBQ0MsT0FBZ0M7UUFFakQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRkUsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFHakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFFOUMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUMvQixnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFDLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVsRTs7K0ZBRXVGO1FBQ3ZGLE1BQU0sTUFBTSxHQUFHLElBQUksa0NBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUUsZUFBZTtZQUN6QixpQkFBaUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7U0FDeEMsQ0FBQzthQUNHLEtBQUssQ0FBQyw0QkFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNyQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLHNEQUFzRDtRQUN0RCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVGLHdDQUF3QztZQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNQLElBQUk7Z0JBQ0osSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLElBQUksRUFBRTtvQkFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksWUFBWTtvQkFDcEQsT0FBTyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0osQ0FBQyxDQUFDO1lBRUgsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDO29CQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFDUCxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7NEJBQ3RCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFOzRCQUM5QixRQUFRLEVBQUUsSUFBSTs0QkFDZCxJQUFJLEVBQUU7Z0NBQ0YsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksZ0JBQWdCO2dDQUNyRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksZ0JBQWdCOzZCQUM5RDt5QkFDSixDQUFDLENBQUM7b0JBQ1AsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2Isb0VBQW9FO29CQUNwRSxPQUFPLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ1gsT0FBTyxFQUFFLDBDQUEwQzt3QkFDbkQsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSTt3QkFDaEMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQ2hFLENBQUMsQ0FDTCxDQUFDO2dCQUNOLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssbUJBQW1CLENBQUMsT0FBZ0I7UUFDeEMsT0FBTyxPQUFrRCxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxrQkFBa0IsQ0FBQyxnQkFBd0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLDZCQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sR0FBRyxHQUFHLElBQUksZUFBZSxlQUFlLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYTtRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFO1lBQ2xFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQzFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFXO1FBQzlCLElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7UUFDL0MsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNMLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywyQkFBMkIsQ0FBQyxTQUFvQjtRQUNwRCxtREFBbUQ7UUFDbkQsSUFBSSxhQUEyQyxDQUFDO1FBQ2hELElBQUksT0FBTyxTQUFTLENBQUMsZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELGFBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEQsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLGVBQWUsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEYsYUFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUMsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0QixPQUFPO2dCQUNILElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtnQkFDeEIsR0FBRyxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN2QixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7YUFDM0IsQ0FBQztRQUNOLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksaUNBQXdCLENBQUMsWUFBWSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFJLFNBQW1GO2FBQ25HLFdBQVcsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsQ0FBQyx3Q0FBd0M7UUFDekQsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFFMUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7UUFDbkQsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBSSxXQUEyRCxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7UUFFekYsaURBQWlEO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0UsTUFBTSxZQUFZLEdBQUcsYUFBYSxFQUFFLElBQUksSUFBSSxXQUFXLENBQUM7UUFFeEQsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxhQUFxQjtRQUMxQywyQkFBMkI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsa0NBQWtDLGFBQWEsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYiwwRUFBMEU7WUFDMUUsT0FBTyxDQUFDLElBQUksQ0FDUixJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNYLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNoRSxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ2xELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsT0FBTyxHQUFHLENBQUM7b0JBQ2YsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsOERBQThEO2dCQUM5RCxPQUFPLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ1gsT0FBTyxFQUFFLHNDQUFzQztvQkFDL0MsT0FBTyxFQUFFLEdBQUc7b0JBQ1osS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ2hFLENBQUMsQ0FDTCxDQUFDO1lBQ04sQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLElBQUksaUNBQXdCLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsZUFBdUI7UUFDNUMsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsbUJBQU8sRUFBQyxlQUFlLENBQUMsQ0FBQztRQUU5QyxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUEsbUJBQU8sRUFBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEQsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLFNBQVM7WUFDYixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLHlDQUF5QztnQkFDekMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUM1QixLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFBLG1CQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUVoRCxvQ0FBb0M7b0JBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLFNBQVM7b0JBQ2IsQ0FBQztvQkFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxxQkFBcUI7Z0JBQ3JCLElBQUksVUFBVSxDQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVwRSxxQkFBcUI7UUFDckIsSUFBSSxXQUFXLEtBQUssZ0NBQWdDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLGVBQWUsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUEsbUJBQU8sRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLDBCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyRyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCLENBQUMsV0FBbUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QjtRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLHFGQUFxRixDQUFDLENBQUM7UUFDbEcsS0FBSyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRXhDLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxRQUFRLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFO1lBQ3JELFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSztTQUNSLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQjtRQUN4QixNQUFNLFlBQVksR0FBb0MsRUFBRSxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBRW5DLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUlqQixDQUFDO1lBRUYsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLFNBQVM7WUFDYixDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLFNBQVM7WUFDYixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQUcsU0FBUztpQkFDckIsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7aUJBQzFCLFdBQVcsRUFBRTtpQkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQztZQUVsRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLFNBQXdELEVBQUUsU0FBaUI7UUFDM0YsSUFBSSxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNqQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN6QyxNQUFNO1lBQ1YsQ0FBQztZQUNELFdBQVcsR0FBSSxRQUE4QixDQUFDLElBQUksQ0FBQztRQUN2RCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7QUFsY0wsNENBbWNDOzs7QUFqY2tCLDhCQUFhLEdBQUcsS0FBSyxDQUFDO0FBbWN6Qzs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgKiBhcyBwcm9qZW4gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/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
|