ts2famix 2.0.3 → 2.1.0-beta.2
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/.eslintrc.json +24 -24
- package/.vscode/settings.json +4 -0
- package/LICENSE +24 -24
- package/README.md +78 -78
- package/TODO +1 -0
- package/arwea-fix.json +1 -0
- package/bogus.ts +3 -0
- package/class-diagram.puml +792 -0
- package/debug.txt +13332 -0
- package/debuglog.txt +12073 -0
- package/dist/analyze.js +19 -9
- package/dist/analyze_functions/process_functions.js +101 -71
- package/dist/famix2puml.js +126 -0
- package/dist/famix_functions/EntityDictionary.js +881 -509
- package/dist/famix_functions/helpers_creation.js +18 -8
- package/dist/fqn.js +44 -11
- package/dist/getClasses-arrow-body.js +43 -0
- package/dist/lib/famix/famix_JSON_exporter.js +1 -1
- package/dist/lib/famix/famix_base_element.js +1 -1
- package/dist/lib/famix/famix_repository.js +67 -2
- package/dist/lib/famix/index.js +18 -8
- package/dist/lib/famix/model/famix/access.js +1 -1
- package/dist/lib/famix/model/famix/accessor.js +1 -1
- package/dist/lib/famix/model/famix/alias.js +1 -1
- package/dist/lib/famix/model/famix/arrow_function.js +1 -1
- package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
- package/dist/lib/famix/model/famix/class.js +1 -1
- package/dist/lib/famix/model/famix/comment.js +1 -1
- package/dist/lib/famix/model/famix/concretisation.js +1 -1
- package/dist/lib/famix/model/famix/container_entity.js +1 -1
- package/dist/lib/famix/model/famix/decorator.js +1 -1
- package/dist/lib/famix/model/famix/entity.js +1 -1
- package/dist/lib/famix/model/famix/enum.js +1 -1
- package/dist/lib/famix/model/famix/enum_value.js +1 -1
- package/dist/lib/famix/model/famix/function.js +1 -1
- package/dist/lib/famix/model/famix/import_clause.js +1 -1
- package/dist/lib/famix/model/famix/index.js +1 -1
- package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
- package/dist/lib/famix/model/famix/inheritance.js +1 -1
- package/dist/lib/famix/model/famix/interface.js +1 -1
- package/dist/lib/famix/model/famix/invocation.js +1 -1
- package/dist/lib/famix/model/famix/method.js +1 -1
- package/dist/lib/famix/model/famix/module.js +1 -1
- package/dist/lib/famix/model/famix/named_entity.js +1 -1
- package/dist/lib/famix/model/famix/parameter.js +1 -1
- package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
- package/dist/lib/famix/model/famix/parameter_type.js +1 -1
- package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
- package/dist/lib/famix/model/famix/parametric_class.js +1 -1
- package/dist/lib/famix/model/famix/parametric_function.js +1 -1
- package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
- package/dist/lib/famix/model/famix/parametric_method.js +1 -1
- package/dist/lib/famix/model/famix/primitive_type.js +1 -1
- package/dist/lib/famix/model/famix/property.js +1 -1
- package/dist/lib/famix/model/famix/reference.js +1 -1
- package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
- package/dist/lib/famix/model/famix/script_entity.js +1 -1
- package/dist/lib/famix/model/famix/source_anchor.js +1 -1
- package/dist/lib/famix/model/famix/source_language.js +1 -1
- package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
- package/dist/lib/famix/model/famix/structural_entity.js +1 -1
- package/dist/lib/famix/model/famix/type.js +1 -1
- package/dist/lib/famix/model/famix/variable.js +1 -1
- package/dist/lib/famix/src/famix_JSON_exporter.js +55 -0
- package/dist/lib/famix/src/famix_base_element.js +18 -0
- package/dist/lib/famix/src/famix_repository.js +224 -0
- package/dist/lib/famix/src/index.js +31 -0
- package/dist/lib/famix/src/model/famix/access.js +40 -0
- package/dist/lib/famix/src/model/famix/accessor.js +17 -0
- package/dist/lib/famix/src/model/famix/alias.js +33 -0
- package/dist/lib/famix/src/model/famix/arrowFunction.js +17 -0
- package/dist/lib/famix/src/model/famix/arrow_function.js +17 -0
- package/dist/lib/famix/src/model/famix/behavioral_entity.js +79 -0
- package/dist/lib/famix/src/model/famix/class.js +71 -0
- package/dist/lib/famix/src/model/famix/comment.js +39 -0
- package/dist/lib/famix/src/model/famix/concretisation.js +31 -0
- package/dist/lib/famix/src/model/famix/container_entity.js +126 -0
- package/dist/lib/famix/src/model/famix/decorator.js +32 -0
- package/dist/lib/famix/src/model/famix/entity.js +17 -0
- package/dist/lib/famix/src/model/famix/enum.js +31 -0
- package/dist/lib/famix/src/model/famix/enum_value.js +25 -0
- package/dist/lib/famix/src/model/famix/function.js +17 -0
- package/dist/lib/famix/src/model/famix/implicit_variable.js +17 -0
- package/dist/lib/famix/src/model/famix/import_clause.js +41 -0
- package/dist/lib/famix/src/model/famix/index.js +86 -0
- package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +38 -0
- package/dist/lib/famix/src/model/famix/inheritance.js +33 -0
- package/dist/lib/famix/src/model/famix/interface.js +64 -0
- package/dist/lib/famix/src/model/famix/invocation.js +54 -0
- package/dist/lib/famix/src/model/famix/method.js +67 -0
- package/dist/lib/famix/src/model/famix/module.js +60 -0
- package/dist/lib/famix/src/model/famix/named_entity.js +78 -0
- package/dist/lib/famix/src/model/famix/parameter.js +25 -0
- package/dist/lib/famix/src/model/famix/parameterConcretisation.js +44 -0
- package/dist/lib/famix/src/model/famix/parameter_concretisation.js +44 -0
- package/dist/lib/famix/src/model/famix/parameter_type.js +45 -0
- package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +29 -0
- package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +31 -0
- package/dist/lib/famix/src/model/famix/parametric_class.js +44 -0
- package/dist/lib/famix/src/model/famix/parametric_function.js +31 -0
- package/dist/lib/famix/src/model/famix/parametric_interface.js +44 -0
- package/dist/lib/famix/src/model/famix/parametric_method.js +31 -0
- package/dist/lib/famix/src/model/famix/primitive_type.js +17 -0
- package/dist/lib/famix/src/model/famix/property.js +73 -0
- package/dist/lib/famix/src/model/famix/reference.js +33 -0
- package/dist/lib/famix/src/model/famix/scoping_entity.js +36 -0
- package/dist/lib/famix/src/model/famix/script_entity.js +29 -0
- package/dist/lib/famix/src/model/famix/source_anchor.js +27 -0
- package/dist/lib/famix/src/model/famix/source_language.js +35 -0
- package/dist/lib/famix/src/model/famix/sourced_entity.js +60 -0
- package/dist/lib/famix/src/model/famix/structural_entity.js +39 -0
- package/dist/lib/famix/src/model/famix/text_anchor.js +38 -0
- package/dist/lib/famix/src/model/famix/type.js +73 -0
- package/dist/lib/famix/src/model/famix/variable.js +24 -0
- package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
- package/dist/refactorer/refactor-getter-setter.js +18 -8
- package/dist/ts2famix-cli-wrapper.js +18 -8
- package/dist/ts2famix-cli.js +18 -8
- package/dist/ts2famix-tsconfig.js +18 -8
- package/doc-uml/famix-typescript-model.puml +607 -607
- package/eslint.config.mjs +28 -0
- package/fqn-model.json +1 -0
- package/iterateGenericTypes.ts +69 -0
- package/out/class-diagram/class-diagram.svg +1 -0
- package/package.json +70 -66
- package/sample.json +1 -0
- package/sample.ts +1 -0
- package/src/analyze.ts +120 -120
- package/src/analyze_functions/process_functions.ts +1040 -1019
- package/src/famix_functions/EntityDictionary.ts +2016 -1593
- package/src/famix_functions/helpers_creation.ts +135 -135
- package/src/fqn.ts +50 -16
- package/src/generate_uml.sh +20 -20
- package/src/lib/famix/License.md +22 -22
- package/src/lib/famix/famix_JSON_exporter.ts +56 -56
- package/src/lib/famix/famix_base_element.ts +22 -22
- package/src/lib/famix/famix_repository.ts +278 -243
- package/src/lib/famix/index.ts +8 -8
- package/src/lib/famix/model/famix/access.ts +50 -50
- package/src/lib/famix/model/famix/accessor.ts +15 -15
- package/src/lib/famix/model/famix/alias.ts +39 -39
- package/src/lib/famix/model/famix/arrow_function.ts +15 -15
- package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
- package/src/lib/famix/model/famix/class.ts +85 -85
- package/src/lib/famix/model/famix/comment.ts +47 -47
- package/src/lib/famix/model/famix/concretisation.ts +40 -40
- package/src/lib/famix/model/famix/container_entity.ts +160 -160
- package/src/lib/famix/model/famix/decorator.ts +37 -37
- package/src/lib/famix/model/famix/entity.ts +15 -15
- package/src/lib/famix/model/famix/enum.ts +30 -30
- package/src/lib/famix/model/famix/enum_value.ts +28 -28
- package/src/lib/famix/model/famix/function.ts +15 -15
- package/src/lib/famix/model/famix/import_clause.ts +51 -51
- package/src/lib/famix/model/famix/index.ts +41 -41
- package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
- package/src/lib/famix/model/famix/inheritance.ts +40 -40
- package/src/lib/famix/model/famix/interface.ts +75 -75
- package/src/lib/famix/model/famix/invocation.ts +65 -65
- package/src/lib/famix/model/famix/method.ts +89 -89
- package/src/lib/famix/model/famix/module.ts +71 -71
- package/src/lib/famix/model/famix/named_entity.ts +95 -95
- package/src/lib/famix/model/famix/parameter.ts +28 -28
- package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
- package/src/lib/famix/model/famix/parameter_type.ts +58 -58
- package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
- package/src/lib/famix/model/famix/parametric_class.ts +49 -49
- package/src/lib/famix/model/famix/parametric_function.ts +32 -32
- package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
- package/src/lib/famix/model/famix/parametric_method.ts +32 -32
- package/src/lib/famix/model/famix/primitive_type.ts +15 -15
- package/src/lib/famix/model/famix/property.ts +94 -94
- package/src/lib/famix/model/famix/reference.ts +40 -40
- package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
- package/src/lib/famix/model/famix/script_entity.ts +34 -34
- package/src/lib/famix/model/famix/source_anchor.ts +30 -30
- package/src/lib/famix/model/famix/source_language.ts +35 -35
- package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
- package/src/lib/famix/model/famix/structural_entity.ts +43 -43
- package/src/lib/famix/model/famix/type.ts +87 -87
- package/src/lib/famix/model/famix/variable.ts +27 -27
- package/src/lib/famix/package.json +28 -28
- package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
- package/src/refactorer/refactor-getter-setter.ts +140 -140
- package/src/ts2famix-cli-wrapper.ts +21 -21
- package/src/ts2famix-cli.ts +60 -60
- package/stats.txt +3091 -0
- package/tabby-debug-output.txt +19433 -0
- package/ts2famix.log +22656 -0
- package/tsconfig.check-tests.json +14 -14
- package/tsconfig.json +72 -72
- package/validate-references.js +103 -0
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.currentCC = exports.listOfExportMaps = exports.modules = exports.interfaces = exports.classes = exports.accessMap = exports.methodsAndFunctionsWithId = void 0;
|
|
27
37
|
exports.getModulePath = getModulePath;
|
|
@@ -34,7 +44,6 @@ exports.processImportClausesForImportEqualsDeclarations = processImportClausesFo
|
|
|
34
44
|
exports.processImportClausesForModules = processImportClausesForModules;
|
|
35
45
|
exports.processInheritances = processInheritances;
|
|
36
46
|
exports.processInvocations = processInvocations;
|
|
37
|
-
exports.processConcretisations = processConcretisations;
|
|
38
47
|
const ts_morph_1 = require("ts-morph");
|
|
39
48
|
const Famix = __importStar(require("../lib/famix/model/famix"));
|
|
40
49
|
const cyclomatic_service_1 = require("../lib/ts-complex/cyclomatic-service");
|
|
@@ -407,7 +416,7 @@ function processFunction(f) {
|
|
|
407
416
|
analyze_1.logger.debug(`Function: ${(f instanceof ts_morph_1.ArrowFunction ? "anonymous" : f.getName() ? f.getName() : "anonymous")}, (${f.getType().getText()}), fqn = ${(0, fqn_1.getFQN)(f)}`);
|
|
408
417
|
let fmxFunction;
|
|
409
418
|
if (f instanceof ts_morph_1.ArrowFunction) {
|
|
410
|
-
fmxFunction = analyze_1.entityDictionary.
|
|
419
|
+
fmxFunction = analyze_1.entityDictionary.createOrGetFamixArrowFunction(f, exports.currentCC);
|
|
411
420
|
}
|
|
412
421
|
else {
|
|
413
422
|
fmxFunction = analyze_1.entityDictionary.createOrGetFamixFunction(f, exports.currentCC);
|
|
@@ -521,7 +530,7 @@ function convertParameterToPropertyRepresentation(param) {
|
|
|
521
530
|
* @returns A Famix.Parameter representing the parameter
|
|
522
531
|
*/
|
|
523
532
|
function processParameter(paramDecl) {
|
|
524
|
-
const fmxParam = analyze_1.entityDictionary.
|
|
533
|
+
const fmxParam = analyze_1.entityDictionary.createOrGetFamixParameter(paramDecl); // create or GET
|
|
525
534
|
analyze_1.logger.debug(`parameter: ${paramDecl.getName()}, (${paramDecl.getType().getText()}), fqn = ${fmxParam.fullyQualifiedName}`);
|
|
526
535
|
processComments(paramDecl, fmxParam);
|
|
527
536
|
processDecorators(paramDecl, fmxParam);
|
|
@@ -576,7 +585,7 @@ function processVariableStatement(v) {
|
|
|
576
585
|
* @returns A Famix.Variable representing the variable
|
|
577
586
|
*/
|
|
578
587
|
function processVariable(v) {
|
|
579
|
-
const fmxVar = analyze_1.entityDictionary.
|
|
588
|
+
const fmxVar = analyze_1.entityDictionary.createOrGetFamixVariable(v);
|
|
580
589
|
analyze_1.logger.debug(`variable: ${v.getName()}, (${v.getType().getText()}), ${v.getInitializer() ? "initializer: " + v.getInitializer().getText() : "initializer: "}, fqn = ${fmxVar.fullyQualifiedName}`);
|
|
581
590
|
processComments(v, fmxVar);
|
|
582
591
|
analyze_1.logger.debug(`adding access: ${v.getName()}, (${v.getType().getText()}) Famix ${fmxVar.name}`);
|
|
@@ -589,7 +598,7 @@ function processVariable(v) {
|
|
|
589
598
|
* @returns A Famix.Enum representing the enum
|
|
590
599
|
*/
|
|
591
600
|
function processEnum(e) {
|
|
592
|
-
const fmxEnum = analyze_1.entityDictionary.
|
|
601
|
+
const fmxEnum = analyze_1.entityDictionary.createOrGetFamixEnum(e);
|
|
593
602
|
analyze_1.logger.debug(`enum: ${e.getName()}, (${e.getType().getText()}), fqn = ${fmxEnum.fullyQualifiedName}`);
|
|
594
603
|
processComments(e, fmxEnum);
|
|
595
604
|
e.getMembers().forEach(m => {
|
|
@@ -716,12 +725,14 @@ function processImportClausesForImportEqualsDeclarations(sourceFiles, exports) {
|
|
|
716
725
|
// const importedEntity = node.getName();
|
|
717
726
|
// create a famix import clause
|
|
718
727
|
const namedImport = node.getNameNode();
|
|
719
|
-
analyze_1.entityDictionary.
|
|
728
|
+
analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
|
|
729
|
+
importDeclaration: node,
|
|
720
730
|
importerSourceFile: sourceFile,
|
|
721
731
|
moduleSpecifierFilePath: node.getModuleReference().getText(),
|
|
722
732
|
importElement: namedImport,
|
|
723
733
|
isInExports: exports.find(e => e.has(namedImport.getText())) !== undefined,
|
|
724
|
-
isDefaultExport: false
|
|
734
|
+
isDefaultExport: false
|
|
735
|
+
});
|
|
725
736
|
// entityDictionary.createFamixImportClause(importedEntity, importingEntity);
|
|
726
737
|
}
|
|
727
738
|
});
|
|
@@ -735,41 +746,47 @@ function processImportClausesForImportEqualsDeclarations(sourceFiles, exports) {
|
|
|
735
746
|
function processImportClausesForModules(modules, exports) {
|
|
736
747
|
analyze_1.logger.info(`Creating import clauses from ${modules.length} modules:`);
|
|
737
748
|
modules.forEach(module => {
|
|
738
|
-
const modulePath = module.getFilePath() + module.getBaseName();
|
|
749
|
+
const modulePath = module.getFilePath(); // + module.getBaseName();
|
|
739
750
|
module.getImportDeclarations().forEach(impDecl => {
|
|
740
751
|
analyze_1.logger.info(`Importing ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
|
|
741
752
|
const path = getModulePath(impDecl);
|
|
742
753
|
impDecl.getNamedImports().forEach(namedImport => {
|
|
743
754
|
analyze_1.logger.info(`Importing (named) ${namedImport.getName()} from ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
|
|
744
755
|
const importedEntityName = namedImport.getName();
|
|
745
|
-
|
|
746
|
-
analyze_1.entityDictionary.
|
|
756
|
+
const importFoundInExports = isInExports(exports, importedEntityName);
|
|
757
|
+
analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
|
|
758
|
+
importDeclaration: impDecl,
|
|
747
759
|
importerSourceFile: module,
|
|
748
760
|
moduleSpecifierFilePath: path,
|
|
749
761
|
importElement: namedImport,
|
|
750
762
|
isInExports: importFoundInExports,
|
|
751
|
-
isDefaultExport: false
|
|
763
|
+
isDefaultExport: false
|
|
764
|
+
});
|
|
752
765
|
});
|
|
753
766
|
const defaultImport = impDecl.getDefaultImport();
|
|
754
767
|
if (defaultImport !== undefined) {
|
|
755
768
|
analyze_1.logger.info(`Importing (default) ${defaultImport.getText()} from ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
|
|
756
769
|
// call with module, impDecl.getModuleSpecifierValue(), path, defaultImport, false, true
|
|
757
|
-
analyze_1.entityDictionary.
|
|
770
|
+
analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
|
|
771
|
+
importDeclaration: impDecl,
|
|
758
772
|
importerSourceFile: module,
|
|
759
773
|
moduleSpecifierFilePath: path,
|
|
760
774
|
importElement: defaultImport,
|
|
761
775
|
isInExports: false,
|
|
762
|
-
isDefaultExport: true
|
|
776
|
+
isDefaultExport: true
|
|
777
|
+
});
|
|
763
778
|
}
|
|
764
779
|
const namespaceImport = impDecl.getNamespaceImport();
|
|
765
780
|
if (namespaceImport !== undefined) {
|
|
766
781
|
analyze_1.logger.info(`Importing (namespace) ${namespaceImport.getText()} from ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
|
|
767
|
-
analyze_1.entityDictionary.
|
|
782
|
+
analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
|
|
783
|
+
importDeclaration: impDecl,
|
|
768
784
|
importerSourceFile: module,
|
|
769
785
|
moduleSpecifierFilePath: path,
|
|
770
786
|
importElement: namespaceImport,
|
|
771
787
|
isInExports: false,
|
|
772
|
-
isDefaultExport: false
|
|
788
|
+
isDefaultExport: false
|
|
789
|
+
});
|
|
773
790
|
// entityDictionary.createFamixImportClause(module, impDecl.getModuleSpecifierValue(), path, namespaceImport, false, false);
|
|
774
791
|
}
|
|
775
792
|
});
|
|
@@ -793,25 +810,35 @@ function processInheritances(classes, interfaces) {
|
|
|
793
810
|
analyze_1.logger.info(`processInheritances: Creating inheritances:`);
|
|
794
811
|
classes.forEach(cls => {
|
|
795
812
|
analyze_1.logger.debug(`processInheritances: Checking class inheritance for ${cls.getName()}`);
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
813
|
+
try {
|
|
814
|
+
const extClass = cls.getBaseClass();
|
|
815
|
+
if (extClass !== undefined) {
|
|
816
|
+
analyze_1.entityDictionary.createOrGetFamixInheritance(cls, extClass);
|
|
817
|
+
analyze_1.logger.debug(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), extClass: ${extClass.getName()}, (${extClass.getType().getText()})`);
|
|
818
|
+
}
|
|
819
|
+
analyze_1.logger.debug(`processInheritances: Checking interface inheritance for ${cls.getName()}`);
|
|
820
|
+
const implementedInterfaces = getImplementedOrExtendedInterfaces(interfaces, cls);
|
|
821
|
+
implementedInterfaces.forEach(impInter => {
|
|
822
|
+
analyze_1.entityDictionary.createOrGetFamixInheritance(cls, impInter);
|
|
823
|
+
analyze_1.logger.debug(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), impInter: ${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getName() : impInter.getExpression().getText()}, (${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getType().getText() : impInter.getExpression().getText()})`);
|
|
824
|
+
});
|
|
825
|
+
}
|
|
826
|
+
catch (error) {
|
|
827
|
+
analyze_1.logger.error(`> WARNING: got exception ${error}. Continuing...`);
|
|
800
828
|
}
|
|
801
|
-
analyze_1.logger.debug(`processInheritances: Checking interface inheritance for ${cls.getName()}`);
|
|
802
|
-
const implementedInterfaces = getImplementedOrExtendedInterfaces(interfaces, cls);
|
|
803
|
-
implementedInterfaces.forEach(impInter => {
|
|
804
|
-
analyze_1.entityDictionary.createFamixInheritance(cls, impInter);
|
|
805
|
-
analyze_1.logger.debug(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), impInter: ${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getName() : impInter.getExpression().getText()}, (${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getType().getText() : impInter.getExpression().getText()})`);
|
|
806
|
-
});
|
|
807
829
|
});
|
|
808
830
|
interfaces.forEach(inter => {
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
831
|
+
try {
|
|
832
|
+
analyze_1.logger.debug(`processInheritances: Checking interface inheritance for ${inter.getName()}`);
|
|
833
|
+
const extendedInterfaces = getImplementedOrExtendedInterfaces(interfaces, inter);
|
|
834
|
+
extendedInterfaces.forEach(extInter => {
|
|
835
|
+
analyze_1.entityDictionary.createOrGetFamixInheritance(inter, extInter);
|
|
836
|
+
analyze_1.logger.debug(`processInheritances: inter: ${inter.getName()}, (${inter.getType().getText()}), extInter: ${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getName() : extInter.getExpression().getText()}, (${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getType().getText() : extInter.getExpression().getText()})`);
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
catch (error) {
|
|
840
|
+
analyze_1.logger.error(`> WARNING: got exception ${error}. Continuing...`);
|
|
841
|
+
}
|
|
815
842
|
});
|
|
816
843
|
}
|
|
817
844
|
/**
|
|
@@ -820,32 +847,35 @@ function processInheritances(classes, interfaces) {
|
|
|
820
847
|
*/
|
|
821
848
|
function processInvocations(methodsAndFunctionsWithId) {
|
|
822
849
|
analyze_1.logger.info(`Creating invocations:`);
|
|
823
|
-
methodsAndFunctionsWithId.forEach((
|
|
824
|
-
if (!(
|
|
825
|
-
analyze_1.logger.debug(`Invocations to ${(
|
|
850
|
+
methodsAndFunctionsWithId.forEach((invocable, id) => {
|
|
851
|
+
if (!(invocable instanceof ts_morph_1.ArrowFunction)) { // ArrowFunctions are not directly invoked
|
|
852
|
+
analyze_1.logger.debug(`Invocations to ${(invocable instanceof ts_morph_1.MethodDeclaration || invocable instanceof ts_morph_1.GetAccessorDeclaration || invocable instanceof ts_morph_1.SetAccessorDeclaration || invocable instanceof ts_morph_1.FunctionDeclaration) ? invocable.getName() : ((invocable instanceof ts_morph_1.ConstructorDeclaration) ? 'constructor' : (invocable.getName() ? invocable.getName() : 'anonymous'))} (${invocable.getType().getText()})`);
|
|
826
853
|
try {
|
|
827
|
-
const
|
|
828
|
-
|
|
854
|
+
const nodesReferencingInvocable = invocable.findReferencesAsNodes();
|
|
855
|
+
nodesReferencingInvocable.forEach(nodeReferencingInvocable => processNodeForInvocations(nodeReferencingInvocable, invocable, id));
|
|
829
856
|
}
|
|
830
857
|
catch (error) {
|
|
831
858
|
analyze_1.logger.error(`> WARNING: got exception ${error}. Continuing...`);
|
|
832
859
|
}
|
|
833
860
|
}
|
|
861
|
+
else {
|
|
862
|
+
analyze_1.logger.debug(`Skipping invocation to ArrowFunction: ${(invocable.getBodyText())}`);
|
|
863
|
+
}
|
|
834
864
|
});
|
|
835
865
|
}
|
|
836
866
|
/**
|
|
837
867
|
* Builds a Famix model for an invocation of a method or a function
|
|
838
|
-
* @param
|
|
839
|
-
* @param
|
|
868
|
+
* @param nodeReferencingInvocable A node
|
|
869
|
+
* @param invocable A method or a function
|
|
840
870
|
* @param id The id of the method or the function
|
|
841
871
|
*/
|
|
842
|
-
function processNodeForInvocations(
|
|
872
|
+
function processNodeForInvocations(nodeReferencingInvocable, invocable, id) {
|
|
843
873
|
try {
|
|
844
|
-
analyze_1.entityDictionary.createFamixInvocation(
|
|
845
|
-
analyze_1.logger.debug(`node:
|
|
874
|
+
analyze_1.entityDictionary.createFamixInvocation(nodeReferencingInvocable, invocable, id);
|
|
875
|
+
analyze_1.logger.debug(`node: ${nodeReferencingInvocable.getKindName()}, (${nodeReferencingInvocable.getType().getText()})`);
|
|
846
876
|
}
|
|
847
877
|
catch (error) {
|
|
848
|
-
analyze_1.logger.error(`> WARNING: got exception ${error}. ScopeDeclaration invalid for ${
|
|
878
|
+
analyze_1.logger.error(`> WARNING: got exception ${error}. ScopeDeclaration invalid for ${nodeReferencingInvocable.getSymbol().getFullyQualifiedName()}. Continuing...`);
|
|
849
879
|
}
|
|
850
880
|
}
|
|
851
881
|
/**
|
|
@@ -853,25 +883,25 @@ function processNodeForInvocations(n, m, id) {
|
|
|
853
883
|
* @param classes An array of classes
|
|
854
884
|
* @param interfaces An array of interfaces
|
|
855
885
|
*/
|
|
856
|
-
function processConcretisations(classes, interfaces, functions) {
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
}
|
|
877
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc19mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZV9mdW5jdGlvbnMvcHJvY2Vzc19mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0Esc0NBY0M7QUFRRCxnRkFzQkM7QUFNRCxvQ0FZQztBQXFDRCw4QkFHQztBQUVELGtDQUlDO0FBOG9CRCwwQ0FXQztBQTRCRCwwR0F1QkM7QUFPRCx3RUE2Q0M7QUFpQkQsa0RBNkJDO0FBTUQsZ0RBYUM7QUF1QkQsd0RBcUJDO0FBMS9CRCx1Q0FBb2xCO0FBQ3BsQixnRUFBa0Q7QUFDbEQsNkVBQWlFO0FBQ2pFLHVDQUF5QjtBQUN6Qix3Q0FBdUQ7QUFDdkQsZ0NBQWdDO0FBS25CLFFBQUEseUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQW1LLENBQUMsQ0FBQywrSUFBK0k7QUFFdlYsUUFBQSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXFDLENBQUMsQ0FBQyx3SUFBd0k7QUFDbE0sUUFBQSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUMsQ0FBQywrQ0FBK0M7QUFDeEYsUUFBQSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQXdCLENBQUMsQ0FBQyxrREFBa0Q7QUFDbEcsUUFBQSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQyxDQUFDLGtEQUFrRDtBQUNyRixRQUFBLGdCQUFnQixHQUFHLElBQUksS0FBSyxFQUErQyxDQUFDLENBQUMsK0JBQStCO0FBR3pIOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQXNCO0lBQy9DLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsYUFBYSxD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QkFBZ0IsQ0FBQyx1REFBdUQsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RSwwQkFBZ0IsQ0FBQyw2Q0FBNkMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSwwQkFBZ0IsQ0FBQyx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCwwQkFBZ0IsQ0FBQywwQ0FBMEMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVyRSxDQUFDLENBQUMsQ0FBQztJQUNILFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdkIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsaUVBQWlFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakcsMEJBQWdCLENBQUMsMENBQTBDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsMEJBQWdCLENBQUMsdURBQXVELENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JCLElBQUcsSUFBSSxZQUFZLDhCQUFtQixJQUFJLElBQUksWUFBWSw0QkFBaUIsRUFBRSxDQUFDO1lBQzFFLGdCQUFNLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDdkUsMEJBQWdCLENBQUMsOENBQThDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBWYXJpYWJsZVN0YXRlbWVudCwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFNvdXJjZUZpbGUsIE1vZHVsZURlY2xhcmF0aW9uLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgRGVjb3JhdG9yLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBFeHBvcnRlZERlY2xhcmF0aW9ucywgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiwgQmxvY2ssIElkZW50aWZpZXIsIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSW1wb3J0RGVjbGFyYXRpb24sIE5vZGUsIEFycm93RnVuY3Rpb24sIFNjb3BlLCBDbGFzc0V4cHJlc3Npb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcbmltcG9ydCAqIGFzIEZhbWl4IGZyb20gXCIuLi9saWIvZmFtaXgvbW9kZWwvZmFtaXhcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZSB9IGZyb20gXCIuLi9saWIvdHMtY29tcGxleC9jeWNsb21hdGljLXNlcnZpY2VcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGxvZ2dlciAsIGVudGl0eURpY3Rpb25hcnkgfSBmcm9tIFwiLi4vYW5hbHl6ZVwiO1xuaW1wb3J0IHsgZ2V0RlFOIH0gZnJvbSBcIi4uL2ZxblwiO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlVFNNb3JwaEVsZW1lbnQgPSBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgRW51bU1lbWJlcjtcbmV4cG9ydCB0eXBlIEZhbWl4SUQgPSBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkID0gbmV3IE1hcDxudW1iZXIsIE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24+KCk7IC8vIE1hcHMgdGhlIEZhbWl4IG1ldGhvZCwgY29uc3RydWN0b3IsIGdldHRlciwgc2V0dGVyIGFuZCBmdW5jdGlvbiBpZHMgdG8gdGhlaXIgdHMtbW9ycGggbWV0aG9kLCBjb25zdHJ1Y3RvciwgZ2V0dGVyLCBzZXR0ZXIgb3IgZnVuY3Rpb24gb2JqZWN0XG5cbmV4cG9ydCBjb25zdCBhY2Nlc3NNYXAgPSBuZXcgTWFwPEZhbWl4SUQsIEFjY2Vzc2libGVUU01vcnBoRWxlbWVudD4oKTsgLy8gTWFwcyB0aGUgRmFtaXggcGFyYW1ldGVyLCB2YXJpYWJsZSwgcHJvcGVydHkgYW5kIGVudW0gdmFsdWUgaWRzIHRvIHRoZWlyIHRzLW1vcnBoIHBhcmFtZXRlciwgdmFyaWFibGUsIHByb3BlcnR5IG9yIGVudW0gbWVtYmVyIG9iamVjdFxuZXhwb3J0IGNvbnN0IGNsYXNzZXMgPSBuZXcgQXJyYXk8Q2xhc3NEZWNsYXJhdGlvbj4oKTsgLy8gQXJyYXkgb2YgYWxsIHRoZSBjbGFzc2VzIG9mIHRoZSBzb3VyY2UgZmlsZXNcbmV4cG9ydCBjb25zdCBpbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuZXhwb3J0IGNvbnN0IG1vZHVsZXMgPSBuZXcgQXJyYXk8U291cmNlRmlsZT4oKTsgLy8gQXJyYXkgb2YgYWxsIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG1vZHVsZXNcbmV4cG9ydCBjb25zdCBsaXN0T2ZFeHBvcnRNYXBzID0gbmV3IEFycmF5PFJlYWRvbmx5TWFwPHN0cmluZywgRXhwb3J0ZWREZWNsYXJhdGlvbnNbXT4+KCk7IC8vIEFycmF5IG9mIGFsbCB0aGUgZXhwb3J0IG1hcHNcbmV4cG9ydCBsZXQgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvLyBTdG9yZXMgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIGZvciB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZmlsZSBoYXMgYW55IGltcG9ydHMgb3IgZXhwb3J0cyB0byBiZSBjb25zaWRlcmVkIGEgbW9kdWxlXG4gKiBAcGFyYW0gc291cmNlRmlsZSBBIHNvdXJjZSBmaWxlXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZmlsZSBpcyBhIG1vZHVsZVxuICovXG5mdW5jdGlvbiBpc1NvdXJjZUZpbGVBTW9kdWxlKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc291cmNlRmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKS5sZW5ndGggPiAwIHx8IHNvdXJjZUZpbGUuZ2V0RXhwb3J0ZWREZWNsYXJhdGlvbnMoKS5zaXplID4gMDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXRoIG9mIGEgbW9kdWxlIHRvIGJlIGltcG9ydGVkXG4gKiBAcGFyYW0gaW1wb3J0RGVjbCBBbiBpbXBvcnQgZGVjbGFyYXRpb25cbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBtb2R1bGUgdG8gYmUgaW1wb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZVBhdGgoaW1wb3J0RGVjbDogSW1wb3J0RGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICAgIGxldCBwYXRoOiBzdHJpbmc7XG4gICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKS5zdWJzdHJpbmcoaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLmxlbmd0aCAtIDMpID09PSBcIi50c1wiKSB7XG4gICAgICAgICAgICBwYXRoID0gaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArIFwiLnRzXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKSEuZ2V0RmlsZVBhdGgoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBhIGNsYXNzIG9yIGFuIGludGVyZmFjZVxuICogQHBhcmFtIGludGVyZmFjZXMgQW4gYXJyYXkgb2YgaW50ZXJmYWNlc1xuICogQHBhcmFtIHN1YkNsYXNzIEEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiBhbmQgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgdGhlIHN1YkNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzKGludGVyZmFjZXM6IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uPiwgc3ViQ2xhc3M6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbik6IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPiB7XG4gICAgbGV0IGltcE9yRXh0SW50ZXJmYWNlczogQXJyYXk8RXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPjtcbiAgICBpZiAoc3ViQ2xhc3MgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgIGltcE9yRXh0SW50ZXJmYWNlcyA9IHN1YkNsYXNzLmdldEltcGxlbWVudHMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGltcE9yRXh0SW50ZXJmYWNlcyA9IHN1YkNsYXNzLmdldEV4dGVuZHMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmZhY2VzTmFtZXMgPSBpbnRlcmZhY2VzLm1hcChpID0+IGkuZ2V0TmFtZSgpKTtcbiAgICBjb25zdCBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPigpO1xuXG4gICAgaW1wT3JFeHRJbnRlcmZhY2VzLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGlmIChpbnRlcmZhY2VzTmFtZXMuaW5jbHVkZXMoaS5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpKSkge1xuICAgICAgICAgICAgaW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZXNbaW50ZXJmYWNlc05hbWVzLmluZGV4T2YoaS5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzXG4gKiBAcGFyYW0gc291cmNlRmlsZXMgQW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZXMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+KTogdm9pZCB7XG4gICAgc291cmNlRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYEZpbGU6ID4+Pj4+Pj4+Pj4gJHtmaWxlLmdldEZpbGVQYXRoKCl9YCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZXMgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIGZvciB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBpZiBpdCBleGlzdHMgKGkuZS4gaWYgaXQgaXMgbm90IGZyb20gYSBqZXN0IHRlc3QpXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGUuZ2V0RmlsZVBhdGgoKSkpXG4gICAgICAgICAgICBjdXJyZW50Q0MgPSBjYWxjdWxhdGUoZmlsZS5nZXRGaWxlUGF0aCgpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY3VycmVudENDID0ge307XG5cbiAgICAgICAgcHJvY2Vzc0ZpbGUoZmlsZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgc291cmNlIGZpbGVcbiAqIEBwYXJhbSBmIEEgc291cmNlIGZpbGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoZjogU291cmNlRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTW9kdWxlID0gaXNTb3VyY2VGaWxlQU1vZHVsZShmKTtcblxuICAgIGlmIChpc01vZHVsZSkge1xuICAgICAgICBtb2R1bGVzLnB1c2goZik7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwb3J0TWFwID0gZi5nZXRFeHBvcnRlZERlY2xhcmF0aW9ucygpO1xuICAgIGlmIChleHBvcnRNYXApIGxpc3RPZkV4cG9ydE1hcHMucHVzaChleHBvcnRNYXApO1xuXG4gICAgY29uc3QgZm14RmlsZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEZpbGUoZiwgaXNNb2R1bGUpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzRmlsZTogZmlsZTogJHtmLmdldEJhc2VOYW1lKCl9LCBmcW4gPSAke2ZteEZpbGUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGYsIGZteEZpbGUpO1xuXG4gICAgcHJvY2Vzc0FsaWFzZXMoZiwgZm14RmlsZSk7XG5cbiAgICBwcm9jZXNzQ2xhc3NlcyhmLCBmbXhGaWxlKTtcblxuICAgIHByb2Nlc3NJbnRlcmZhY2VzKGYsIGZteEZpbGUpO1xuXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhmLCBmbXhGaWxlKTtcblxuICAgIHByb2Nlc3NFbnVtcyhmLCBmbXhGaWxlKTtcblxuICAgIHByb2Nlc3NGdW5jdGlvbnMoZiwgZm14RmlsZSk7XG5cbiAgICBwcm9jZXNzTW9kdWxlcyhmLCBmbXhGaWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQW1iaWVudChub2RlOiBNb2R1bGVEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIC8vIEFuIGFtYmllbnQgbW9kdWxlIGhhcyB0aGUgRGVjbGFyZUtleXdvcmQgbW9kaWZpZXIuXG4gICAgcmV0dXJuIChub2RlLmdldE1vZGlmaWVycygpPy5zb21lKG1vZGlmaWVyID0+IG1vZGlmaWVyLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5EZWNsYXJlS2V5d29yZCkpID8/IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lc3BhY2Uobm9kZTogTW9kdWxlRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uIGhhcyBhIG5hbWVzcGFjZSBrZXl3b3JkLlxuICAgIC8vIFRoaXMgYXBwcm9hY2ggdXNlcyB0aGUgZ2V0Q2hpbGRyZW4oKSBtZXRob2QgdG8gaW5zcGVjdCB0aGUgc3ludGF4IGRpcmVjdGx5LlxuICAgIHJldHVybiBub2RlLmdldENoaWxkcmVuT2ZLaW5kKFN5bnRheEtpbmQuTmFtZXNwYWNlS2V5d29yZCkubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBtb2R1bGUgKGFsc28gbmFtZXNwYWNlKVxuICogQHBhcmFtIG0gQSBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIEEgRmFtaXguTW9kdWxlIHJlcHJlc2VudGluZyB0aGUgbW9kdWxlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NNb2R1bGUobTogTW9kdWxlRGVjbGFyYXRpb24pOiBGYW1peC5Nb2R1bGUge1xuICAgIGNvbnN0IGZteE1vZHVsZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1vZHVsZShtKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgbW9kdWxlOiAke20uZ2V0TmFtZSgpfSwgKCR7bS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksICR7Zm14TW9kdWxlLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc0FsaWFzZXMobSwgZm14TW9kdWxlKTtcblxuICAgIHByb2Nlc3NDbGFzc2VzKG0sIGZteE1vZHVsZSk7XG5cbiAgICBwcm9jZXNzSW50ZXJmYWNlcyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc0VudW1zKG0sIGZteE1vZHVsZSk7XG4gICAgXG4gICAgcHJvY2Vzc0Z1bmN0aW9ucyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc01vZHVsZXMobSwgZm14TW9kdWxlKTtcblxuICAgIHJldHVybiBmbXhNb2R1bGU7XG59XG5cbnR5cGUgQ29udGFpbmVyVHlwZXMgPSBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uO1xuXG50eXBlIFNjb3BlZFR5cGVzID0gRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlIHwgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvcjtcblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGFsaWFzZXMgb2YgYSBjb250YWluZXJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlLCBhIG5hbWVzcGFjZSwgYSBmdW5jdGlvbiBvciBhIG1ldGhvZClcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxuICovXG5mdW5jdGlvbiBwcm9jZXNzQWxpYXNlcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQWxpYXNlczogLS0tLS0tLS0tLSBGaW5kaW5nIEFsaWFzZXM6YCk7XG4gICAgbS5nZXRUeXBlQWxpYXNlcygpLmZvckVhY2goYSA9PiB7XG4gICAgICAgIGNvbnN0IGZteEFsaWFzID0gcHJvY2Vzc0FsaWFzKGEpO1xuICAgICAgICBmbXhTY29wZS5hZGRBbGlhcyhmbXhBbGlhcyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBjbGFzc2VzIG9mIGEgY29udGFpbmVyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSBvciBhIG5hbWVzcGFjZSlcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NlcyhtOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGUgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ2xhc3NlczogLS0tLS0tLS0tLSBGaW5kaW5nIENsYXNzZXM6YCk7XG4gICAgY29uc3QgY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnMgPSBnZXRDbGFzc2VzRGVjbGFyZWRJbkFycm93RnVuY3Rpb25zKG0pO1xuICAgIGNvbnN0IGNsYXNzZXMgPSBtLmdldENsYXNzZXMoKS5jb25jYXQoY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnMpO1xuICAgIGNsYXNzZXMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgY29uc3QgZm14Q2xhc3MgPSBwcm9jZXNzQ2xhc3MoYyk7XG4gICAgICAgIGZteFNjb3BlLmFkZFR5cGUoZm14Q2xhc3MpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRBcnJvd0Z1bmN0aW9uQ2xhc3NlcyhmOiBBcnJvd0Z1bmN0aW9uKTogQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgICBjb25zdCBjbGFzc2VzOiBDbGFzc0RlY2xhcmF0aW9uW10gPSBbXTtcblxuICAgIGZ1bmN0aW9uIGZpbmRDbGFzc2VzKG5vZGU6IGFueSkge1xuICAgICAgICBpZiAobm9kZS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKG5vZGUgYXMgQ2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goZmluZENsYXNzZXMpO1xuICAgIH1cblxuICAgIGZpbmRDbGFzc2VzKGYpO1xuICAgIHJldHVybiBjbGFzc2VzO1xufVxuXG4vKipcbiAqIHRzLW1vcnBoIGRvZXNuJ3QgZmluZCBjbGFzc2VzIGluIGFycm93IGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0byBmaW5kIHRoZW0gbWFudWFsbHlcbiAqIEBwYXJhbSBzIEEgc291cmNlIGZpbGUgXG4gKiBAcmV0dXJucyB0aGUgQ2xhc3NEZWNsYXJhdGlvbiBvYmplY3RzIGZvdW5kIGluIGFycm93IGZ1bmN0aW9ucyBvZiB0aGUgc291cmNlIGZpbGVcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xhc3Nlc0RlY2xhcmVkSW5BcnJvd0Z1bmN0aW9ucyhzOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24pOiBDbGFzc0RlY2xhcmF0aW9uW10ge1xuICAgIGNvbnN0IGFycm93RnVuY3Rpb25zID0gcy5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLkFycm93RnVuY3Rpb24pO1xuICAgIGNvbnN0IGNsYXNzZXNJbkFycm93RnVuY3Rpb25zID0gYXJyb3dGdW5jdGlvbnMubWFwKGYgPT4gZ2V0QXJyb3dGdW5jdGlvbkNsYXNzZXMoZikpLmZsYXQoKTtcbiAgICByZXR1cm4gY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbnRlcmZhY2VzIG9mIGEgY29udGFpbmVyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSBvciBhIG5hbWVzcGFjZSlcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxuICovXG5mdW5jdGlvbiBwcm9jZXNzSW50ZXJmYWNlcyhtOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGUgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW50ZXJmYWNlczogLS0tLS0tLS0tLSBGaW5kaW5nIEludGVyZmFjZXM6YCk7XG4gICAgbS5nZXRJbnRlcmZhY2VzKCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgY29uc3QgZm14SW50ZXJmYWNlID0gcHJvY2Vzc0ludGVyZmFjZShpKTtcbiAgICAgICAgZm14U2NvcGUuYWRkVHlwZShmbXhJbnRlcmZhY2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdmFyaWFibGVzIG9mIGEgY29udGFpbmVyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSwgYSBuYW1lc3BhY2UsIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QpXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1ZhcmlhYmxlcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSB8IEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NWYXJpYWJsZXM6IC0tLS0tLS0tLS0gRmluZGluZyBWYXJpYWJsZXM6YCk7XG4gICAgbS5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKS5mb3JFYWNoKHYgPT4ge1xuICAgICAgICBjb25zdCBmbXhWYXJpYWJsZXMgPSBwcm9jZXNzVmFyaWFibGVTdGF0ZW1lbnQodik7XG4gICAgICAgIGZteFZhcmlhYmxlcy5mb3JFYWNoKGZteFZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgIGZteFNjb3BlLmFkZFZhcmlhYmxlKGZteFZhcmlhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBlbnVtcyBvZiBhIGNvbnRhaW5lclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFbnVtcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzRW51bXM6IC0tLS0tLS0tLS0gRmluZGluZyBFbnVtczpgKTtcbiAgICBtLmdldEVudW1zKCkuZm9yRWFjaChlID0+IHtcbiAgICAgICAgY29uc3QgZm14RW51bSA9IHByb2Nlc3NFbnVtKGUpO1xuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteEVudW0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgZnVuY3Rpb25zIG9mIGEgY29udGFpbmVyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSwgYSBuYW1lc3BhY2UsIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QpXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Z1bmN0aW9ucyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcbiAgICBtLmdldEZ1bmN0aW9ucygpLmZvckVhY2goZiA9PiB7XG4gICAgICAgIGNvbnN0IGZteEZ1bmN0aW9uID0gcHJvY2Vzc0Z1bmN0aW9uKGYpO1xuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XG4gICAgfSk7XG5cbiAgICAvL2ZpbmQgYXJyb3cgZnVuY3Rpb25zXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcbiAgICBjb25zdCBhcnJvd0Z1bmN0aW9ucyA9IG0uZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKTtcbiAgICBhcnJvd0Z1bmN0aW9ucy5mb3JFYWNoKGFmID0+IHtcbiAgICAgICAgY29uc3QgZm14RnVuY3Rpb24gPSBwcm9jZXNzRnVuY3Rpb24oYWYpO1xuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XG4gICAgfSlcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIG1vZHVsZXMgb2YgYSBjb250YWluZXIuXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSBvciBhIG5hbWVzcGFjZSlcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxuICovXG5mdW5jdGlvbiBwcm9jZXNzTW9kdWxlcyhtOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGUgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIE1vZHVsZXM6YCk7XG4gICAgbS5nZXRNb2R1bGVzKCkuZm9yRWFjaChtZCA9PiB7XG4gICAgICAgIGNvbnN0IGZteE1vZHVsZSA9IHByb2Nlc3NNb2R1bGUobWQpO1xuICAgICAgICBmbXhTY29wZS5hZGRNb2R1bGUoZm14TW9kdWxlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYWxpYXNcbiAqIEBwYXJhbSBhIEFuIGFsaWFzXG4gKiBAcmV0dXJucyBBIEZhbWl4LkFsaWFzIHJlcHJlc2VudGluZyB0aGUgYWxpYXNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0FsaWFzKGE6IFR5cGVBbGlhc0RlY2xhcmF0aW9uKTogRmFtaXguQWxpYXMge1xuICAgIGNvbnN0IGZteEFsaWFzID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEFsaWFzKGEpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBBbGlhczogJHthLmdldE5hbWUoKX0sICgke2EuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEFsaWFzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhhLCBmbXhBbGlhcyk7XG5cbiAgICByZXR1cm4gZm14QWxpYXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgY2xhc3NcbiAqIEBwYXJhbSBjIEEgY2xhc3NcbiAqIEByZXR1cm5zIEEgRmFtaXguQ2xhc3Mgb3IgYSBGYW1peC5QYXJhbWV0cmljQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjbGFzc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3MoYzogQ2xhc3NEZWNsYXJhdGlvbik6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHtcbiAgICBjbGFzc2VzLnB1c2goYyk7XG5cbiAgICBjb25zdCBmbXhDbGFzcyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peENsYXNzKGMpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFzczogJHtjLmdldE5hbWUoKX0sICgke2MuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteENsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhjLCBmbXhDbGFzcyk7XG5cbiAgICBwcm9jZXNzRGVjb3JhdG9ycyhjLCBmbXhDbGFzcyk7XG5cbiAgICBwcm9jZXNzU3RydWN0dXJlZFR5cGUoYywgZm14Q2xhc3MpO1xuXG4gICAgYy5nZXRDb25zdHJ1Y3RvcnMoKS5mb3JFYWNoKGNvbiA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbiA9IHByb2Nlc3NNZXRob2QoY29uKTtcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteENvbik7XG4gICAgfSk7XG5cbiAgICBjLmdldEdldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcbiAgICAgICAgY29uc3QgZm14QWNjID0gcHJvY2Vzc01ldGhvZChhY2MpO1xuICAgICAgICBmbXhDbGFzcy5hZGRNZXRob2QoZm14QWNjKTtcbiAgICB9KTtcbiAgICBcbiAgICBjLmdldFNldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcbiAgICAgICAgY29uc3QgZm14QWNjID0gcHJvY2Vzc01ldGhvZChhY2MpO1xuICAgICAgICBmbXhDbGFzcy5hZGRNZXRob2QoZm14QWNjKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmbXhDbGFzcztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gaW50ZXJmYWNlXG4gKiBAcGFyYW0gaSBBbiBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIEEgRmFtaXguSW50ZXJmYWNlIG9yIGEgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIGludGVyZmFjZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzSW50ZXJmYWNlKGk6IEludGVyZmFjZURlY2xhcmF0aW9uKTogRmFtaXguSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB7XG4gICAgaW50ZXJmYWNlcy5wdXNoKGkpO1xuXG4gICAgY29uc3QgZm14SW50ZXJmYWNlID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGkpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBJbnRlcmZhY2U6ICR7aS5nZXROYW1lKCl9LCAoJHtpLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhJbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGksIGZteEludGVyZmFjZSk7XG5cbiAgICBwcm9jZXNzU3RydWN0dXJlZFR5cGUoaSwgZm14SW50ZXJmYWNlKTtcblxuICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgYSBzdHJ1Y3R1cmVkIHR5cGVcbiAqIEBwYXJhbSBjIEEgc3RydWN0dXJlZCB0eXBlIChhIGNsYXNzIG9yIGFuIGludGVyZmFjZSlcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzU3RydWN0dXJlZFR5cGUoYzogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIFByb3BlcnRpZXMgYW5kIE1ldGhvZHM6YCk7XG4gICAgaWYgKGZteFNjb3BlIGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHx8IGZteFNjb3BlIGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSkge1xuICAgICAgICBwcm9jZXNzVHlwZVBhcmFtZXRlcnMoYywgZm14U2NvcGUpO1xuICAgIH1cblxuICAgIGMuZ2V0UHJvcGVydGllcygpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IGZteFByb3BlcnR5ID0gcHJvY2Vzc1Byb3BlcnR5KHByb3ApO1xuICAgICAgICBmbXhTY29wZS5hZGRQcm9wZXJ0eShmbXhQcm9wZXJ0eSk7XG4gICAgfSk7XG5cbiAgICBjLmdldE1ldGhvZHMoKS5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBjb25zdCBmbXhNZXRob2QgPSBwcm9jZXNzTWV0aG9kKG0pO1xuICAgICAgICBmbXhTY29wZS5hZGRNZXRob2QoZm14TWV0aG9kKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBwcm9wZXJ0eVxuICogQHBhcmFtIHAgQSBwcm9wZXJ0eVxuICogQHJldHVybnMgQSBGYW1peC5Qcm9wZXJ0eSByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0eShwOiBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUpOiBGYW1peC5Qcm9wZXJ0eSB7XG4gICAgY29uc3QgZm14UHJvcGVydHkgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4UHJvcGVydHkocCk7XG5cbiAgICBsb2dnZXIuZGVidWcoYHByb3BlcnR5OiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgIC0tLT4gSXQncyBhIFByb3BlcnR5JHsocCBpbnN0YW5jZW9mIFByb3BlcnR5U2lnbmF0dXJlKSA/IFwiU2lnbmF0dXJlXCIgOiBcIkRlY2xhcmF0aW9uXCJ9IWApO1xuICAgIGNvbnN0IGFuY2VzdG9yID0gcC5nZXRGaXJzdEFuY2VzdG9yT3JUaHJvdygpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgIC0tLT4gSXRzIGZpcnN0IGFuY2VzdG9yIGlzIGEgJHthbmNlc3Rvci5nZXRLaW5kTmFtZSgpfWApO1xuXG4gICAgLy8gZGVjb3JhdG9yc1xuICAgIGlmICghKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNpZ25hdHVyZSkpIHtcbiAgICAgICAgcHJvY2Vzc0RlY29yYXRvcnMocCwgZm14UHJvcGVydHkpO1xuICAgICAgICAvLyBvbmx5IGFkZCBhY2Nlc3MgaWYgdGhlIHAncyBmaXJzdCBhbmNlc3RvciBpcyBub3QgYSBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICAgICAgIGlmIChhbmNlc3Rvci5nZXRLaW5kTmFtZSgpICE9PSBcIlByb3BlcnR5RGVjbGFyYXRpb25cIikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBhZGRpbmcgYWNjZXNzIHRvIG1hcDogJHtwLmdldE5hbWUoKX0sICgke3AuZ2V0VHlwZSgpLmdldFRleHQoKX0pIEZhbWl4ICR7Zm14UHJvcGVydHkubmFtZX0gaWQ6ICR7Zm14UHJvcGVydHkuaWR9YCk7XG4gICAgICAgICAgICBhY2Nlc3NNYXAuc2V0KGZteFByb3BlcnR5LmlkLCBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NDb21tZW50cyhwLCBmbXhQcm9wZXJ0eSk7XG5cbiAgICByZXR1cm4gZm14UHJvcGVydHk7XG59XG5cbi8qKlxuICAgICAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIG1ldGhvZCBvciBhbiBhY2Nlc3NvclxuICAgICAqIEBwYXJhbSBtIEEgbWV0aG9kIG9yIGFuIGFjY2Vzc29yXG4gICAgICogQHJldHVybnMgQSBGYW1peC5NZXRob2Qgb3IgYSBGYW1peC5BY2Nlc3NvciByZXByZXNlbnRpbmcgdGhlIG1ldGhvZCBvciB0aGUgYWNjZXNzb3JcbiAgICAgKi9cbmZ1bmN0aW9uIHByb2Nlc3NNZXRob2QobTogTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24pOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB7XG4gICAgY29uc3QgZm14TWV0aG9kID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4TWV0aG9kKG0sIGN1cnJlbnRDQyk7XG5cbiAgICBsb2dnZXIuZGVidWcoYE1ldGhvZDogJHshKG0gaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSA/IG0uZ2V0TmFtZSgpIDogXCJjb25zdHJ1Y3RvclwifSwgKCR7bS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIHBhcmVudDogJHsobS5nZXRQYXJlbnQoKSBhcyBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24pLmdldE5hbWUoKX0sIGZxbiA9ICR7Zm14TWV0aG9kLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhtLCBmbXhNZXRob2QpO1xuXG4gICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKG0sIGZteE1ldGhvZCk7XG5cbiAgICBwcm9jZXNzUGFyYW1ldGVycyhtLCBmbXhNZXRob2QpO1xuXG4gICAgaWYgKCEobSBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgcHJvY2Vzc0FsaWFzZXMobSwgZm14TWV0aG9kKTtcblxuICAgICAgICBwcm9jZXNzVmFyaWFibGVzKG0sIGZteE1ldGhvZCk7XG5cbiAgICAgICAgcHJvY2Vzc0VudW1zKG0sIGZteE1ldGhvZCk7XG5cbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9ucyhtLCBmbXhNZXRob2QpO1xuXG4gICAgICAgIHByb2Nlc3NGdW5jdGlvbkV4cHJlc3Npb25zKG0sIGZteE1ldGhvZCk7XG5cbiAgICAgICAgbWV0aG9kc0FuZEZ1bmN0aW9uc1dpdGhJZC5zZXQoZm14TWV0aG9kLmlkLCBtKTtcbiAgICB9XG5cbiAgICBpZiAobSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG0gaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG0gaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKSB7XG4gICAgICAgIHByb2Nlc3NEZWNvcmF0b3JzKG0sIGZteE1ldGhvZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZteE1ldGhvZDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIGYgQSBmdW5jdGlvblxuICogQHJldHVybnMgQSBGYW1peC5GdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NGdW5jdGlvbihmOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgQXJyb3dGdW5jdGlvbik6IEZhbWl4LkZ1bmN0aW9uIHtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgRnVuY3Rpb246ICR7KGYgaW5zdGFuY2VvZiBBcnJvd0Z1bmN0aW9uID8gXCJhbm9ueW1vdXNcIiA6IGYuZ2V0TmFtZSgpID8gZi5nZXROYW1lKCkgOiBcImFub255bW91c1wiKX0sICgke2YuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2dldEZRTihmKX1gKTtcblxuICAgIGxldCBmbXhGdW5jdGlvbjtcbiAgICBpZiggZiBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24pIHtcbiAgICAgICAgZm14RnVuY3Rpb24gPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4QXJyb3dGdW5jdGlvbihmLCBjdXJyZW50Q0MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZteEZ1bmN0aW9uID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4RnVuY3Rpb24oZiwgY3VycmVudENDKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzQ29tbWVudHMoZiwgZm14RnVuY3Rpb24pO1xuXG4gICAgcHJvY2Vzc0FsaWFzZXMoZiwgZm14RnVuY3Rpb24pO1xuXG4gICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NWYXJpYWJsZXMoZiwgZm14RnVuY3Rpb24pO1xuXG4gICAgcHJvY2Vzc0VudW1zKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NGdW5jdGlvbnMoZiwgZm14RnVuY3Rpb24pO1xuXG4gICAgaWYgKGYgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uICYmICEoZi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEJsb2NrKSkge1xuICAgICAgICBwcm9jZXNzRnVuY3Rpb25FeHByZXNzaW9ucyhmLCBmbXhGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgbWV0aG9kc0FuZEZ1bmN0aW9uc1dpdGhJZC5zZXQoZm14RnVuY3Rpb24uaWQsIGYpO1xuXG4gICAgcmV0dXJuIGZteEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbnMgb2YgYSBmdW5jdGlvbiBvciBhIG1ldGhvZFxuICogQHBhcmFtIGYgQSBmdW5jdGlvbiBvciBhIG1ldGhvZFxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIG1ldGhvZFxuICovXG5mdW5jdGlvbiBwcm9jZXNzRnVuY3Rpb25FeHByZXNzaW9ucyhmOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uIEV4cHJlc3Npb25zOmApO1xuICAgIGNvbnN0IGZ1bmN0aW9uRXhwcmVzc2lvbnMgPSBmLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uKTtcbiAgICBmdW5jdGlvbkV4cHJlc3Npb25zLmZvckVhY2goKGZ1bmMpID0+IHtcbiAgICAgICAgY29uc3QgZm14RnVuYyA9IHByb2Nlc3NGdW5jdGlvbihmdW5jKTtcbiAgICAgICAgZm14U2NvcGUuYWRkRnVuY3Rpb24oZm14RnVuYyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIGEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIEEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1BhcmFtZXRlcnMobTogTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgQXJyb3dGdW5jdGlvbiwgZm14U2NvcGU6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgUGFyYW1ldGVyczpgKTtcbiAgICBtLmdldFBhcmFtZXRlcnMoKS5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgY29uc3QgZm14UGFyYW0gPSBwcm9jZXNzUGFyYW1ldGVyKHBhcmFtKTtcbiAgICAgICAgZm14U2NvcGUuYWRkUGFyYW1ldGVyKGZteFBhcmFtKTtcbiAgICAgICAgLy8gQWRkaXRpb25hbCBoYW5kbGluZyBmb3IgUGFyYW1ldGVyIFByb3BlcnRpZXMgaW4gY29uc3RydWN0b3JzXG4gICAgICAgIGlmIChtIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBoYXMgYW55IHZpc2liaWxpdHkgbW9kaWZpZXJcbiAgICAgICAgICAgIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB8fCBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpIHx8IHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkgfHwgcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NPZkNvbnN0cnVjdG9yID0gbS5nZXRQYXJlbnQoKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUGFyYW1ldGVyIFByb3BlcnR5ICR7cGFyYW0uZ2V0TmFtZSgpfSBpbiBjb25zdHJ1Y3RvciBvZiAke2NsYXNzT2ZDb25zdHJ1Y3Rvci5nZXROYW1lKCl9LmApO1xuICAgICAgICAgICAgICAgIC8vIFRyZWF0IHRoZSBwYXJhbWV0ZXIgYXMgYSBwcm9wZXJ0eSBhbmQgYWRkIGl0IHRvIHRoZSBjbGFzc1xuICAgICAgICAgICAgICAgIGNvbnN0IGZteFByb3BlcnR5ID0gcHJvY2Vzc1BhcmFtZXRlckFzUHJvcGVydHkocGFyYW0sIGNsYXNzT2ZDb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICAgICAgZm14UHJvcGVydHkucmVhZE9ubHkgPSBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjcmVhdGUgYSBGYW1peC5Qcm9wZXJ0eSBtb2RlbCBmcm9tIGEgUGFyYW1ldGVyRGVjbGFyYXRpb25cbi8vIFlvdSdsbCBuZWVkIHRvIGltcGxlbWVudCBpdCBhY2NvcmRpbmcgdG8geW91ciBGYW1peCBtb2RlbCBzdHJ1Y3R1cmVcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY2xhc3NEZWNsOiBDbGFzc0RlY2xhcmF0aW9uIHwgQ2xhc3NFeHByZXNzaW9uKTogRmFtaXguUHJvcGVydHkge1xuICAgIC8vIENvbnZlcnQgdGhlIHBhcmFtZXRlciBpbnRvIGEgUHJvcGVydHlcbiAgICBjb25zdCBwcm9wZXJ0eVJlcHJlc2VudGF0aW9uID0gY29udmVydFBhcmFtZXRlclRvUHJvcGVydHlSZXByZXNlbnRhdGlvbihwYXJhbSk7XG5cbiAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyBzbyB3ZSBjYW4gaGF2ZSBhIFByb3BlcnR5RGVjbGFyYXRpb24gb2JqZWN0XG4gICAgY2xhc3NEZWNsLmFkZFByb3BlcnR5KHByb3BlcnR5UmVwcmVzZW50YXRpb24pO1xuXG4gICAgY29uc3QgcHJvcGVydHkgPSBjbGFzc0RlY2wuZ2V0UHJvcGVydHkocHJvcGVydHlSZXByZXNlbnRhdGlvbi5uYW1lKTtcbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wZXJ0eVJlcHJlc2VudGF0aW9uLm5hbWV9IG5vdCBmb3VuZCBpbiBjbGFzcyAke2NsYXNzRGVjbC5nZXROYW1lKCl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGZteFByb3BlcnR5ID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peFByb3BlcnR5KHByb3BlcnR5KTtcbiAgICBpZiAoY2xhc3NEZWNsIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCBmbXhDbGFzcyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peENsYXNzKGNsYXNzRGVjbCk7XG4gICAgICAgIGZteENsYXNzLmFkZFByb3BlcnR5KGZteFByb3BlcnR5KTtcbiAgICB9IGVsc2UgeyBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCB0eXBlIENsYXNzRXhwcmVzc2lvbi5cIik7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHByb3BlcnR5LCBmbXhQcm9wZXJ0eSk7XG5cbiAgICAvLyByZW1vdmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIGNsYXNzXG4gICAgcHJvcGVydHkucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4gZm14UHJvcGVydHk7XG5cbn1cblxuZnVuY3Rpb24gY29udmVydFBhcmFtZXRlclRvUHJvcGVydHlSZXByZXNlbnRhdGlvbihwYXJhbTogUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcbiAgICAvLyBFeHRyYWN0IG5hbWVcbiAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJhbS5nZXROYW1lKCk7XG5cbiAgICAvLyBFeHRyYWN0IHR5cGVcbiAgICBjb25zdCBwYXJhbVR5cGUgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0VGV4dChwYXJhbSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdmlzaWJpbGl0eVxuICAgIGxldCBzY29wZTogU2NvcGU7XG4gICAgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJpdmF0ZTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICAgICAgc2NvcGUgPSBTY29wZS5Qcm90ZWN0ZWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpKSB7XG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHVibGljO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIHByb3BlcnR5ICR7cGFyYW1OYW1lfSBpbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGEgdmlzaWJpbGl0eSBtb2RpZmllci5gKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgcmVhZG9ubHlcbiAgICBjb25zdCBpc1JlYWRvbmx5ID0gcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQpO1xuXG4gICAgLy8gQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5XG4gICAgY29uc3QgcHJvcGVydHlSZXByZXNlbnRhdGlvbiA9IHtcbiAgICAgICAgbmFtZTogcGFyYW1OYW1lLFxuICAgICAgICB0eXBlOiBwYXJhbVR5cGUsXG4gICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgaXNSZWFkb25seTogaXNSZWFkb25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BlcnR5UmVwcmVzZW50YXRpb247XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcGFyYW1ldGVyXG4gKiBAcGFyYW0gcGFyYW1EZWNsIEEgcGFyYW1ldGVyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlBhcmFtZXRlciByZXByZXNlbnRpbmcgdGhlIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzUGFyYW1ldGVyKHBhcmFtRGVjbDogUGFyYW1ldGVyRGVjbGFyYXRpb24pOiBGYW1peC5QYXJhbWV0ZXIge1xuICAgIGNvbnN0IGZteFBhcmFtID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peFBhcmFtZXRlcihwYXJhbURlY2wpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBwYXJhbWV0ZXI6ICR7cGFyYW1EZWNsLmdldE5hbWUoKX0sICgke3BhcmFtRGVjbC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14UGFyYW0uZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHBhcmFtRGVjbCwgZm14UGFyYW0pO1xuXG4gICAgcHJvY2Vzc0RlY29yYXRvcnMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBwYXJhbURlY2wuZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmUpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgYWRkaW5nIGFjY2VzczogJHtwYXJhbURlY2wuZ2V0TmFtZSgpfSwgKCR7cGFyYW1EZWNsLmdldFR5cGUoKS5nZXRUZXh0KCl9KSBGYW1peCAke2ZteFBhcmFtLm5hbWV9YCk7XG4gICAgICAgIGFjY2Vzc01hcC5zZXQoZm14UGFyYW0uaWQsIHBhcmFtRGVjbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZteFBhcmFtO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgY2xhc3MsIGFuIGludGVyZmFjZSwgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIGUgQSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjbGFzcywgdGhlIGludGVyZmFjZSwgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGU6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8QXJyb3dGdW5jdGlvbiwgZm14U2NvcGU6IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguQXJyb3dGdW5jdGlvbik6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmluZGluZyBUeXBlIFBhcmFtZXRlcnM6YCk7XG4gICAgZS5nZXRUeXBlUGFyYW1ldGVycygpLmZvckVhY2godHAgPT4ge1xuICAgICAgICBjb25zdCBmbXhQYXJhbSA9IHByb2Nlc3NUeXBlUGFyYW1ldGVyKHRwKTtcbiAgICAgICAgZm14U2NvcGUuYWRkR2VuZXJpY1BhcmFtZXRlcihmbXhQYXJhbSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgdHlwZSBwYXJhbWV0ZXJcbiAqIEBwYXJhbSB0cCBBIHR5cGUgcGFyYW1ldGVyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlR5cGVQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzVHlwZVBhcmFtZXRlcih0cDogVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyVHlwZSB7XG4gICAgY29uc3QgZm14VHlwZVBhcmFtZXRlciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgdHlwZSBwYXJhbWV0ZXI6ICR7dHAuZ2V0TmFtZSgpfSwgKCR7dHAuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteFR5cGVQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHRwLCBmbXhUeXBlUGFyYW1ldGVyKTtcblxuICAgIHJldHVybiBmbXhUeXBlUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdmFyaWFibGVzIG9mIGEgdmFyaWFibGUgc3RhdGVtZW50XG4gKiBAcGFyYW0gdiBBIHZhcmlhYmxlIHN0YXRlbWVudFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgRmFtaXguVmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZXNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1ZhcmlhYmxlU3RhdGVtZW50KHY6IFZhcmlhYmxlU3RhdGVtZW50KTogQXJyYXk8RmFtaXguVmFyaWFibGU+IHtcbiAgICBjb25zdCBmbXhWYXJpYWJsZXMgPSBuZXcgQXJyYXk8RmFtaXguVmFyaWFibGU+KCk7XG5cbiAgICBsb2dnZXIuZGVidWcoYFZhcmlhYmxlIHN0YXRlbWVudDogJHt2LmdldFRleHQoKX0sICgke3YuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCAke3YuZ2V0RGVjbGFyYXRpb25LaW5kS2V5d29yZHMoKVswXX0sIGZxbiA9ICR7di5nZXREZWNsYXJhdGlvbnMoKVswXS5nZXROYW1lKCl9YCk7XG5cbiAgICB2LmdldERlY2xhcmF0aW9ucygpLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgICBjb25zdCBmbXhWYXIgPSBwcm9jZXNzVmFyaWFibGUodmFyaWFibGUpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudHModiwgZm14VmFyKTtcbiAgICAgICAgZm14VmFyaWFibGVzLnB1c2goZm14VmFyKTtcbiAgICB9KTsgXG5cbiAgICByZXR1cm4gZm14VmFyaWFibGVzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIHZhcmlhYmxlXG4gKiBAcGFyYW0gdiBBIHZhcmlhYmxlXG4gKiBAcmV0dXJucyBBIEZhbWl4LlZhcmlhYmxlIHJlcHJlc2VudGluZyB0aGUgdmFyaWFibGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1ZhcmlhYmxlKHY6IFZhcmlhYmxlRGVjbGFyYXRpb24pOiBGYW1peC5WYXJpYWJsZSB7XG4gICAgY29uc3QgZm14VmFyID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peFZhcmlhYmxlKHYpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGB2YXJpYWJsZTogJHt2LmdldE5hbWUoKX0sICgke3YuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCAke3YuZ2V0SW5pdGlhbGl6ZXIoKSA/IFwiaW5pdGlhbGl6ZXI6IFwiICsgdi5nZXRJbml0aWFsaXplcigpIS5nZXRUZXh0KCkgOiBcImluaXRpYWxpemVyOiBcIn0sIGZxbiA9ICR7Zm14VmFyLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyh2LCBmbXhWYXIpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBhZGRpbmcgYWNjZXNzOiAke3YuZ2V0TmFtZSgpfSwgKCR7di5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhWYXIubmFtZX1gKTtcbiAgICBhY2Nlc3NNYXAuc2V0KGZteFZhci5pZCwgdik7XG5cbiAgICByZXR1cm4gZm14VmFyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhbiBlbnVtXG4gKiBAcGFyYW0gZSBBbiBlbnVtXG4gKiBAcmV0dXJucyBBIEZhbWl4LkVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnVtXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFbnVtKGU6IEVudW1EZWNsYXJhdGlvbik6IEZhbWl4LkVudW0ge1xuICAgIGNvbnN0IGZteEVudW0gPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4RW51bShlKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgZW51bTogJHtlLmdldE5hbWUoKX0sICgke2UuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEVudW0uZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGUsIGZteEVudW0pO1xuXG4gICAgZS5nZXRNZW1iZXJzKCkuZm9yRWFjaChtID0+IHtcbiAgICAgICAgY29uc3QgZm14RW51bVZhbHVlID0gcHJvY2Vzc0VudW1WYWx1ZShtKTtcbiAgICAgICAgZm14RW51bS5hZGRWYWx1ZShmbXhFbnVtVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZteEVudW07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGVudW0gbWVtYmVyXG4gKiBAcGFyYW0gdiBBbiBlbnVtIG1lbWJlclxuICogQHJldHVybnMgQSBGYW1peC5FbnVtVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbnVtIG1lbWJlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzRW51bVZhbHVlKHY6IEVudW1NZW1iZXIpOiBGYW1peC5FbnVtVmFsdWUge1xuICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhFbnVtVmFsdWUodik7XG5cbiAgICBsb2dnZXIuZGVidWcoYGVudW0gdmFsdWU6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhFbnVtVmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHYsIGZteEVudW1WYWx1ZSk7XG5cbiAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSBGYW1peCAke2ZteEVudW1WYWx1ZS5uYW1lfWApO1xuICAgIGFjY2Vzc01hcC5zZXQoZm14RW51bVZhbHVlLmlkLCB2KTtcblxuICAgIHJldHVybiBmbXhFbnVtVmFsdWU7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBkZWNvcmF0b3JzIG9mIGEgY2xhc3MsIGEgbWV0aG9kLCBhIHBhcmFtZXRlciBvciBhIHByb3BlcnR5XG4gKiBAcGFyYW0gZSBBIGNsYXNzLCBhIG1ldGhvZCwgYSBwYXJhbWV0ZXIgb3IgYSBwcm9wZXJ0eVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY2xhc3MsIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIgb3IgdGhlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWNvcmF0b3JzKGU6IENsYXNzRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LlBhcmFtZXRlciB8IEZhbWl4LlByb3BlcnR5KTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIERlY29yYXRvcnM6YCk7XG4gICAgZS5nZXREZWNvcmF0b3JzKCkuZm9yRWFjaChkZWMgPT4ge1xuICAgICAgICBjb25zdCBmbXhEZWMgPSBwcm9jZXNzRGVjb3JhdG9yKGRlYywgZSk7XG4gICAgICAgIGZteFNjb3BlLmFkZERlY29yYXRvcihmbXhEZWMpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGRlY29yYXRvclxuICogQHBhcmFtIGQgQSBkZWNvcmF0b3JcbiAqIEBwYXJhbSBlIEEgY2xhc3MsIGEgbWV0aG9kLCBhIHBhcmFtZXRlciBvciBhIHByb3BlcnR5XG4gKiBAcmV0dXJucyBBIEZhbWl4LkRlY29yYXRvciByZXByZXNlbnRpbmcgdGhlIGRlY29yYXRvclxuICovXG5mdW5jdGlvbiBwcm9jZXNzRGVjb3JhdG9yKGQ6IERlY29yYXRvciwgZTogQ2xhc3NEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24pOiBGYW1peC5EZWNvcmF0b3Ige1xuICAgIGNvbnN0IGZteERlYyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peERlY29yYXRvcihkLCBlKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgZGVjb3JhdG9yOiAke2QuZ2V0TmFtZSgpfSwgKCR7ZC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14RGVjLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhkLCBmbXhEZWMpO1xuXG4gICAgcmV0dXJuIGZteERlYztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGNvbW1lbnRzXG4gKiBAcGFyYW0gZSBBIHRzLW1vcnBoIGVsZW1lbnRcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG5hbWVkIGVudGl0eVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29tbWVudHMoZTogU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgRGVjb3JhdG9yIHwgRW51bURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlU3RhdGVtZW50IHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYFByb2Nlc3MgY29tbWVudHM6YCk7XG4gICAgZS5nZXRMZWFkaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgbGVhZGluZyBjb21tZW50cywgYWRkQ29tbWVudDogJyR7Yy5nZXRUZXh0KCl9J2ApO1xuICAgICAgICBmbXhTY29wZS5hZGRDb21tZW50KGZteENvbW1lbnQpOyAvLyByZWR1bmRhbnQsIGJ1dCBqdXN0IGluIGNhc2VcbiAgICB9KTtcbiAgICBlLmdldFRyYWlsaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgdHJhaWxpbmcgY29tbWVudHMsIGFkZENvbW1lbnQ6ICcke2MuZ2V0VGV4dCgpfSdgKTtcbiAgICAgICAgZm14U2NvcGUuYWRkQ29tbWVudChmbXhDb21tZW50KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBjb21tZW50XG4gKiBAcGFyYW0gYyBBIGNvbW1lbnRcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcbiAqIEByZXR1cm5zIEEgRmFtaXguQ29tbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbW1lbnQoYzogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiBGYW1peC5Db21tZW50IHtcbiAgICBjb25zdCBpc0pTRG9jID0gYy5nZXRUZXh0KCkuc3RhcnRzV2l0aChcIi8qKlwiKTtcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NDb21tZW50OiBjb21tZW50OiAke2MuZ2V0VGV4dCgpfSwgaXNKU0RvYyA9ICR7aXNKU0RvY31gKTtcbiAgICBjb25zdCBmbXhDb21tZW50ID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbW1lbnQoYywgZm14U2NvcGUsIGlzSlNEb2MpO1xuXG4gICAgcmV0dXJuIGZteENvbW1lbnQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhY2Nlc3NlcyBvbiB0aGUgcGFyYW1ldGVycywgdmFyaWFibGVzLCBwcm9wZXJ0aWVzIGFuZCBlbnVtIG1lbWJlcnMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuICogQHBhcmFtIGFjY2Vzc01hcCBBIG1hcCBvZiBwYXJhbWV0ZXJzLCB2YXJpYWJsZXMsIHByb3BlcnRpZXMgYW5kIGVudW0gbWVtYmVycyB3aXRoIHRoZWlyIGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQWNjZXNzZXMoYWNjZXNzTWFwOiBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50Pik6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYWNjZXNzZXM6YCk7XG4gICAgYWNjZXNzTWFwLmZvckVhY2goKHYsIGlkKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWNjZXNzZXMgdG8gJHt2LmdldE5hbWUoKX1gKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBfbm9kZXMgPSB2LmZpbmRSZWZlcmVuY2VzQXNOb2RlcygpIGFzIEFycmF5PElkZW50aWZpZXI+O1xuICAgICAgICAgICAgdGVtcF9ub2Rlcy5mb3JFYWNoKG5vZGUgPT4gcHJvY2Vzc05vZGVGb3JBY2Nlc3Nlcyhub2RlLCBpZCkpO1xuICAgICAgICAvLyB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gXCIke2Vycm9yfVwiLlxcbkNvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgLy8gfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhbiBhY2Nlc3Mgb24gYSBwYXJhbWV0ZXIsIHZhcmlhYmxlLCBwcm9wZXJ0eSBvciBlbnVtIG1lbWJlclxuICogQHBhcmFtIG4gQSBub2RlXG4gKiBAcGFyYW0gaWQgQW4gaWQgb2YgYSBwYXJhbWV0ZXIsIGEgdmFyaWFibGUsIGEgcHJvcGVydHkgb3IgYW4gZW51bSBtZW1iZXJcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc05vZGVGb3JBY2Nlc3NlcyhuOiBJZGVudGlmaWVyLCBpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gdHJ5IHtcbiAgICAgICAgLy8gc29tZXRpbWVzIG5vZGUncyBmaXJzdCBhbmNlc3RvciBpcyBhIFByb3BlcnR5RGVjbGFyYXRpb24sIHdoaWNoIGlzIG5vdCBhbiBhY2Nlc3NcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mdWhybWFuYXRvci9GYW1peFR5cGVTY3JpcHRJbXBvcnRlci9pc3N1ZXMvOVxuICAgICAgICAvLyBjaGVjayBmb3IgYSBub2RlIHdob3NlIGZpcnN0IGFuY2VzdG9yIGlzIGEgcHJvcGVydHkgZGVjbGFyYXRpb24gYW5kIGJhaWw/XG4gICAgICAgIC8vIFRoaXMgbWF5IGJlIGEgYnVnIGluIHRzLW1vcnBoP1xuICAgICAgICBpZiAobi5nZXRGaXJzdEFuY2VzdG9yT3JUaHJvdygpLmdldEtpbmROYW1lKCkgPT09IFwiUHJvcGVydHlEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NOb2RlRm9yQWNjZXNzZXM6IG5vZGUga2luZDogJHtuLmdldEtpbmROYW1lKCl9LCAke24uZ2V0VGV4dCgpfSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkncyBmaXJzdCBhbmNlc3RvciBpcyBhIFByb3BlcnR5RGVjbGFyYXRpb24uIFNraXBwaW5nLi4uYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEFjY2VzcyhuLCBpZCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc05vZGVGb3JBY2Nlc3Nlczogbm9kZSBraW5kOiAke24uZ2V0S2luZE5hbWUoKX0sICR7bi5nZXRUZXh0KCl9LCAoJHtuLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gICAgIGxvZ2dlci5lcnJvcihgPiBHb3QgZXhjZXB0aW9uIFwiJHtlcnJvcn1cIi5cXG5TY29wZURlY2xhcmF0aW9uIGludmFsaWQgZm9yIFwiJHtuLmdldFN5bWJvbCgpLmZ1bGx5UXVhbGlmaWVkTmFtZX1cIi5cXG5Db250aW51aW5nLi4uYCk7XG4gICAgLy8gfVxufVxuXG5cbi8vIGV4cG9ydHMgaGFzIG5hbWUgLT4gRGVjbGFyYXRpb24gLS0gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIEZhbWl4RWxlbWVudFxuXG4vLyBoYW5kbGUgYGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIilgIGZvciBleGFtcGxlXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ltcG9ydENsYXVzZXNGb3JJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbnMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+LCBleHBvcnRzOiBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+Pik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbXBvcnQgY2xhdXNlcyBmcm9tIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9ucyBpbiBzb3VyY2UgZmlsZXM6YCk7XG4gICAgc291cmNlRmlsZXMuZm9yRWFjaChzb3VyY2VGaWxlID0+IHtcbiAgICAgICAgc291cmNlRmlsZS5mb3JFYWNoRGVzY2VuZGFudChub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChOb2RlLmlzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBZb3UndmUgZm91bmQgYW4gSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkRlY2xhcmF0aW9uIE5hbWU6XCIsIG5vZGUuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIk1vZHVsZSBSZWZlcmVuY2UgVGV4dDpcIiwgbm9kZS5nZXRNb2R1bGVSZWZlcmVuY2UoKS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgIC8vIHdoYXQncyB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgZW50aXR5P1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGltcG9ydGVkRW50aXR5ID0gbm9kZS5nZXROYW1lKCk7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZmFtaXggaW1wb3J0IGNsYXVzZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVkSW1wb3J0ID0gbm9kZS5nZXROYW1lTm9kZSgpO1xuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlRmFtaXhJbXBvcnRDbGF1c2Uoe2ltcG9ydERlY2xhcmF0aW9uOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IHNvdXJjZUZpbGUsIFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogbm9kZS5nZXRNb2R1bGVSZWZlcmVuY2UoKS5nZXRUZXh0KCksIFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lZEltcG9ydCwgXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FeHBvcnRzOiBleHBvcnRzLmZpbmQoZSA9PiBlLmhhcyhuYW1lZEltcG9ydC5nZXRUZXh0KCkpKSAhPT0gdW5kZWZpbmVkLCBcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIC8vIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2UoaW1wb3J0ZWRFbnRpdHksIGltcG9ydGluZ0VudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICApO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgaW1wb3J0IGNsYXVzZXMgb2YgdGhlIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbW9kdWxlc1xuICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlc1xuICogQHBhcmFtIGV4cG9ydHMgQW4gYXJyYXkgb2YgbWFwcyBvZiBleHBvcnRlZCBkZWNsYXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbXBvcnRDbGF1c2VzRm9yTW9kdWxlcyhtb2R1bGVzOiBBcnJheTxTb3VyY2VGaWxlPiwgZXhwb3J0czogQXJyYXk8UmVhZG9ubHlNYXA8c3RyaW5nLCBFeHBvcnRlZERlY2xhcmF0aW9uc1tdPj4pOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgaW1wb3J0IGNsYXVzZXMgZnJvbSAke21vZHVsZXMubGVuZ3RofSBtb2R1bGVzOmApO1xuICAgIG1vZHVsZXMuZm9yRWFjaChtb2R1bGUgPT4ge1xuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gbW9kdWxlLmdldEZpbGVQYXRoKCkgKyBtb2R1bGUuZ2V0QmFzZU5hbWUoKTtcbiAgICAgICAgbW9kdWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpLmZvckVhY2goaW1wRGVjbCA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0TW9kdWxlUGF0aChpbXBEZWNsKTtcblxuICAgICAgICAgICAgaW1wRGVjbC5nZXROYW1lZEltcG9ydHMoKS5mb3JFYWNoKG5hbWVkSW1wb3J0ID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChuYW1lZCkgJHtuYW1lZEltcG9ydC5nZXROYW1lKCl9IGZyb20gJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRlZEVudGl0eU5hbWUgPSBuYW1lZEltcG9ydC5nZXROYW1lKCk7XG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydEZvdW5kSW5FeHBvcnRzID0gaXNJbkV4cG9ydHMoZXhwb3J0cywgaW1wb3J0ZWRFbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5Lm9sZENyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlKHtpbXBvcnREZWNsYXJhdGlvbjogaW1wRGVjbCxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBtb2R1bGUsIFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogcGF0aCwgXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQ6IG5hbWVkSW1wb3J0LCBcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGltcG9ydEZvdW5kSW5FeHBvcnRzLCBcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiBmYWxzZX0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRJbXBvcnQgPSBpbXBEZWNsLmdldERlZmF1bHRJbXBvcnQoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChkZWZhdWx0KSAke2RlZmF1bHRJbXBvcnQuZ2V0VGV4dCgpfSBmcm9tICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCB3aXRoIG1vZHVsZSwgaW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLCBwYXRoLCBkZWZhdWx0SW1wb3J0LCBmYWxzZSwgdHJ1ZVxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlRmFtaXhJbXBvcnRDbGF1c2Uoe2ltcG9ydERlY2xhcmF0aW9uOiBpbXBEZWNsLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IG1vZHVsZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQ6IGRlZmF1bHRJbXBvcnQsXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FeHBvcnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiB0cnVlfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydCA9IGltcERlY2wuZ2V0TmFtZXNwYWNlSW1wb3J0KCk7XG4gICAgICAgICAgICBpZiAobmFtZXNwYWNlSW1wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChuYW1lc3BhY2UpICR7bmFtZXNwYWNlSW1wb3J0LmdldFRleHQoKX0gZnJvbSAke2ltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKX0gaW4gJHttb2R1bGVQYXRofWApO1xuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlRmFtaXhJbXBvcnRDbGF1c2Uoe2ltcG9ydERlY2xhcmF0aW9uOiBpbXBEZWNsLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IG1vZHVsZSwgXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBwYXRoLCBcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogbmFtZXNwYWNlSW1wb3J0LCBcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIC8vIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2UobW9kdWxlLCBpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCksIHBhdGgsIG5hbWVzcGFjZUltcG9ydCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7IFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpc0luRXhwb3J0cyhleHBvcnRzOiBSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+W10sIGltcG9ydGVkRW50aXR5TmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGltcG9ydEZvdW5kSW5FeHBvcnRzID0gZmFsc2U7XG4gICAgZXhwb3J0cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICBpZiAoZS5oYXMoaW1wb3J0ZWRFbnRpdHlOYW1lKSkge1xuICAgICAgICAgICAgaW1wb3J0Rm91bmRJbkV4cG9ydHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGltcG9ydEZvdW5kSW5FeHBvcnRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgaW5oZXJpdGFuY2VzIG9mIHRoZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIG9mIHRoZSBzb3VyY2UgZmlsZXNcbiAqIEBwYXJhbSBjbGFzc2VzIEFuIGFycmF5IG9mIGNsYXNzZXNcbiAqIEBwYXJhbSBpbnRlcmZhY2VzIEFuIGFycmF5IG9mIGludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbmhlcml0YW5jZXMoY2xhc3NlczogQ2xhc3NEZWNsYXJhdGlvbltdLCBpbnRlcmZhY2VzOiBJbnRlcmZhY2VEZWNsYXJhdGlvbltdKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oYHByb2Nlc3NJbmhlcml0YW5jZXM6IENyZWF0aW5nIGluaGVyaXRhbmNlczpgKTtcbiAgICBjbGFzc2VzLmZvckVhY2goY2xzID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBDaGVja2luZyBjbGFzcyBpbmhlcml0YW5jZSBmb3IgJHtjbHMuZ2V0TmFtZSgpfWApO1xuICAgICAgICBjb25zdCBleHRDbGFzcyA9IGNscy5nZXRCYXNlQ2xhc3MoKTtcbiAgICAgICAgaWYgKGV4dENsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbmhlcml0YW5jZShjbHMsIGV4dENsYXNzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBjbGFzczogJHtjbHMuZ2V0TmFtZSgpfSwgKCR7Y2xzLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZXh0Q2xhc3M6ICR7ZXh0Q2xhc3MuZ2V0TmFtZSgpfSwgKCR7ZXh0Q2xhc3MuZ2V0VHlwZSgpLmdldFRleHQoKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbmhlcml0YW5jZXM6IENoZWNraW5nIGludGVyZmFjZSBpbmhlcml0YW5jZSBmb3IgJHtjbHMuZ2V0TmFtZSgpfWApO1xuICAgICAgICBjb25zdCBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBnZXRJbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzKGludGVyZmFjZXMsIGNscyk7XG4gICAgICAgIGltcGxlbWVudGVkSW50ZXJmYWNlcy5mb3JFYWNoKGltcEludGVyID0+IHtcbiAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbmhlcml0YW5jZShjbHMsIGltcEludGVyKTtcblxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBjbGFzczogJHtjbHMuZ2V0TmFtZSgpfSwgKCR7Y2xzLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgaW1wSW50ZXI6ICR7KGltcEludGVyIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pID8gaW1wSW50ZXIuZ2V0TmFtZSgpIDogaW1wSW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0sICgkeyhpbXBJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGltcEludGVyLmdldFR5cGUoKS5nZXRUZXh0KCkgOiBpbXBJbnRlci5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpfSlgKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpbnRlcmZhY2VzLmZvckVhY2goaW50ZXIgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbmhlcml0YW5jZXM6IENoZWNraW5nIGludGVyZmFjZSBpbmhlcml0YW5jZSBmb3IgJHtpbnRlci5nZXROYW1lKCl9YCk7XG4gICAgICAgIGNvbnN0IGV4dGVuZGVkSW50ZXJmYWNlcyA9IGdldEltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXMoaW50ZXJmYWNlcywgaW50ZXIpO1xuICAgICAgICBleHRlbmRlZEludGVyZmFjZXMuZm9yRWFjaChleHRJbnRlciA9PiB7XG4gICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4SW5oZXJpdGFuY2UoaW50ZXIsIGV4dEludGVyKTtcblxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBpbnRlcjogJHtpbnRlci5nZXROYW1lKCl9LCAoJHtpbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dEludGVyOiAkeyhleHRJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGV4dEludGVyLmdldE5hbWUoKSA6IGV4dEludGVyLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoZXh0SW50ZXIgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBleHRJbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogZXh0SW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBvZiB0aGUgc291cmNlIGZpbGVzXG4gKiBAcGFyYW0gbWV0aG9kc0FuZEZ1bmN0aW9uc1dpdGhJZCBBIG1hcCBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2l0aCB0aGVpciBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ludm9jYXRpb25zKG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQ6IE1hcDxudW1iZXIsIE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24+KTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIGludm9jYXRpb25zOmApO1xuICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuZm9yRWFjaCgobSwgaWQpID0+IHtcbiAgICAgICAgaWYgKCEobSBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24pKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEludm9jYXRpb25zIHRvICR7KG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbikgPyBtLmdldE5hbWUoKSA6ICgobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pID8gJ2NvbnN0cnVjdG9yJyA6IChtLmdldE5hbWUoKSA/IG0uZ2V0TmFtZSgpIDogJ2Fub255bW91cycpKX1gKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcF9ub2RlcyA9IG0uZmluZFJlZmVyZW5jZXNBc05vZGVzKCkgYXMgQXJyYXk8SWRlbnRpZmllcj47XG4gICAgICAgICAgICAgICAgdGVtcF9ub2Rlcy5mb3JFYWNoKG5vZGUgPT4gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlLCBtLCBpZCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gQ29udGludWluZy4uLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGludm9jYXRpb24gb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIG4gQSBub2RlXG4gKiBAcGFyYW0gbSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NOb2RlRm9ySW52b2NhdGlvbnMobjogSWRlbnRpZmllciwgbTogTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uLCBpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEludm9jYXRpb24obiwgbSwgaWQpO1xuXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyhgbm9kZTogbm9kZSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gU2NvcGVEZWNsYXJhdGlvbiBpbnZhbGlkIGZvciAke24uZ2V0U3ltYm9sKCkhLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpfS4gQ29udGludWluZy4uLmApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGluaGVyaXRhbmNlcyBvZiB0aGUgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBvZiB0aGUgc291cmNlIGZpbGVzXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXG4gKiBAcGFyYW0gaW50ZXJmYWNlcyBBbiBhcnJheSBvZiBpbnRlcmZhY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uY3JldGlzYXRpb25zKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSwgZnVuY3Rpb25zOiBNYXA8bnVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uPik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDcmVhdGluZyBjb25jcmV0aXNhdGlvbnM6YCk7XG4gICAgY2xhc3Nlcy5mb3JFYWNoKGNscyA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0NvbmNyZXRpc2F0aW9uczogQ2hlY2tpbmcgY2xhc3MgY29uY3JldGlzYXRpb24gZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcbiAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uQ2xhc3NPckludGVyZmFjZVNwZWNpYWxpc2F0aW9uKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkdlbmVyaWNJbnN0YW50aWF0aW9uKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGNscyk7IFxuXG4gICAgfSk7XG4gICAgaW50ZXJmYWNlcy5mb3JFYWNoKGludGVyID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBpbnRlcmZhY2UgY29uY3JldGlzYXRpb24gZm9yICR7aW50ZXIuZ2V0TmFtZSgpfWApO1xuICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25UeXBlSW5zdGFuY2lhdGlvbihpbnRlcik7IFxuICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oaW50ZXIpXG4gICAgfSk7XG4gICAgZnVuY3Rpb25zLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgIGlmKGZ1bmMgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uIHx8IGZ1bmMgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiApe1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBNZXRob2QgY29uY3JldGlzYXRpb25gKTtcbiAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkZ1bmN0aW9uSW5zdGFudGlhdGlvbihmdW5jKTtcbiAgICAgICAgfVxuICAgIH0pXG59XG4iXX0=
|
|
886
|
+
// export function processConcretisations(classes: ClassDeclaration[], interfaces: InterfaceDeclaration[], functions: Map<number, MethodDeclaration | ConstructorDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | FunctionDeclaration | FunctionExpression | ArrowFunction>): void {
|
|
887
|
+
// logger.info(`processConcretisations: Creating concretisations:`);
|
|
888
|
+
// classes.forEach(cls => {
|
|
889
|
+
// logger.debug(`processConcretisations: Checking class concretisation for ${cls.getName()}`);
|
|
890
|
+
// entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(cls);
|
|
891
|
+
// entityDictionary.createFamixConcretisationGenericInstantiation(cls);
|
|
892
|
+
// entityDictionary.createFamixConcretisationInterfaceClass(cls);
|
|
893
|
+
// entityDictionary.createFamixConcretisationTypeInstanciation(cls);
|
|
894
|
+
// });
|
|
895
|
+
// interfaces.forEach(inter => {
|
|
896
|
+
// logger.debug(`processConcretisations: Checking interface concretisation for ${inter.getName()}`);
|
|
897
|
+
// entityDictionary.createFamixConcretisationTypeInstanciation(inter);
|
|
898
|
+
// entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(inter);
|
|
899
|
+
// });
|
|
900
|
+
// functions.forEach(func => {
|
|
901
|
+
// if(func instanceof FunctionDeclaration || func instanceof MethodDeclaration ){
|
|
902
|
+
// logger.debug(`processConcretisations: Checking Method concretisation`);
|
|
903
|
+
// entityDictionary.createFamixConcretisationFunctionInstantiation(func);
|
|
904
|
+
// }
|
|
905
|
+
// });
|
|
906
|
+
// }
|
|
907
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc19mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZV9mdW5jdGlvbnMvcHJvY2Vzc19mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBLHNDQWNDO0FBUUQsZ0ZBc0JDO0FBTUQsb0NBWUM7QUFxQ0QsOEJBR0M7QUFFRCxrQ0FJQztBQThvQkQsMENBV0M7QUE0QkQsMEdBeUJDO0FBT0Qsd0VBbURDO0FBaUJELGtEQXVDQztBQU1ELGdEQWdCQztBQXArQkQsdUNBQW9sQjtBQUNwbEIsZ0VBQWtEO0FBQ2xELDZFQUFpRTtBQUNqRSx1Q0FBeUI7QUFDekIsd0NBQXNEO0FBQ3RELGdDQUFnQztBQU1uQixRQUFBLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDLENBQUMsK0lBQStJO0FBRTdNLFFBQUEsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFxQyxDQUFDLENBQUMsd0lBQXdJO0FBQ2xNLFFBQUEsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQixDQUFDLENBQUMsK0NBQStDO0FBQ3hGLFFBQUEsVUFBVSxHQUFHLElBQUksS0FBSyxFQUF3QixDQUFDLENBQUMsa0RBQWtEO0FBQ2xHLFFBQUEsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFjLENBQUMsQ0FBQyxrREFBa0Q7QUFDckYsUUFBQSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBK0MsQ0FBQyxDQUFDLCtCQUErQjtBQUd6SDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxVQUFzQjtJQUMvQyxPQUFPLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FB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RSxNQUFNLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2SCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLGdCQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLGtDQUFrQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUcsQ0FBQyxxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BLLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILG1TQUFtUztBQUNuUyx3RUFBd0U7QUFDeEUsK0JBQStCO0FBQy9CLHNHQUFzRztBQUN0Ryx5RkFBeUY7QUFDekYsK0VBQStFO0FBQy9FLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFFNUUsVUFBVTtBQUNWLG9DQUFvQztBQUNwQyw0R0FBNEc7QUFDNUcsOEVBQThFO0FBQzlFLDJGQUEyRjtBQUMzRixVQUFVO0FBQ1Ysa0NBQWtDO0FBQ2xDLHlGQUF5RjtBQUN6RixzRkFBc0Y7QUFDdEYscUZBQXFGO0FBQ3JGLFlBQVk7QUFDWixVQUFVO0FBQ1YsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBWYXJpYWJsZVN0YXRlbWVudCwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFNvdXJjZUZpbGUsIE1vZHVsZURlY2xhcmF0aW9uLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgRGVjb3JhdG9yLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBFeHBvcnRlZERlY2xhcmF0aW9ucywgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiwgQmxvY2ssIElkZW50aWZpZXIsIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSW1wb3J0RGVjbGFyYXRpb24sIE5vZGUsIEFycm93RnVuY3Rpb24sIFNjb3BlLCBDbGFzc0V4cHJlc3Npb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcclxuaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xyXG5pbXBvcnQgeyBjYWxjdWxhdGUgfSBmcm9tIFwiLi4vbGliL3RzLWNvbXBsZXgvY3ljbG9tYXRpYy1zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgbG9nZ2VyLCBlbnRpdHlEaWN0aW9uYXJ5IH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcclxuaW1wb3J0IHsgZ2V0RlFOIH0gZnJvbSBcIi4uL2ZxblwiO1xyXG5pbXBvcnQgeyBJbnZvY2FibGVUeXBlIH0gZnJvbSBcInNyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeVwiO1xyXG5cclxuZXhwb3J0IHR5cGUgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50ID0gUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IEVudW1NZW1iZXI7XHJcbmV4cG9ydCB0eXBlIEZhbWl4SUQgPSBudW1iZXI7XHJcblxyXG5leHBvcnQgY29uc3QgbWV0aG9kc0FuZEZ1bmN0aW9uc1dpdGhJZCA9IG5ldyBNYXA8bnVtYmVyLCBJbnZvY2FibGVUeXBlPigpOyAvLyBNYXBzIHRoZSBGYW1peCBtZXRob2QsIGNvbnN0cnVjdG9yLCBnZXR0ZXIsIHNldHRlciBhbmQgZnVuY3Rpb24gaWRzIHRvIHRoZWlyIHRzLW1vcnBoIG1ldGhvZCwgY29uc3RydWN0b3IsIGdldHRlciwgc2V0dGVyIG9yIGZ1bmN0aW9uIG9iamVjdFxyXG5cclxuZXhwb3J0IGNvbnN0IGFjY2Vzc01hcCA9IG5ldyBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50PigpOyAvLyBNYXBzIHRoZSBGYW1peCBwYXJhbWV0ZXIsIHZhcmlhYmxlLCBwcm9wZXJ0eSBhbmQgZW51bSB2YWx1ZSBpZHMgdG8gdGhlaXIgdHMtbW9ycGggcGFyYW1ldGVyLCB2YXJpYWJsZSwgcHJvcGVydHkgb3IgZW51bSBtZW1iZXIgb2JqZWN0XHJcbmV4cG9ydCBjb25zdCBjbGFzc2VzID0gbmV3IEFycmF5PENsYXNzRGVjbGFyYXRpb24+KCk7IC8vIEFycmF5IG9mIGFsbCB0aGUgY2xhc3NlcyBvZiB0aGUgc291cmNlIGZpbGVzXHJcbmV4cG9ydCBjb25zdCBpbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG5leHBvcnQgY29uc3QgbW9kdWxlcyA9IG5ldyBBcnJheTxTb3VyY2VGaWxlPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbW9kdWxlc1xyXG5leHBvcnQgY29uc3QgbGlzdE9mRXhwb3J0TWFwcyA9IG5ldyBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+PigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGV4cG9ydCBtYXBzXHJcbmV4cG9ydCBsZXQgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvLyBTdG9yZXMgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIGZvciB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgZmlsZSBoYXMgYW55IGltcG9ydHMgb3IgZXhwb3J0cyB0byBiZSBjb25zaWRlcmVkIGEgbW9kdWxlXHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIEEgc291cmNlIGZpbGVcclxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGZpbGUgaXMgYSBtb2R1bGVcclxuICovXHJcbmZ1bmN0aW9uIGlzU291cmNlRmlsZUFNb2R1bGUoc291cmNlRmlsZTogU291cmNlRmlsZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNvdXJjZUZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCkubGVuZ3RoID4gMCB8fCBzb3VyY2VGaWxlLmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCkuc2l6ZSA+IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBwYXRoIG9mIGEgbW9kdWxlIHRvIGJlIGltcG9ydGVkXHJcbiAqIEBwYXJhbSBpbXBvcnREZWNsIEFuIGltcG9ydCBkZWNsYXJhdGlvblxyXG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgbW9kdWxlIHRvIGJlIGltcG9ydGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlUGF0aChpbXBvcnREZWNsOiBJbXBvcnREZWNsYXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0aDogc3RyaW5nO1xyXG4gICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLnN1YnN0cmluZyhpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkubGVuZ3RoIC0gMykgPT09IFwiLnRzXCIpIHtcclxuICAgICAgICAgICAgcGF0aCA9IGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgKyBcIi50c1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKSEuZ2V0RmlsZVBhdGgoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBhIGNsYXNzIG9yIGFuIGludGVyZmFjZVxyXG4gKiBAcGFyYW0gaW50ZXJmYWNlcyBBbiBhcnJheSBvZiBpbnRlcmZhY2VzXHJcbiAqIEBwYXJhbSBzdWJDbGFzcyBBIGNsYXNzIG9yIGFuIGludGVyZmFjZVxyXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiBhbmQgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgdGhlIHN1YkNsYXNzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcyhpbnRlcmZhY2VzOiBBcnJheTxJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIHN1YkNsYXNzOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBBcnJheTxJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4ge1xyXG4gICAgbGV0IGltcE9yRXh0SW50ZXJmYWNlczogQXJyYXk8RXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPjtcclxuICAgIGlmIChzdWJDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICBpbXBPckV4dEludGVyZmFjZXMgPSBzdWJDbGFzcy5nZXRJbXBsZW1lbnRzKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpbXBPckV4dEludGVyZmFjZXMgPSBzdWJDbGFzcy5nZXRFeHRlbmRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW50ZXJmYWNlc05hbWVzID0gaW50ZXJmYWNlcy5tYXAoaSA9PiBpLmdldE5hbWUoKSk7XHJcbiAgICBjb25zdCBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPigpO1xyXG5cclxuICAgIGltcE9yRXh0SW50ZXJmYWNlcy5mb3JFYWNoKGkgPT4ge1xyXG4gICAgICAgIGlmIChpbnRlcmZhY2VzTmFtZXMuaW5jbHVkZXMoaS5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpKSkge1xyXG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlc1tpbnRlcmZhY2VzTmFtZXMuaW5kZXhPZihpLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCkpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzXHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlcyBBbiBhcnJheSBvZiBzb3VyY2UgZmlsZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZXMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+KTogdm9pZCB7XHJcbiAgICBzb3VyY2VGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5pbmZvKGBGaWxlOiA+Pj4+Pj4+Pj4+ICR7ZmlsZS5nZXRGaWxlUGF0aCgpfWApO1xyXG5cclxuICAgICAgICAvLyBDb21wdXRlcyB0aGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG1ldHJpY3MgZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlmIGl0IGV4aXN0cyAoaS5lLiBpZiBpdCBpcyBub3QgZnJvbSBhIGplc3QgdGVzdClcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlLmdldEZpbGVQYXRoKCkpKVxyXG4gICAgICAgICAgICBjdXJyZW50Q0MgPSBjYWxjdWxhdGUoZmlsZS5nZXRGaWxlUGF0aCgpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGN1cnJlbnRDQyA9IHt9O1xyXG5cclxuICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgc291cmNlIGZpbGVcclxuICogQHBhcmFtIGYgQSBzb3VyY2UgZmlsZVxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoZjogU291cmNlRmlsZSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNNb2R1bGUgPSBpc1NvdXJjZUZpbGVBTW9kdWxlKGYpO1xyXG5cclxuICAgIGlmIChpc01vZHVsZSkge1xyXG4gICAgICAgIG1vZHVsZXMucHVzaChmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBleHBvcnRNYXAgPSBmLmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCk7XHJcbiAgICBpZiAoZXhwb3J0TWFwKSBsaXN0T2ZFeHBvcnRNYXBzLnB1c2goZXhwb3J0TWFwKTtcclxuXHJcbiAgICBjb25zdCBmbXhGaWxlID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4RmlsZShmLCBpc01vZHVsZSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzRmlsZTogZmlsZTogJHtmLmdldEJhc2VOYW1lKCl9LCBmcW4gPSAke2ZteEZpbGUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQWxpYXNlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQ2xhc3NlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzSW50ZXJmYWNlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzVmFyaWFibGVzKGYsIGZteEZpbGUpO1xyXG5cclxuICAgIHByb2Nlc3NFbnVtcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzRnVuY3Rpb25zKGYsIGZteEZpbGUpO1xyXG5cclxuICAgIHByb2Nlc3NNb2R1bGVzKGYsIGZteEZpbGUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNBbWJpZW50KG5vZGU6IE1vZHVsZURlY2xhcmF0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAvLyBBbiBhbWJpZW50IG1vZHVsZSBoYXMgdGhlIERlY2xhcmVLZXl3b3JkIG1vZGlmaWVyLlxyXG4gICAgcmV0dXJuIChub2RlLmdldE1vZGlmaWVycygpPy5zb21lKG1vZGlmaWVyID0+IG1vZGlmaWVyLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5EZWNsYXJlS2V5d29yZCkpID8/IGZhbHNlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lc3BhY2Uobm9kZTogTW9kdWxlRGVjbGFyYXRpb24pOiBib29sZWFuIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24gaGFzIGEgbmFtZXNwYWNlIGtleXdvcmQuXHJcbiAgICAvLyBUaGlzIGFwcHJvYWNoIHVzZXMgdGhlIGdldENoaWxkcmVuKCkgbWV0aG9kIHRvIGluc3BlY3QgdGhlIHN5bnRheCBkaXJlY3RseS5cclxuICAgIHJldHVybiBub2RlLmdldENoaWxkcmVuT2ZLaW5kKFN5bnRheEtpbmQuTmFtZXNwYWNlS2V5d29yZCkubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIG1vZHVsZSAoYWxzbyBuYW1lc3BhY2UpXHJcbiAqIEBwYXJhbSBtIEEgbmFtZXNwYWNlXHJcbiAqIEByZXR1cm5zIEEgRmFtaXguTW9kdWxlIHJlcHJlc2VudGluZyB0aGUgbW9kdWxlXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzTW9kdWxlKG06IE1vZHVsZURlY2xhcmF0aW9uKTogRmFtaXguTW9kdWxlIHtcclxuICAgIGNvbnN0IGZteE1vZHVsZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1vZHVsZShtKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYG1vZHVsZTogJHttLmdldE5hbWUoKX0sICgke20uZ2V0VHlwZSgpLmdldFRleHQoKX0pLCAke2ZteE1vZHVsZS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKG0sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgcHJvY2Vzc0FsaWFzZXMobSwgZm14TW9kdWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQ2xhc3NlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NJbnRlcmZhY2VzKG0sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NFbnVtcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NGdW5jdGlvbnMobSwgZm14TW9kdWxlKTtcclxuXHJcbiAgICBwcm9jZXNzTW9kdWxlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHJldHVybiBmbXhNb2R1bGU7XHJcbn1cclxuXHJcbnR5cGUgQ29udGFpbmVyVHlwZXMgPSBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uO1xyXG5cclxudHlwZSBTY29wZWRUeXBlcyA9IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSB8IEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3I7XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhbGlhc2VzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlLCBhIG5hbWVzcGFjZSwgYSBmdW5jdGlvbiBvciBhIG1ldGhvZClcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQWxpYXNlcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NBbGlhc2VzOiAtLS0tLS0tLS0tIEZpbmRpbmcgQWxpYXNlczpgKTtcclxuICAgIG0uZ2V0VHlwZUFsaWFzZXMoKS5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteEFsaWFzID0gcHJvY2Vzc0FsaWFzKGEpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEFsaWFzKGZteEFsaWFzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBjbGFzc2VzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NDbGFzc2VzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ2xhc3NlczogLS0tLS0tLS0tLSBGaW5kaW5nIENsYXNzZXM6YCk7XHJcbiAgICBjb25zdCBjbGFzc2VzSW5BcnJvd0Z1bmN0aW9ucyA9IGdldENsYXNzZXNEZWNsYXJlZEluQXJyb3dGdW5jdGlvbnMobSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gbS5nZXRDbGFzc2VzKCkuY29uY2F0KGNsYXNzZXNJbkFycm93RnVuY3Rpb25zKTtcclxuICAgIGNsYXNzZXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhDbGFzcyA9IHByb2Nlc3NDbGFzcyhjKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteENsYXNzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcnJvd0Z1bmN0aW9uQ2xhc3NlcyhmOiBBcnJvd0Z1bmN0aW9uKTogQ2xhc3NEZWNsYXJhdGlvbltdIHtcclxuICAgIGNvbnN0IGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSA9IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGZpbmRDbGFzc2VzKG5vZGU6IE5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gobm9kZSBhcyBDbGFzc0RlY2xhcmF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goZmluZENsYXNzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRDbGFzc2VzKGYpO1xyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cy1tb3JwaCBkb2Vzbid0IGZpbmQgY2xhc3NlcyBpbiBhcnJvdyBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG8gZmluZCB0aGVtIG1hbnVhbGx5XHJcbiAqIEBwYXJhbSBzIEEgc291cmNlIGZpbGUgXHJcbiAqIEByZXR1cm5zIHRoZSBDbGFzc0RlY2xhcmF0aW9uIG9iamVjdHMgZm91bmQgaW4gYXJyb3cgZnVuY3Rpb25zIG9mIHRoZSBzb3VyY2UgZmlsZVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q2xhc3Nlc0RlY2xhcmVkSW5BcnJvd0Z1bmN0aW9ucyhzOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24pOiBDbGFzc0RlY2xhcmF0aW9uW10ge1xyXG4gICAgY29uc3QgYXJyb3dGdW5jdGlvbnMgPSBzLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XHJcbiAgICBjb25zdCBjbGFzc2VzSW5BcnJvd0Z1bmN0aW9ucyA9IGFycm93RnVuY3Rpb25zLm1hcChmID0+IGdldEFycm93RnVuY3Rpb25DbGFzc2VzKGYpKS5mbGF0KCk7XHJcbiAgICByZXR1cm4gY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGludGVyZmFjZXMgb2YgYSBjb250YWluZXJcclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUgb3IgYSBuYW1lc3BhY2UpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0ludGVyZmFjZXMobTogU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbnRlcmZhY2VzOiAtLS0tLS0tLS0tIEZpbmRpbmcgSW50ZXJmYWNlczpgKTtcclxuICAgIG0uZ2V0SW50ZXJmYWNlcygpLmZvckVhY2goaSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14SW50ZXJmYWNlID0gcHJvY2Vzc0ludGVyZmFjZShpKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteEludGVyZmFjZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdmFyaWFibGVzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlLCBhIG5hbWVzcGFjZSwgYSBmdW5jdGlvbiBvciBhIG1ldGhvZClcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzVmFyaWFibGVzKG06IENvbnRhaW5lclR5cGVzLCBmbXhTY29wZTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlIHwgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3Nvcik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzVmFyaWFibGVzOiAtLS0tLS0tLS0tIEZpbmRpbmcgVmFyaWFibGVzOmApO1xyXG4gICAgbS5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKS5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFZhcmlhYmxlcyA9IHByb2Nlc3NWYXJpYWJsZVN0YXRlbWVudCh2KTtcclxuICAgICAgICBmbXhWYXJpYWJsZXMuZm9yRWFjaChmbXhWYXJpYWJsZSA9PiB7XHJcbiAgICAgICAgICAgIGZteFNjb3BlLmFkZFZhcmlhYmxlKGZteFZhcmlhYmxlKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBlbnVtcyBvZiBhIGNvbnRhaW5lclxyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSwgYSBuYW1lc3BhY2UsIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0VudW1zKG06IENvbnRhaW5lclR5cGVzLCBmbXhTY29wZTogU2NvcGVkVHlwZXMpOiB2b2lkIHtcclxuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0VudW1zOiAtLS0tLS0tLS0tIEZpbmRpbmcgRW51bXM6YCk7XHJcbiAgICBtLmdldEVudW1zKCkuZm9yRWFjaChlID0+IHtcclxuICAgICAgICBjb25zdCBmbXhFbnVtID0gcHJvY2Vzc0VudW0oZSk7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkVHlwZShmbXhFbnVtKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBmdW5jdGlvbnMgb2YgYSBjb250YWluZXJcclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NGdW5jdGlvbnMobTogQ29udGFpbmVyVHlwZXMsIGZteFNjb3BlOiBTY29wZWRUeXBlcyk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcclxuICAgIG0uZ2V0RnVuY3Rpb25zKCkuZm9yRWFjaChmID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jdGlvbiA9IHByb2Nlc3NGdW5jdGlvbihmKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL2ZpbmQgYXJyb3cgZnVuY3Rpb25zXHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgRnVuY3Rpb25zOmApO1xyXG4gICAgY29uc3QgYXJyb3dGdW5jdGlvbnMgPSBtLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XHJcbiAgICBhcnJvd0Z1bmN0aW9ucy5mb3JFYWNoKGFmID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jdGlvbiA9IHByb2Nlc3NGdW5jdGlvbihhZik7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkRnVuY3Rpb24oZm14RnVuY3Rpb24pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIG1vZHVsZXMgb2YgYSBjb250YWluZXIuXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NNb2R1bGVzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIE1vZHVsZXM6YCk7XHJcbiAgICBtLmdldE1vZHVsZXMoKS5mb3JFYWNoKG1kID0+IHtcclxuICAgICAgICBjb25zdCBmbXhNb2R1bGUgPSBwcm9jZXNzTW9kdWxlKG1kKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRNb2R1bGUoZm14TW9kdWxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGFsaWFzXHJcbiAqIEBwYXJhbSBhIEFuIGFsaWFzXHJcbiAqIEByZXR1cm5zIEEgRmFtaXguQWxpYXMgcmVwcmVzZW50aW5nIHRoZSBhbGlhc1xyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0FsaWFzKGE6IFR5cGVBbGlhc0RlY2xhcmF0aW9uKTogRmFtaXguQWxpYXMge1xyXG4gICAgY29uc3QgZm14QWxpYXMgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4QWxpYXMoYSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBBbGlhczogJHthLmdldE5hbWUoKX0sICgke2EuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEFsaWFzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHMoYSwgZm14QWxpYXMpO1xyXG5cclxuICAgIHJldHVybiBmbXhBbGlhcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGNsYXNzXHJcbiAqIEBwYXJhbSBjIEEgY2xhc3NcclxuICogQHJldHVybnMgQSBGYW1peC5DbGFzcyBvciBhIEZhbWl4LlBhcmFtZXRyaWNDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNsYXNzXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3MoYzogQ2xhc3NEZWNsYXJhdGlvbik6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHtcclxuICAgIGNsYXNzZXMucHVzaChjKTtcclxuXHJcbiAgICBjb25zdCBmbXhDbGFzcyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peENsYXNzKGMpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhc3M6ICR7Yy5nZXROYW1lKCl9LCAoJHtjLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhDbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGMsIGZteENsYXNzKTtcclxuXHJcbiAgICBwcm9jZXNzRGVjb3JhdG9ycyhjLCBmbXhDbGFzcyk7XHJcblxyXG4gICAgcHJvY2Vzc1N0cnVjdHVyZWRUeXBlKGMsIGZteENsYXNzKTtcclxuXHJcbiAgICBjLmdldENvbnN0cnVjdG9ycygpLmZvckVhY2goY29uID0+IHtcclxuICAgICAgICBjb25zdCBmbXhDb24gPSBwcm9jZXNzTWV0aG9kKGNvbik7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteENvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjLmdldEdldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhBY2MgPSBwcm9jZXNzTWV0aG9kKGFjYyk7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteEFjYyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjLmdldFNldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhBY2MgPSBwcm9jZXNzTWV0aG9kKGFjYyk7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteEFjYyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZm14Q2xhc3M7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gaW50ZXJmYWNlXHJcbiAqIEBwYXJhbSBpIEFuIGludGVyZmFjZVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LkludGVyZmFjZSBvciBhIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBpbnRlcmZhY2VcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NJbnRlcmZhY2UoaTogSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHtcclxuICAgIGludGVyZmFjZXMucHVzaChpKTtcclxuXHJcbiAgICBjb25zdCBmbXhJbnRlcmZhY2UgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBJbnRlcmZhY2U6ICR7aS5nZXROYW1lKCl9LCAoJHtpLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhJbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhpLCBmbXhJbnRlcmZhY2UpO1xyXG5cclxuICAgIHByb2Nlc3NTdHJ1Y3R1cmVkVHlwZShpLCBmbXhJbnRlcmZhY2UpO1xyXG5cclxuICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycywgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhIHN0cnVjdHVyZWQgdHlwZVxyXG4gKiBAcGFyYW0gYyBBIHN0cnVjdHVyZWQgdHlwZSAoYSBjbGFzcyBvciBhbiBpbnRlcmZhY2UpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZVxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc1N0cnVjdHVyZWRUeXBlKGM6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIFByb3BlcnRpZXMgYW5kIE1ldGhvZHM6YCk7XHJcbiAgICBpZiAoZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfHwgZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGMsIGZteFNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICBjLmdldFByb3BlcnRpZXMoKS5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFByb3BlcnR5ID0gcHJvY2Vzc1Byb3BlcnR5KHByb3ApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZFByb3BlcnR5KGZteFByb3BlcnR5KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGMuZ2V0TWV0aG9kcygpLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14TWV0aG9kID0gcHJvY2Vzc01ldGhvZChtKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRNZXRob2QoZm14TWV0aG9kKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIHAgQSBwcm9wZXJ0eVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlByb3BlcnR5IHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHlcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0eShwOiBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUpOiBGYW1peC5Qcm9wZXJ0eSB7XHJcbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYHByb3BlcnR5OiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG4gICAgbG9nZ2VyLmRlYnVnKGAgLS0tPiBJdCdzIGEgUHJvcGVydHkkeyhwIGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmUpID8gXCJTaWduYXR1cmVcIiA6IFwiRGVjbGFyYXRpb25cIn0hYCk7XHJcbiAgICBjb25zdCBhbmNlc3RvciA9IHAuZ2V0Rmlyc3RBbmNlc3Rvck9yVGhyb3coKTtcclxuICAgIGxvZ2dlci5kZWJ1ZyhgIC0tLT4gSXRzIGZpcnN0IGFuY2VzdG9yIGlzIGEgJHthbmNlc3Rvci5nZXRLaW5kTmFtZSgpfWApO1xyXG5cclxuICAgIC8vIGRlY29yYXRvcnNcclxuICAgIGlmICghKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNpZ25hdHVyZSkpIHtcclxuICAgICAgICBwcm9jZXNzRGVjb3JhdG9ycyhwLCBmbXhQcm9wZXJ0eSk7XHJcbiAgICAgICAgLy8gb25seSBhZGQgYWNjZXNzIGlmIHRoZSBwJ3MgZmlyc3QgYW5jZXN0b3IgaXMgbm90IGEgUHJvcGVydHlEZWNsYXJhdGlvblxyXG4gICAgICAgIGlmIChhbmNlc3Rvci5nZXRLaW5kTmFtZSgpICE9PSBcIlByb3BlcnR5RGVjbGFyYXRpb25cIikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3MgdG8gbWFwOiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhQcm9wZXJ0eS5uYW1lfSBpZDogJHtmbXhQcm9wZXJ0eS5pZH1gKTtcclxuICAgICAgICAgICAgYWNjZXNzTWFwLnNldChmbXhQcm9wZXJ0eS5pZCwgcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhwLCBmbXhQcm9wZXJ0eSk7XHJcblxyXG4gICAgcmV0dXJuIGZteFByb3BlcnR5O1xyXG59XHJcblxyXG4vKipcclxuICAgICAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIG1ldGhvZCBvciBhbiBhY2Nlc3NvclxyXG4gICAgICogQHBhcmFtIG0gQSBtZXRob2Qgb3IgYW4gYWNjZXNzb3JcclxuICAgICAqIEByZXR1cm5zIEEgRmFtaXguTWV0aG9kIG9yIGEgRmFtaXguQWNjZXNzb3IgcmVwcmVzZW50aW5nIHRoZSBtZXRob2Qgb3IgdGhlIGFjY2Vzc29yXHJcbiAgICAgKi9cclxuZnVuY3Rpb24gcHJvY2Vzc01ldGhvZChtOiBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbik6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHtcclxuICAgIGNvbnN0IGZteE1ldGhvZCA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1ldGhvZChtLCBjdXJyZW50Q0MpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgTWV0aG9kOiAkeyEobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pID8gbS5nZXROYW1lKCkgOiBcImNvbnN0cnVjdG9yXCJ9LCAoJHttLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgcGFyZW50OiAkeyhtLmdldFBhcmVudCgpIGFzIENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbikuZ2V0TmFtZSgpfSwgZnFuID0gJHtmbXhNZXRob2QuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgIHByb2Nlc3NQYXJhbWV0ZXJzKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgaWYgKCEobSBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcclxuICAgICAgICBwcm9jZXNzQWxpYXNlcyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgICAgICBwcm9jZXNzVmFyaWFibGVzKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIHByb2Nlc3NFbnVtcyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgICAgICBwcm9jZXNzRnVuY3Rpb25zKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIHByb2Nlc3NGdW5jdGlvbkV4cHJlc3Npb25zKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuc2V0KGZteE1ldGhvZC5pZCwgbSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIHByb2Nlc3NEZWNvcmF0b3JzKG0sIGZteE1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZteE1ldGhvZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBmIEEgZnVuY3Rpb25cclxuICogQHJldHVybnMgQSBGYW1peC5GdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRnVuY3Rpb24oZjogRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24pOiBGYW1peC5GdW5jdGlvbiB7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBGdW5jdGlvbjogJHsoZiBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24gPyBcImFub255bW91c1wiIDogZi5nZXROYW1lKCkgPyBmLmdldE5hbWUoKSA6IFwiYW5vbnltb3VzXCIpfSwgKCR7Zi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Z2V0RlFOKGYpfWApO1xyXG5cclxuICAgIGxldCBmbXhGdW5jdGlvbjtcclxuICAgIGlmIChmIGluc3RhbmNlb2YgQXJyb3dGdW5jdGlvbikge1xyXG4gICAgICAgIGZteEZ1bmN0aW9uID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4QXJyb3dGdW5jdGlvbihmLCBjdXJyZW50Q0MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmbXhGdW5jdGlvbiA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGYsIGN1cnJlbnRDQyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzQWxpYXNlcyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzUGFyYW1ldGVycyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc0VudW1zKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzRnVuY3Rpb25zKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBpZiAoZiBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24gJiYgIShmLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQmxvY2spKSB7XHJcbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRXhwcmVzc2lvbnMoZiwgZm14RnVuY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuc2V0KGZteEZ1bmN0aW9uLmlkLCBmKTtcclxuXHJcbiAgICByZXR1cm4gZm14RnVuY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb25zIG9mIGEgZnVuY3Rpb24gb3IgYSBtZXRob2RcclxuICogQHBhcmFtIGYgQSBmdW5jdGlvbiBvciBhIG1ldGhvZFxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgbWV0aG9kXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRnVuY3Rpb25FeHByZXNzaW9ucyhmOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgRnVuY3Rpb24gRXhwcmVzc2lvbnM6YCk7XHJcbiAgICBjb25zdCBmdW5jdGlvbkV4cHJlc3Npb25zID0gZi5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbik7XHJcbiAgICBmdW5jdGlvbkV4cHJlc3Npb25zLmZvckVhY2goKGZ1bmMpID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jID0gcHJvY2Vzc0Z1bmN0aW9uKGZ1bmMpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEZ1bmN0aW9uKGZteEZ1bmMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gbSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJzKG06IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24sIGZteFNjb3BlOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LkZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgUGFyYW1ldGVyczpgKTtcclxuICAgIG0uZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gcHJvY2Vzc1BhcmFtZXRlcihwYXJhbSk7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkUGFyYW1ldGVyKGZteFBhcmFtKTtcclxuICAgICAgICAvLyBBZGRpdGlvbmFsIGhhbmRsaW5nIGZvciBQYXJhbWV0ZXIgUHJvcGVydGllcyBpbiBjb25zdHJ1Y3RvcnNcclxuICAgICAgICBpZiAobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBoYXMgYW55IHZpc2liaWxpdHkgbW9kaWZpZXJcclxuICAgICAgICAgICAgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHx8IHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgfHwgcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSB8fCBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzT2ZDb25zdHJ1Y3RvciA9IG0uZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUGFyYW1ldGVyIFByb3BlcnR5ICR7cGFyYW0uZ2V0TmFtZSgpfSBpbiBjb25zdHJ1Y3RvciBvZiAke2NsYXNzT2ZDb25zdHJ1Y3Rvci5nZXROYW1lKCl9LmApO1xyXG4gICAgICAgICAgICAgICAgLy8gVHJlYXQgdGhlIHBhcmFtZXRlciBhcyBhIHByb3BlcnR5IGFuZCBhZGQgaXQgdG8gdGhlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtLCBjbGFzc09mQ29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgZm14UHJvcGVydHkucmVhZE9ubHkgPSBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNyZWF0ZSBhIEZhbWl4LlByb3BlcnR5IG1vZGVsIGZyb20gYSBQYXJhbWV0ZXJEZWNsYXJhdGlvblxyXG4vLyBZb3UnbGwgbmVlZCB0byBpbXBsZW1lbnQgaXQgYWNjb3JkaW5nIHRvIHlvdXIgRmFtaXggbW9kZWwgc3RydWN0dXJlXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY2xhc3NEZWNsOiBDbGFzc0RlY2xhcmF0aW9uIHwgQ2xhc3NFeHByZXNzaW9uKTogRmFtaXguUHJvcGVydHkge1xyXG4gICAgLy8gQ29udmVydCB0aGUgcGFyYW1ldGVyIGludG8gYSBQcm9wZXJ0eVxyXG4gICAgY29uc3QgcHJvcGVydHlSZXByZXNlbnRhdGlvbiA9IGNvbnZlcnRQYXJhbWV0ZXJUb1Byb3BlcnR5UmVwcmVzZW50YXRpb24ocGFyYW0pO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHNvIHdlIGNhbiBoYXZlIGEgUHJvcGVydHlEZWNsYXJhdGlvbiBvYmplY3RcclxuICAgIGNsYXNzRGVjbC5hZGRQcm9wZXJ0eShwcm9wZXJ0eVJlcHJlc2VudGF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGNsYXNzRGVjbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eVJlcHJlc2VudGF0aW9uLm5hbWUpO1xyXG4gICAgaWYgKCFwcm9wZXJ0eSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wZXJ0eVJlcHJlc2VudGF0aW9uLm5hbWV9IG5vdCBmb3VuZCBpbiBjbGFzcyAke2NsYXNzRGVjbC5nZXROYW1lKCl9YCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwcm9wZXJ0eSk7XHJcbiAgICBpZiAoY2xhc3NEZWNsIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGZteENsYXNzID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xhc3NEZWNsKTtcclxuICAgICAgICBmbXhDbGFzcy5hZGRQcm9wZXJ0eShmbXhQcm9wZXJ0eSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdHlwZSBDbGFzc0V4cHJlc3Npb24uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhwcm9wZXJ0eSwgZm14UHJvcGVydHkpO1xyXG5cclxuICAgIC8vIHJlbW92ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgY2xhc3NcclxuICAgIHByb3BlcnR5LnJlbW92ZSgpO1xyXG5cclxuICAgIHJldHVybiBmbXhQcm9wZXJ0eTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRQYXJhbWV0ZXJUb1Byb3BlcnR5UmVwcmVzZW50YXRpb24ocGFyYW06IFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XHJcbiAgICAvLyBFeHRyYWN0IG5hbWVcclxuICAgIGNvbnN0IHBhcmFtTmFtZSA9IHBhcmFtLmdldE5hbWUoKTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHR5cGVcclxuICAgIGNvbnN0IHBhcmFtVHlwZSA9IHBhcmFtLmdldFR5cGUoKS5nZXRUZXh0KHBhcmFtKTtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgdmlzaWJpbGl0eVxyXG4gICAgbGV0IHNjb3BlOiBTY29wZTtcclxuICAgIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xyXG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJpdmF0ZTtcclxuICAgIH0gZWxzZSBpZiAocGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xyXG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJvdGVjdGVkO1xyXG4gICAgfSBlbHNlIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpKSB7XHJcbiAgICAgICAgc2NvcGUgPSBTY29wZS5QdWJsaWM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIHByb3BlcnR5ICR7cGFyYW1OYW1lfSBpbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGEgdmlzaWJpbGl0eSBtb2RpZmllci5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgaWYgcmVhZG9ubHlcclxuICAgIGNvbnN0IGlzUmVhZG9ubHkgPSBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5XHJcbiAgICBjb25zdCBwcm9wZXJ0eVJlcHJlc2VudGF0aW9uID0ge1xyXG4gICAgICAgIG5hbWU6IHBhcmFtTmFtZSxcclxuICAgICAgICB0eXBlOiBwYXJhbVR5cGUsXHJcbiAgICAgICAgc2NvcGU6IHNjb3BlLFxyXG4gICAgICAgIGlzUmVhZG9ubHk6IGlzUmVhZG9ubHksXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBwcm9wZXJ0eVJlcHJlc2VudGF0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcGFyYW1ldGVyXHJcbiAqIEBwYXJhbSBwYXJhbURlY2wgQSBwYXJhbWV0ZXJcclxuICogQHJldHVybnMgQSBGYW1peC5QYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXIocGFyYW1EZWNsOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbik6IEZhbWl4LlBhcmFtZXRlciB7XHJcbiAgICBjb25zdCBmbXhQYXJhbSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlcihwYXJhbURlY2wpOyAgLy8gY3JlYXRlIG9yIEdFVFxyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgcGFyYW1ldGVyOiAke3BhcmFtRGVjbC5nZXROYW1lKCl9LCAoJHtwYXJhbURlY2wuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteFBhcmFtLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgcHJvY2Vzc0RlY29yYXRvcnMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgY29uc3QgcGFyZW50ID0gcGFyYW1EZWNsLmdldFBhcmVudCgpO1xyXG5cclxuICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7cGFyYW1EZWNsLmdldE5hbWUoKX0sICgke3BhcmFtRGVjbC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhQYXJhbS5uYW1lfWApO1xyXG4gICAgICAgIGFjY2Vzc01hcC5zZXQoZm14UGFyYW0uaWQsIHBhcmFtRGVjbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZteFBhcmFtO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBlIEEgY2xhc3MsIGFuIGludGVyZmFjZSwgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjbGFzcywgdGhlIGludGVyZmFjZSwgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhlOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uLCBmbXhTY29wZTogRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5BcnJvd0Z1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgVHlwZSBQYXJhbWV0ZXJzOmApO1xyXG4gICAgZS5nZXRUeXBlUGFyYW1ldGVycygpLmZvckVhY2godHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gcHJvY2Vzc1R5cGVQYXJhbWV0ZXIodHApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEdlbmVyaWNQYXJhbWV0ZXIoZm14UGFyYW0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSB0eXBlIHBhcmFtZXRlclxyXG4gKiBAcGFyYW0gdHAgQSB0eXBlIHBhcmFtZXRlclxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlR5cGVQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHBhcmFtZXRlclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc1R5cGVQYXJhbWV0ZXIodHA6IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik6IEZhbWl4LlBhcmFtZXRlclR5cGUge1xyXG4gICAgY29uc3QgZm14VHlwZVBhcmFtZXRlciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYHR5cGUgcGFyYW1ldGVyOiAke3RwLmdldE5hbWUoKX0sICgke3RwLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhUeXBlUGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHModHAsIGZteFR5cGVQYXJhbWV0ZXIpO1xyXG5cclxuICAgIHJldHVybiBmbXhUeXBlUGFyYW1ldGVyO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSB2YXJpYWJsZXMgb2YgYSB2YXJpYWJsZSBzdGF0ZW1lbnRcclxuICogQHBhcmFtIHYgQSB2YXJpYWJsZSBzdGF0ZW1lbnRcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgRmFtaXguVmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZXNcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NWYXJpYWJsZVN0YXRlbWVudCh2OiBWYXJpYWJsZVN0YXRlbWVudCk6IEFycmF5PEZhbWl4LlZhcmlhYmxlPiB7XHJcbiAgICBjb25zdCBmbXhWYXJpYWJsZXMgPSBuZXcgQXJyYXk8RmFtaXguVmFyaWFibGU+KCk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBWYXJpYWJsZSBzdGF0ZW1lbnQ6ICR7di5nZXRUZXh0KCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgJHt2LmdldERlY2xhcmF0aW9uS2luZEtleXdvcmRzKClbMF19LCBmcW4gPSAke3YuZ2V0RGVjbGFyYXRpb25zKClbMF0uZ2V0TmFtZSgpfWApO1xyXG5cclxuICAgIHYuZ2V0RGVjbGFyYXRpb25zKCkuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14VmFyID0gcHJvY2Vzc1ZhcmlhYmxlKHZhcmlhYmxlKTtcclxuICAgICAgICBwcm9jZXNzQ29tbWVudHModiwgZm14VmFyKTtcclxuICAgICAgICBmbXhWYXJpYWJsZXMucHVzaChmbXhWYXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZteFZhcmlhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIHZhcmlhYmxlXHJcbiAqIEBwYXJhbSB2IEEgdmFyaWFibGVcclxuICogQHJldHVybnMgQSBGYW1peC5WYXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIHZhcmlhYmxlXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzVmFyaWFibGUodjogVmFyaWFibGVEZWNsYXJhdGlvbik6IEZhbWl4LlZhcmlhYmxlIHtcclxuICAgIGNvbnN0IGZteFZhciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peFZhcmlhYmxlKHYpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgdmFyaWFibGU6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgJHt2LmdldEluaXRpYWxpemVyKCkgPyBcImluaXRpYWxpemVyOiBcIiArIHYuZ2V0SW5pdGlhbGl6ZXIoKSEuZ2V0VGV4dCgpIDogXCJpbml0aWFsaXplcjogXCJ9LCBmcW4gPSAke2ZteFZhci5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHYsIGZteFZhcik7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBhZGRpbmcgYWNjZXNzOiAke3YuZ2V0TmFtZSgpfSwgKCR7di5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhWYXIubmFtZX1gKTtcclxuICAgIGFjY2Vzc01hcC5zZXQoZm14VmFyLmlkLCB2KTtcclxuXHJcbiAgICByZXR1cm4gZm14VmFyO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGVudW1cclxuICogQHBhcmFtIGUgQW4gZW51bVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LkVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnVtXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRW51bShlOiBFbnVtRGVjbGFyYXRpb24pOiBGYW1peC5FbnVtIHtcclxuICAgIGNvbnN0IGZteEVudW0gPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhFbnVtKGUpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgZW51bTogJHtlLmdldE5hbWUoKX0sICgke2UuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEVudW0uZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhlLCBmbXhFbnVtKTtcclxuXHJcbiAgICBlLmdldE1lbWJlcnMoKS5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IHByb2Nlc3NFbnVtVmFsdWUobSk7XHJcbiAgICAgICAgZm14RW51bS5hZGRWYWx1ZShmbXhFbnVtVmFsdWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZteEVudW07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gZW51bSBtZW1iZXJcclxuICogQHBhcmFtIHYgQW4gZW51bSBtZW1iZXJcclxuICogQHJldHVybnMgQSBGYW1peC5FbnVtVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbnVtIG1lbWJlclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0VudW1WYWx1ZSh2OiBFbnVtTWVtYmVyKTogRmFtaXguRW51bVZhbHVlIHtcclxuICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhFbnVtVmFsdWUodik7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBlbnVtIHZhbHVlOiAke3YuZ2V0TmFtZSgpfSwgKCR7di5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14RW51bVZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHModiwgZm14RW51bVZhbHVlKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSBGYW1peCAke2ZteEVudW1WYWx1ZS5uYW1lfWApO1xyXG4gICAgYWNjZXNzTWFwLnNldChmbXhFbnVtVmFsdWUuaWQsIHYpO1xyXG5cclxuICAgIHJldHVybiBmbXhFbnVtVmFsdWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGRlY29yYXRvcnMgb2YgYSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIGUgQSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY2xhc3MsIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIgb3IgdGhlIHByb3BlcnR5XHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRGVjb3JhdG9ycyhlOiBDbGFzc0RlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IgfCBGYW1peC5QYXJhbWV0ZXIgfCBGYW1peC5Qcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIERlY29yYXRvcnM6YCk7XHJcbiAgICBlLmdldERlY29yYXRvcnMoKS5mb3JFYWNoKGRlYyA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14RGVjID0gcHJvY2Vzc0RlY29yYXRvcihkZWMsIGUpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZERlY29yYXRvcihmbXhEZWMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBkZWNvcmF0b3JcclxuICogQHBhcmFtIGQgQSBkZWNvcmF0b3JcclxuICogQHBhcmFtIGUgQSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHJldHVybnMgQSBGYW1peC5EZWNvcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBkZWNvcmF0b3JcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NEZWNvcmF0b3IoZDogRGVjb3JhdG9yLCBlOiBDbGFzc0RlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbik6IEZhbWl4LkRlY29yYXRvciB7XHJcbiAgICBjb25zdCBmbXhEZWMgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhEZWNvcmF0b3IoZCwgZSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBkZWNvcmF0b3I6ICR7ZC5nZXROYW1lKCl9LCAoJHtkLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhEZWMuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhkLCBmbXhEZWMpO1xyXG5cclxuICAgIHJldHVybiBmbXhEZWM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGNvbW1lbnRzXHJcbiAqIEBwYXJhbSBlIEEgdHMtbW9ycGggZWxlbWVudFxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBuYW1lZCBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NDb21tZW50cyhlOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUgfCBEZWNvcmF0b3IgfCBFbnVtRGVjbGFyYXRpb24gfCBFbnVtTWVtYmVyIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgVmFyaWFibGVTdGF0ZW1lbnQgfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IEFycm93RnVuY3Rpb24sIGZteFNjb3BlOiBGYW1peC5OYW1lZEVudGl0eSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBQcm9jZXNzIGNvbW1lbnRzOmApO1xyXG4gICAgZS5nZXRMZWFkaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14Q29tbWVudCA9IHByb2Nlc3NDb21tZW50KGMsIGZteFNjb3BlKTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGxlYWRpbmcgY29tbWVudHMsIGFkZENvbW1lbnQ6ICcke2MuZ2V0VGV4dCgpfSdgKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRDb21tZW50KGZteENvbW1lbnQpOyAvLyByZWR1bmRhbnQsIGJ1dCBqdXN0IGluIGNhc2VcclxuICAgIH0pO1xyXG4gICAgZS5nZXRUcmFpbGluZ0NvbW1lbnRSYW5nZXMoKS5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGB0cmFpbGluZyBjb21tZW50cywgYWRkQ29tbWVudDogJyR7Yy5nZXRUZXh0KCl9J2ApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZENvbW1lbnQoZm14Q29tbWVudCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGNvbW1lbnRcclxuICogQHBhcmFtIGMgQSBjb21tZW50XHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcclxuICogQHJldHVybnMgQSBGYW1peC5Db21tZW50IHJlcHJlc2VudGluZyB0aGUgY29tbWVudFxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0NvbW1lbnQoYzogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiBGYW1peC5Db21tZW50IHtcclxuICAgIGNvbnN0IGlzSlNEb2MgPSBjLmdldFRleHQoKS5zdGFydHNXaXRoKFwiLyoqXCIpO1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29tbWVudDogY29tbWVudDogJHtjLmdldFRleHQoKX0sIGlzSlNEb2MgPSAke2lzSlNEb2N9YCk7XHJcbiAgICBjb25zdCBmbXhDb21tZW50ID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbW1lbnQoYywgZm14U2NvcGUsIGlzSlNEb2MpO1xyXG5cclxuICAgIHJldHVybiBmbXhDb21tZW50O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhY2Nlc3NlcyBvbiB0aGUgcGFyYW1ldGVycywgdmFyaWFibGVzLCBwcm9wZXJ0aWVzIGFuZCBlbnVtIG1lbWJlcnMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gYWNjZXNzTWFwIEEgbWFwIG9mIHBhcmFtZXRlcnMsIHZhcmlhYmxlcywgcHJvcGVydGllcyBhbmQgZW51bSBtZW1iZXJzIHdpdGggdGhlaXIgaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQWNjZXNzZXMoYWNjZXNzTWFwOiBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBhY2Nlc3NlczpgKTtcclxuICAgIGFjY2Vzc01hcC5mb3JFYWNoKCh2LCBpZCkgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWNjZXNzZXMgdG8gJHt2LmdldE5hbWUoKX1gKTtcclxuICAgICAgICAvLyB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBfbm9kZXMgPSB2LmZpbmRSZWZlcmVuY2VzQXNOb2RlcygpIGFzIEFycmF5PElkZW50aWZpZXI+O1xyXG4gICAgICAgIHRlbXBfbm9kZXMuZm9yRWFjaChub2RlID0+IHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobm9kZSwgaWQpKTtcclxuICAgICAgICAvLyB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiBcIiR7ZXJyb3J9XCIuXFxuQ29udGludWluZy4uLmApO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGFjY2VzcyBvbiBhIHBhcmFtZXRlciwgdmFyaWFibGUsIHByb3BlcnR5IG9yIGVudW0gbWVtYmVyXHJcbiAqIEBwYXJhbSBuIEEgbm9kZVxyXG4gKiBAcGFyYW0gaWQgQW4gaWQgb2YgYSBwYXJhbWV0ZXIsIGEgdmFyaWFibGUsIGEgcHJvcGVydHkgb3IgYW4gZW51bSBtZW1iZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobjogSWRlbnRpZmllciwgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gdHJ5IHtcclxuICAgIC8vIHNvbWV0aW1lcyBub2RlJ3MgZmlyc3QgYW5jZXN0b3IgaXMgYSBQcm9wZXJ0eURlY2xhcmF0aW9uLCB3aGljaCBpcyBub3QgYW4gYWNjZXNzXHJcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Z1aHJtYW5hdG9yL0ZhbWl4VHlwZVNjcmlwdEltcG9ydGVyL2lzc3Vlcy85XHJcbiAgICAvLyBjaGVjayBmb3IgYSBub2RlIHdob3NlIGZpcnN0IGFuY2VzdG9yIGlzIGEgcHJvcGVydHkgZGVjbGFyYXRpb24gYW5kIGJhaWw/XHJcbiAgICAvLyBUaGlzIG1heSBiZSBhIGJ1ZyBpbiB0cy1tb3JwaD9cclxuICAgIGlmIChuLmdldEZpcnN0QW5jZXN0b3JPclRocm93KCkuZ2V0S2luZE5hbWUoKSA9PT0gXCJQcm9wZXJ0eURlY2xhcmF0aW9uXCIpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NOb2RlRm9yQWNjZXNzZXM6IG5vZGUga2luZDogJHtuLmdldEtpbmROYW1lKCl9LCAke24uZ2V0VGV4dCgpfSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkncyBmaXJzdCBhbmNlc3RvciBpcyBhIFByb3BlcnR5RGVjbGFyYXRpb24uIFNraXBwaW5nLi4uYCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEFjY2VzcyhuLCBpZCk7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NOb2RlRm9yQWNjZXNzZXM6IG5vZGUga2luZDogJHtuLmdldEtpbmROYW1lKCl9LCAke24uZ2V0VGV4dCgpfSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcclxuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgbG9nZ2VyLmVycm9yKGA+IEdvdCBleGNlcHRpb24gXCIke2Vycm9yfVwiLlxcblNjb3BlRGVjbGFyYXRpb24gaW52YWxpZCBmb3IgXCIke24uZ2V0U3ltYm9sKCkuZnVsbHlRdWFsaWZpZWROYW1lfVwiLlxcbkNvbnRpbnVpbmcuLi5gKTtcclxuICAgIC8vIH1cclxufVxyXG5cclxuXHJcbi8vIGV4cG9ydHMgaGFzIG5hbWUgLT4gRGVjbGFyYXRpb24gLS0gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIEZhbWl4RWxlbWVudFxyXG5cclxuLy8gaGFuZGxlIGBpbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpYCBmb3IgZXhhbXBsZVxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ltcG9ydENsYXVzZXNGb3JJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbnMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+LCBleHBvcnRzOiBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+Pik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIGltcG9ydCBjbGF1c2VzIGZyb20gSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25zIGluIHNvdXJjZSBmaWxlczpgKTtcclxuICAgIHNvdXJjZUZpbGVzLmZvckVhY2goc291cmNlRmlsZSA9PiB7XHJcbiAgICAgICAgc291cmNlRmlsZS5mb3JFYWNoRGVzY2VuZGFudChub2RlID0+IHtcclxuICAgICAgICAgICAgaWYgKE5vZGUuaXNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbihub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gWW91J3ZlIGZvdW5kIGFuIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkRlY2xhcmF0aW9uIE5hbWU6XCIsIG5vZGUuZ2V0TmFtZSgpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiTW9kdWxlIFJlZmVyZW5jZSBUZXh0OlwiLCBub2RlLmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICAvLyB3aGF0J3MgdGhlIG5hbWUgb2YgdGhlIGltcG9ydGVkIGVudGl0eT9cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGltcG9ydGVkRW50aXR5ID0gbm9kZS5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBmYW1peCBpbXBvcnQgY2xhdXNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lZEltcG9ydCA9IG5vZGUuZ2V0TmFtZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IG5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBzb3VyY2VGaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBub2RlLmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lZEltcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICBpc0luRXhwb3J0czogZXhwb3J0cy5maW5kKGUgPT4gZS5oYXMobmFtZWRJbXBvcnQuZ2V0VGV4dCgpKSkgIT09IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2UoaW1wb3J0ZWRFbnRpdHksIGltcG9ydGluZ0VudGl0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGltcG9ydCBjbGF1c2VzIG9mIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG1vZHVsZXNcclxuICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlc1xyXG4gKiBAcGFyYW0gZXhwb3J0cyBBbiBhcnJheSBvZiBtYXBzIG9mIGV4cG9ydGVkIGRlY2xhcmF0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbXBvcnRDbGF1c2VzRm9yTW9kdWxlcyhtb2R1bGVzOiBBcnJheTxTb3VyY2VGaWxlPiwgZXhwb3J0czogQXJyYXk8UmVhZG9ubHlNYXA8c3RyaW5nLCBFeHBvcnRlZERlY2xhcmF0aW9uc1tdPj4pOiB2b2lkIHtcclxuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbXBvcnQgY2xhdXNlcyBmcm9tICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZXM6YCk7XHJcbiAgICBtb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcclxuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gbW9kdWxlLmdldEZpbGVQYXRoKCk7IC8vICsgbW9kdWxlLmdldEJhc2VOYW1lKCk7XHJcbiAgICAgICAgbW9kdWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpLmZvckVhY2goaW1wRGVjbCA9PiB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGdldE1vZHVsZVBhdGgoaW1wRGVjbCk7XHJcblxyXG4gICAgICAgICAgICBpbXBEZWNsLmdldE5hbWVkSW1wb3J0cygpLmZvckVhY2gobmFtZWRJbXBvcnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEltcG9ydGluZyAobmFtZWQpICR7bmFtZWRJbXBvcnQuZ2V0TmFtZSgpfSBmcm9tICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRlZEVudGl0eU5hbWUgPSBuYW1lZEltcG9ydC5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRGb3VuZEluRXhwb3J0cyA9IGlzSW5FeHBvcnRzKGV4cG9ydHMsIGltcG9ydGVkRW50aXR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5Lm9sZENyZWF0ZU9yR2V0RmFtaXhJbXBvcnRDbGF1c2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uOiBpbXBEZWNsLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydGVyU291cmNlRmlsZTogbW9kdWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQ6IG5hbWVkSW1wb3J0LFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FeHBvcnRzOiBpbXBvcnRGb3VuZEluRXhwb3J0cyxcclxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0SW1wb3J0ID0gaW1wRGVjbC5nZXREZWZhdWx0SW1wb3J0KCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wb3J0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgKGRlZmF1bHQpICR7ZGVmYXVsdEltcG9ydC5nZXRUZXh0KCl9IGZyb20gJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgd2l0aCBtb2R1bGUsIGltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSwgcGF0aCwgZGVmYXVsdEltcG9ydCwgZmFsc2UsIHRydWVcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IGltcERlY2wsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBtb2R1bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogZGVmYXVsdEltcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICBpc0luRXhwb3J0czogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0ID0gaW1wRGVjbC5nZXROYW1lc3BhY2VJbXBvcnQoKTtcclxuICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChuYW1lc3BhY2UpICR7bmFtZXNwYWNlSW1wb3J0LmdldFRleHQoKX0gZnJvbSAke2ltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKX0gaW4gJHttb2R1bGVQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5vbGRDcmVhdGVPckdldEZhbWl4SW1wb3J0Q2xhdXNlKHtcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnREZWNsYXJhdGlvbjogaW1wRGVjbCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IG1vZHVsZSxcclxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogcGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lc3BhY2VJbXBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdEV4cG9ydDogZmFsc2VcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEltcG9ydENsYXVzZShtb2R1bGUsIGltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSwgcGF0aCwgbmFtZXNwYWNlSW1wb3J0LCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNJbkV4cG9ydHMoZXhwb3J0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBFeHBvcnRlZERlY2xhcmF0aW9uc1tdPltdLCBpbXBvcnRlZEVudGl0eU5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IGltcG9ydEZvdW5kSW5FeHBvcnRzID0gZmFsc2U7XHJcbiAgICBleHBvcnRzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgaWYgKGUuaGFzKGltcG9ydGVkRW50aXR5TmFtZSkpIHtcclxuICAgICAgICAgICAgaW1wb3J0Rm91bmRJbkV4cG9ydHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGltcG9ydEZvdW5kSW5FeHBvcnRzO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbmhlcml0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXHJcbiAqIEBwYXJhbSBpbnRlcmZhY2VzIEFuIGFycmF5IG9mIGludGVyZmFjZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzSW5oZXJpdGFuY2VzKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmluZm8oYHByb2Nlc3NJbmhlcml0YW5jZXM6IENyZWF0aW5nIGluaGVyaXRhbmNlczpgKTtcclxuICAgIGNsYXNzZXMuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogQ2hlY2tpbmcgY2xhc3MgaW5oZXJpdGFuY2UgZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBleHRDbGFzcyA9IGNscy5nZXRCYXNlQ2xhc3MoKTtcclxuICAgICAgICAgICAgaWYgKGV4dENsYXNzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNscywgZXh0Q2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogY2xhc3M6ICR7Y2xzLmdldE5hbWUoKX0sICgke2Nscy5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dENsYXNzOiAke2V4dENsYXNzLmdldE5hbWUoKX0sICgke2V4dENsYXNzLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbmhlcml0YW5jZXM6IENoZWNraW5nIGludGVyZmFjZSBpbmhlcml0YW5jZSBmb3IgJHtjbHMuZ2V0TmFtZSgpfWApO1xyXG4gICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBnZXRJbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzKGludGVyZmFjZXMsIGNscyk7XHJcbiAgICAgICAgICAgIGltcGxlbWVudGVkSW50ZXJmYWNlcy5mb3JFYWNoKGltcEludGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNscywgaW1wSW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogY2xhc3M6ICR7Y2xzLmdldE5hbWUoKX0sICgke2Nscy5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGltcEludGVyOiAkeyhpbXBJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGltcEludGVyLmdldE5hbWUoKSA6IGltcEludGVyLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoaW1wSW50ZXIgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBpbXBJbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogaW1wSW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpbnRlcmZhY2VzLmZvckVhY2goaW50ZXIgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogQ2hlY2tpbmcgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGZvciAke2ludGVyLmdldE5hbWUoKX1gKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRJbnRlcmZhY2VzID0gZ2V0SW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcyhpbnRlcmZhY2VzLCBpbnRlcik7XHJcbiAgICAgICAgICAgIGV4dGVuZGVkSW50ZXJmYWNlcy5mb3JFYWNoKGV4dEludGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGludGVyLCBleHRJbnRlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBpbnRlcjogJHtpbnRlci5nZXROYW1lKCl9LCAoJHtpbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dEludGVyOiAkeyhleHRJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGV4dEludGVyLmdldE5hbWUoKSA6IGV4dEludGVyLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoZXh0SW50ZXIgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBleHRJbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogZXh0SW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBvZiB0aGUgc291cmNlIGZpbGVzXHJcbiAqIEBwYXJhbSBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkIEEgbWFwIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZWlyIGlkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ludm9jYXRpb25zKG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQ6IE1hcDxudW1iZXIsIEludm9jYWJsZVR5cGU+KTogdm9pZCB7XHJcbiAgICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgaW52b2NhdGlvbnM6YCk7XHJcbiAgICBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkLmZvckVhY2goKGludm9jYWJsZSwgaWQpID0+IHtcclxuICAgICAgICBpZiAoIShpbnZvY2FibGUgaW5zdGFuY2VvZiBBcnJvd0Z1bmN0aW9uKSkgeyAgLy8gQXJyb3dGdW5jdGlvbnMgYXJlIG5vdCBkaXJlY3RseSBpbnZva2VkXHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgSW52b2NhdGlvbnMgdG8gJHsoaW52b2NhYmxlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgaW52b2NhYmxlIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBpbnZvY2FibGUgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IGludm9jYWJsZSBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pID8gaW52b2NhYmxlLmdldE5hbWUoKSA6ICgoaW52b2NhYmxlIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgPyAnY29uc3RydWN0b3InIDogKGludm9jYWJsZS5nZXROYW1lKCkgPyBpbnZvY2FibGUuZ2V0TmFtZSgpIDogJ2Fub255bW91cycpKX0gKCR7aW52b2NhYmxlLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNSZWZlcmVuY2luZ0ludm9jYWJsZSA9IGludm9jYWJsZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKSBhcyBBcnJheTxJZGVudGlmaWVyPjtcclxuICAgICAgICAgICAgICAgIG5vZGVzUmVmZXJlbmNpbmdJbnZvY2FibGUuZm9yRWFjaChcclxuICAgICAgICAgICAgICAgICAgICBub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUgPT4gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBDb250aW51aW5nLi4uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIGludm9jYXRpb24gdG8gQXJyb3dGdW5jdGlvbjogJHsoaW52b2NhYmxlLmdldEJvZHlUZXh0KCkpfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGludm9jYXRpb24gb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gbm9kZVJlZmVyZW5jaW5nSW52b2NhYmxlIEEgbm9kZVxyXG4gKiBAcGFyYW0gaW52b2NhYmxlIEEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cclxuICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWV0aG9kIG9yIHRoZSBmdW5jdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlUmVmZXJlbmNpbmdJbnZvY2FibGU6IElkZW50aWZpZXIsIGludm9jYWJsZTogSW52b2NhYmxlVHlwZSwgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4SW52b2NhdGlvbihub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyhgbm9kZTogJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0S2luZE5hbWUoKX0sICgke25vZGVSZWZlcmVuY2luZ0ludm9jYWJsZS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIFNjb3BlRGVjbGFyYXRpb24gaW52YWxpZCBmb3IgJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0U3ltYm9sKCkhLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbmhlcml0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXHJcbiAqIEBwYXJhbSBpbnRlcmZhY2VzIEFuIGFycmF5IG9mIGludGVyZmFjZXNcclxuICovXHJcbi8vIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uY3JldGlzYXRpb25zKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSwgZnVuY3Rpb25zOiBNYXA8bnVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uPik6IHZvaWQge1xyXG4vLyAgICAgbG9nZ2VyLmluZm8oYHByb2Nlc3NDb25jcmV0aXNhdGlvbnM6IENyZWF0aW5nIGNvbmNyZXRpc2F0aW9uczpgKTtcclxuLy8gICAgIGNsYXNzZXMuZm9yRWFjaChjbHMgPT4ge1xyXG4vLyAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0NvbmNyZXRpc2F0aW9uczogQ2hlY2tpbmcgY2xhc3MgY29uY3JldGlzYXRpb24gZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oY2xzKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25HZW5lcmljSW5zdGFudGlhdGlvbihjbHMpO1xyXG4vLyAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNscyk7XHJcbi8vICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uVHlwZUluc3RhbmNpYXRpb24oY2xzKTtcclxuXHJcbi8vICAgICB9KTtcclxuLy8gICAgIGludGVyZmFjZXMuZm9yRWFjaChpbnRlciA9PiB7XHJcbi8vICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBpbnRlcmZhY2UgY29uY3JldGlzYXRpb24gZm9yICR7aW50ZXIuZ2V0TmFtZSgpfWApO1xyXG4vLyAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGludGVyKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oaW50ZXIpO1xyXG4vLyAgICAgfSk7XHJcbi8vICAgICBmdW5jdGlvbnMuZm9yRWFjaChmdW5jID0+IHtcclxuLy8gICAgICAgICBpZihmdW5jIGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBmdW5jIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gKXtcclxuLy8gICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBNZXRob2QgY29uY3JldGlzYXRpb25gKTtcclxuLy8gICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uRnVuY3Rpb25JbnN0YW50aWF0aW9uKGZ1bmMpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyB9XHJcbiJdfQ==
|