acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
417 lines (416 loc) • 45.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { EqualCondition } from '../../../core/rules/equal-condition';
import { ConditionType } from '../../../core/models/conditiontype.model';
import { GreaterThanCondition } from '../../../core/rules/greater-than-condition';
import { LessThanCondition } from '../../../core/rules/less-than-condition';
import { GreaterThanOrEqualsCondition } from '../../../core/rules/greater-than-or-equals-condition';
import { LessThanOrEqualsCondition } from '../../../core/rules/less-than-or-equals-condition';
import { ContainsCondition } from '../../../core/rules/contains-condition';
import { AndCondition } from '../../../core/rules/and-condition';
import { OrCondition } from '../../../core/rules/or-condition';
import { ArrayCheckerService } from './array-checker.service';
import { NotCondition } from '../../../core/rules/not-condition';
var ConditionsCreationService = /** @class */ (function () {
function ConditionsCreationService(arrayCheckerService) {
this.arrayCheckerService = arrayCheckerService;
}
/**
* @param {?} conditionJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditionType = /**
* @param {?} conditionJSON
* @return {?}
*/
function (conditionJSON) {
var /** @type {?} */ conditionType = new ConditionType();
conditionType.comparisonValue = conditionJSON.Attr.ComparisonValue;
conditionType.dataElementId = conditionJSON.Attr.DataElementId;
return conditionType;
};
/**
* @param {?} branchJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnCondition = /**
* @param {?} branchJSON
* @return {?}
*/
function (branchJSON) {
var /** @type {?} */ condition;
if (branchJSON.hasOwnProperty('EqualCondition')) {
condition = new EqualCondition(this.returnConditionType(branchJSON.EqualCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanCondition')) {
condition = new GreaterThanCondition(this.returnConditionType(branchJSON.GreaterThanCondition));
}
if (branchJSON.hasOwnProperty('LessThanCondition')) {
condition = new LessThanCondition(this.returnConditionType(branchJSON.LessThanCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanOrEqualsCondition')) {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(branchJSON.GreaterThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('LessThanOrEqualsCondition')) {
condition = new LessThanOrEqualsCondition(this.returnConditionType(branchJSON.LessThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('ContainsCondition')) {
condition = new ContainsCondition(this.returnConditionType(branchJSON.ContainsCondition));
}
// if (condition !== undefined) {
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : false;
// }
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : true;
return condition;
};
/**
* @param {?} compositeElementJSON
* @return {?}
*/
ConditionsCreationService.prototype.isComposite = /**
* @param {?} compositeElementJSON
* @return {?}
*/
function (compositeElementJSON) {
return compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
};
/**
* @param {?} conditionIdentifier
* @param {?} conditionJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditionFromJSON = /**
* @param {?} conditionIdentifier
* @param {?} conditionJSON
* @return {?}
*/
function (conditionIdentifier, conditionJSON) {
var /** @type {?} */ condition;
if (conditionIdentifier === 'EqualCondition') {
condition = new EqualCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanCondition') {
condition = new GreaterThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanCondition') {
condition = new LessThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanOrEqualsCondition') {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanOrEqualsCondition') {
condition = new LessThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'ContainsCondition') {
condition = new ContainsCondition(this.returnConditionType(conditionJSON));
}
return condition;
};
/**
* @param {?} conditionsJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditions = /**
* @param {?} conditionsJSON
* @return {?}
*/
function (conditionsJSON) {
var /** @type {?} */ conditions;
var /** @type {?} */ conditionIdentifiers = ['EqualCondition', 'GreaterThanCondition', 'LessThanCondition',
'GreaterThanOrEqualsCondition', 'LessThanOrEqualsCondition', 'ContainsCondition'];
try {
for (var conditionIdentifiers_1 = tslib_1.__values(conditionIdentifiers), conditionIdentifiers_1_1 = conditionIdentifiers_1.next(); !conditionIdentifiers_1_1.done; conditionIdentifiers_1_1 = conditionIdentifiers_1.next()) {
var conditionIdentifier = conditionIdentifiers_1_1.value;
var /** @type {?} */ conditionJSON = conditionsJSON[conditionIdentifier];
if (conditionJSON !== undefined) {
conditions = new Array();
if (this.arrayCheckerService.isArray(conditionJSON)) {
try {
for (var conditionJSON_1 = tslib_1.__values(conditionJSON), conditionJSON_1_1 = conditionJSON_1.next(); !conditionJSON_1_1.done; conditionJSON_1_1 = conditionJSON_1.next()) {
var jsonValue = conditionJSON_1_1.value;
conditions.push(this.returnConditionFromJSON(conditionIdentifier, jsonValue));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (conditionJSON_1_1 && !conditionJSON_1_1.done && (_a = conditionJSON_1.return)) _a.call(conditionJSON_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
conditions.push(this.returnConditionFromJSON(conditionIdentifier, conditionJSON));
}
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (conditionIdentifiers_1_1 && !conditionIdentifiers_1_1.done && (_b = conditionIdentifiers_1.return)) _b.call(conditionIdentifiers_1);
}
finally { if (e_2) throw e_2.error; }
}
return conditions;
var e_2, _b, e_1, _a;
};
/**
* @param {?} compositeElementJSON
* @return {?}
*/
ConditionsCreationService.prototype.isHybrid = /**
* @param {?} compositeElementJSON
* @return {?}
*/
function (compositeElementJSON) {
var /** @type {?} */ compositeExists = compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
var /** @type {?} */ primitiveExists = compositeElementJSON.hasOwnProperty('EqualCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanCondition') ||
compositeElementJSON.hasOwnProperty('LessThanCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('LessThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('ContainsCondition');
return compositeExists && primitiveExists;
};
/**
* @param {?} data
* @return {?}
*/
ConditionsCreationService.prototype.returnCompositeCondition = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (!this.isComposite(data)) {
return;
}
var /** @type {?} */ compositeConditionJSON;
var /** @type {?} */ compositeCondition;
if (data.hasOwnProperty('AndCondition')) {
compositeConditionJSON = data.AndCondition;
compositeCondition = new AndCondition();
}
else if (data.hasOwnProperty('OrCondition')) {
compositeConditionJSON = data.OrCondition;
compositeCondition = new OrCondition();
}
else if (data.hasOwnProperty('NotCondition')) {
compositeConditionJSON = data.NotCondition;
compositeCondition = new NotCondition();
}
// if (data.hasOwnProperty('IsRelevant')){
// compositeConditionJSON += data.IsRelevant;
// }
if (!this.isComposite(compositeConditionJSON)) {
compositeCondition.conditions = this.returnConditions(compositeConditionJSON);
}
else if (this.isHybrid(compositeConditionJSON)) {
var /** @type {?} */ jsonKeys = Object.keys(compositeConditionJSON);
try {
for (var jsonKeys_1 = tslib_1.__values(jsonKeys), jsonKeys_1_1 = jsonKeys_1.next(); !jsonKeys_1_1.done; jsonKeys_1_1 = jsonKeys_1.next()) {
var jsonKey = jsonKeys_1_1.value;
var /** @type {?} */ jsonValue = compositeConditionJSON[jsonKey];
var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
var /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, compositeCondition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
try {
for (var jsonValue_1 = tslib_1.__values(jsonValue), jsonValue_1_1 = jsonValue_1.next(); !jsonValue_1_1.done; jsonValue_1_1 = jsonValue_1.next()) {
var arrayValue = jsonValue_1_1.value;
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (jsonValue_1_1 && !jsonValue_1_1.done && (_a = jsonValue_1.return)) _a.call(jsonValue_1);
}
finally { if (e_3) throw e_3.error; }
}
}
else {
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (jsonKeys_1_1 && !jsonKeys_1_1.done && (_b = jsonKeys_1.return)) _b.call(jsonKeys_1);
}
finally { if (e_4) throw e_4.error; }
}
}
else {
this.returnInnerConditions(compositeConditionJSON, compositeCondition);
}
return compositeCondition;
var e_4, _b, e_3, _a;
};
/**
* @param {?} elementName
* @return {?}
*/
ConditionsCreationService.prototype.returnCompositeConditionFromName = /**
* @param {?} elementName
* @return {?}
*/
function (elementName) {
var /** @type {?} */ compositeCondition;
switch (elementName) {
case 'AndCondition':
{
compositeCondition = new AndCondition();
break;
}
case 'OrCondition':
{
compositeCondition = new OrCondition();
break;
}
case 'NotCondition':
{
compositeCondition = new NotCondition();
}
}
return compositeCondition;
};
/**
* @param {?} key
* @param {?} value
* @param {?} compositeCondition
* @return {?}
*/
ConditionsCreationService.prototype.addConditionsToInnerConditions = /**
* @param {?} key
* @param {?} value
* @param {?} compositeCondition
* @return {?}
*/
function (key, value, compositeCondition) {
var /** @type {?} */ condition = this.returnCompositeConditionFromName(key);
compositeCondition.conditions.push(condition);
if (this.isHybrid(value)) {
var /** @type {?} */ jsonKeys = Object.keys(value);
try {
for (var jsonKeys_2 = tslib_1.__values(jsonKeys), jsonKeys_2_1 = jsonKeys_2.next(); !jsonKeys_2_1.done; jsonKeys_2_1 = jsonKeys_2.next()) {
var jsonKey = jsonKeys_2_1.value;
var /** @type {?} */ jsonValue = value[jsonKey];
var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
var /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, condition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
try {
for (var jsonValue_2 = tslib_1.__values(jsonValue), jsonValue_2_1 = jsonValue_2.next(); !jsonValue_2_1.done; jsonValue_2_1 = jsonValue_2.next()) {
var arrayValue = jsonValue_2_1.value;
condition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (jsonValue_2_1 && !jsonValue_2_1.done && (_a = jsonValue_2.return)) _a.call(jsonValue_2);
}
finally { if (e_5) throw e_5.error; }
}
}
else {
condition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (jsonKeys_2_1 && !jsonKeys_2_1.done && (_b = jsonKeys_2.return)) _b.call(jsonKeys_2);
}
finally { if (e_6) throw e_6.error; }
}
}
else if (this.isComposite(value)) {
// console.log( 'isComposite');
}
else {
condition.conditions = this.returnConditions(value);
}
var e_6, _b, e_5, _a;
};
/**
* @param {?} innerConditionsJSON
* @param {?} compositeCondition
* @return {?}
*/
ConditionsCreationService.prototype.returnInnerConditions = /**
* @param {?} innerConditionsJSON
* @param {?} compositeCondition
* @return {?}
*/
function (innerConditionsJSON, compositeCondition) {
var /** @type {?} */ jsonKeys = Object.keys(innerConditionsJSON);
try {
for (var jsonKeys_3 = tslib_1.__values(jsonKeys), jsonKeys_3_1 = jsonKeys_3.next(); !jsonKeys_3_1.done; jsonKeys_3_1 = jsonKeys_3.next()) {
var key = jsonKeys_3_1.value;
var /** @type {?} */ values = innerConditionsJSON[key];
if (this.arrayCheckerService.isArray(values)) {
try {
for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
var value = values_1_1.value;
this.addConditionsToInnerConditions(key, value, compositeCondition);
}
}
catch (e_7_1) { e_7 = { error: e_7_1 }; }
finally {
try {
if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
}
finally { if (e_7) throw e_7.error; }
}
}
else {
this.addConditionsToInnerConditions(key, innerConditionsJSON[key], compositeCondition);
}
}
}
catch (e_8_1) { e_8 = { error: e_8_1 }; }
finally {
try {
if (jsonKeys_3_1 && !jsonKeys_3_1.done && (_b = jsonKeys_3.return)) _b.call(jsonKeys_3);
}
finally { if (e_8) throw e_8.error; }
}
var e_8, _b, e_7, _a;
};
ConditionsCreationService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
ConditionsCreationService.ctorParameters = function () { return [
{ type: ArrayCheckerService }
]; };
return ConditionsCreationService;
}());
export { ConditionsCreationService };
function ConditionsCreationService_tsickle_Closure_declarations() {
/** @type {?} */
ConditionsCreationService.prototype.arrayCheckerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDcEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0lBTzlELG1DQUFxQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtLQUFLOzs7OztJQUV6RCx1REFBbUI7Ozs7Y0FBQyxhQUFrQjtRQUM1QyxxQkFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUMxQyxhQUFhLENBQUMs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bEQsR0FBRyxDQUFDLENBQWMsSUFBQSxhQUFBLGlCQUFBLFFBQVEsQ0FBQSxrQ0FBQTtnQkFBckIsSUFBTSxHQUFHLHFCQUFBO2dCQUNWLHFCQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O3dCQUM1QyxHQUFHLENBQUMsQ0FBZ0IsSUFBQSxXQUFBLGlCQUFBLE1BQU0sQ0FBQSw4QkFBQTs0QkFBckIsSUFBTSxLQUFLLG1CQUFBOzRCQUNaLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7eUJBQ3ZFOzs7Ozs7Ozs7aUJBQ0g7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ0osSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2lCQUN4RjthQUNGOzs7Ozs7Ozs7Ozs7Z0JBbk9aLFVBQVU7Ozs7Z0JBSEYsbUJBQW1COztvQ0FaNUI7O1NBZ0JhLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBFcXVhbENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZXF1YWwtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBHcmVhdGVyVGhhbkNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IExlc3NUaGFuQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tY29uZGl0aW9uJztcclxuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLW9yLWVxdWFscy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbnRhaW5zQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9jb250YWlucy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBBbmRDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2FuZC1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBPckNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvb3ItY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ub3QtY29uZGl0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2Uge1xyXG5cclxuXHJcblxyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTjogYW55KTogQ29uZGl0aW9uVHlwZSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBuZXcgQ29uZGl0aW9uVHlwZSgpO1xyXG4gICAgICBjb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSA9IGNvbmRpdGlvbkpTT04uQXR0ci5Db21wYXJpc29uVmFsdWU7XHJcbiAgICAgIGNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCA9IGNvbmRpdGlvbkpTT04uQXR0ci5EYXRhRWxlbWVudElkO1xyXG4gICAgICByZXR1cm4gY29uZGl0aW9uVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db25kaXRpb24oYnJhbmNoSlNPTjogYW55KTogQ29uZGl0aW9uIHtcclxuICAgICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3IEVxdWFsQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkVxdWFsQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdHcmVhdGVyVGhhbkNvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5Db25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uR3JlYXRlclRoYW5Db25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5MZXNzVGhhbkNvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5HcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkxlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0NvbnRhaW5zQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb250YWluc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5Db250YWluc0NvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKGNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gICBjb25kaXRpb24uSXNSZWxldmFudCA9IGJyYW5jaEpTT04uSXNSZWxldmFudCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJhbmNoSlNPTi5Jc1JlbGV2YW50IDogZmFsc2U7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbmRpdGlvbi5Jc1JlbGV2YW50ID0gYnJhbmNoSlNPTi5Jc1JlbGV2YW50ICE9PSB1bmRlZmluZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJyYW5jaEpTT04uSXNSZWxldmFudCA6IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAgaXNDb21wb3NpdGUoY29tcG9zaXRlRWxlbWVudEpTT04pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0FuZENvbmRpdGlvbicpIHx8XHJcbiAgICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyOiBzdHJpbmcgLCBjb25kaXRpb25KU09OOiBhbnkpOiBDb25kaXRpb24ge1xyXG4gICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnRXF1YWxDb25kaXRpb24nKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgRXF1YWxDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnTGVzc1RoYW5Db25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdDb250YWluc0NvbmRpdGlvbicpIHtcclxuICAgICAgICBjb25kaXRpb24gPSBuZXcgQ29udGFpbnNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlICByZXR1cm5Db25kaXRpb25zKGNvbmRpdGlvbnNKU09OOiBKU09OKTogQ29uZGl0aW9uW10ge1xyXG4gICAgICAgICBsZXQgY29uZGl0aW9uczogQ29uZGl0aW9uW107XHJcbiAgICAgICAgY29uc3QgY29uZGl0aW9uSWRlbnRpZmllcnMgPSBbJ0VxdWFsQ29uZGl0aW9uJywgJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJywgJ0xlc3NUaGFuQ29uZGl0aW9uJyxcclxuICAgICAgICAgICAgJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nLCAnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicsICdDb250YWluc0NvbmRpdGlvbiddO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uSWRlbnRpZmllciBvZiBjb25kaXRpb25JZGVudGlmaWVycykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkpTT04gPSBjb25kaXRpb25zSlNPTltjb25kaXRpb25JZGVudGlmaWVyXTtcclxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gbmV3IEFycmF5PENvbmRpdGlvbj4oKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShjb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBqc29uVmFsdWUgb2YgY29uZGl0aW9uSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyLCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXIsIGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHlicmlkKGNvbXBvc2l0ZUVsZW1lbnRKU09OKTogYm9vbGVhbiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUV4aXN0cyA9ICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpO1xyXG5cclxuICAgICAgY29uc3QgcHJpbWl0aXZlRXhpc3RzID0gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicpIHx8XHJcbiAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdDb250YWluc0NvbmRpdGlvbicpO1xyXG4gICAgICByZXR1cm4gIGNvbXBvc2l0ZUV4aXN0cyAmJiBwcmltaXRpdmVFeGlzdHM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbihkYXRhOiBhbnkpOiBDb21wb3NpdGVDb25kaXRpb24ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoZGF0YSkpICB7XHJcbiAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uSlNPTjogYW55O1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcblxyXG4gICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgKSB7XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5BbmRDb25kaXRpb247XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSkge1xyXG4gICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5PckNvbmRpdGlvbjtcclxuICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uSlNPTiA9IGRhdGEuTm90Q29uZGl0aW9uO1xyXG4gICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICB9XHJcbi8vIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdJc1JlbGV2YW50Jykpe1xyXG4vLyAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gKz0gZGF0YS5Jc1JlbGV2YW50O1xyXG4vLyB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoY29tcG9zaXRlQ29uZGl0aW9uSlNPTikpIHtcclxuICAgICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uLmNvbmRpdGlvbnMgPSB0aGlzLnJldHVybkNvbmRpdGlvbnMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0h5YnJpZChjb21wb3NpdGVDb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9ICBjb21wb3NpdGVDb25kaXRpb25KU09OW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAgJ3tcIicgKyBqc29uS2V5ICArICdcIjonICsgSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlKSArICd9JyA7XHJcbiAgICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICB0aGlzLnJldHVybklubmVyQ29uZGl0aW9ucyhqc29uT2JqZWN0LCBjb21wb3NpdGVDb25kaXRpb24pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFycmF5VmFsdWUgb2YgIGpzb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwganNvblZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgIH1cclxuICAgICByZXR1cm4gY29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm5Db21wb3NpdGVDb25kaXRpb25Gcm9tTmFtZShlbGVtZW50TmFtZTogc3RyaW5nKTogQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICAgICAgbGV0IGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICAnQW5kQ29uZGl0aW9uJzpcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgICdPckNvbmRpdGlvbic6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ05vdENvbmRpdGlvbicgOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUNvbmRpdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgIGFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXk6IGFueSAsIHZhbHVlOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcblxyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbkZyb21OYW1lKGtleSk7XHJcbiAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuaXNIeWJyaWQodmFsdWUpKSB7XHJcbiAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG4gICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgY29uc3QganNvblZhbHVlID0gIHZhbHVlW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgY29uc3QganNvblN0cmluZyA9ICAne1wiJyArIGpzb25LZXkgICsgJ1wiOicgKyBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUpICsgJ30nIDtcclxuICAgICAgICAgICAgIGNvbnN0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGpzb25PYmplY3QsIGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJyYXlWYWx1ZSBvZiAganNvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2UgIGlmICh0aGlzLmlzQ29tcG9zaXRlKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaXNDb21wb3NpdGUnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zID0gdGhpcy5yZXR1cm5Db25kaXRpb25zKHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybklubmVyQ29uZGl0aW9ucyhpbm5lckNvbmRpdGlvbnNKU09OOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyhpbm5lckNvbmRpdGlvbnNKU09OKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBqc29uS2V5cyApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gaW5uZXJDb25kaXRpb25zSlNPTltrZXldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCB2YWx1ZSwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCBpbm5lckNvbmRpdGlvbnNKU09OW2tleV0sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuIl19