acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
373 lines • 54.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input, EventEmitter, Output } from '@angular/core';
import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model';
import { ChoiceElement } from '../assist-data-element.component';
import { SelectedCondition } from '../../../core/models/executed-result.model';
const /** @type {?} */ $ = require('jquery');
import { FormBuilder, Validators } from '@angular/forms';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
export class AssistChoiceElementComponent {
/**
* @param {?} formBuilder
* @param {?} simulatorEngineService
*/
constructor(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnChoiceElement = new EventEmitter();
this.choiceChange = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
this.createChoiceElementForm();
}
/**
* @return {?}
*/
ngAfterViewInit() {
$('#div_' + this.choiceDataElement.id + '_other').hide();
if (this.choiceDataElement.currentValue !== undefined) {
$('#' + this.choiceDataElement.currentValue + '_' + this.choiceDataElement.id).prop('checked', true);
this.choiceValue = this.choiceDataElement.currentValue;
// tslint:disable-next-line:forin
for (const /** @type {?} */ choice in this.choiceDataElement.choiceInfo) {
// if (this.choiceDataElement.choiceInfo[choice].value === 'hypoEnhancing'){
// console.log('asdasd');
// }
if (this.choiceDataElement.choiceInfo[choice].value === this.choiceDataElement.currentValue) {
if (this.choiceDataElement.choiceInfo[choice].reportText !== undefined) {
this.selectedChoiceReportText = this.choiceDataElement.choiceInfo[choice].reportText;
}
else {
this.selectedChoiceReportLabel = this.choiceDataElement.choiceInfo[choice].label;
}
}
}
if (this.choiceDataElement.choiceInfo.length <= 5) {
this.updateChoiceValue(this.choiceDataElement.id, this.choiceDataElement.label, (this.selectedChoiceReportText !== undefined) ? this.selectedChoiceReportText : this.selectedChoiceReportLabel, this.choiceDataElement.currentValue);
}
else {
this.updateDropdownChoiceSelected(this.choiceDataElement.id, this.selectedChoiceReportLabel, this.choiceDataElement.currentValue, this.choiceDataElement.label);
}
}
else {
this.returnChoiceElement.emit(undefined);
}
}
/**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
updateChoiceValue(elementId, selectedElement, selectedText, selectedValue) {
if (selectedValue !== undefined) {
const /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = selectedValue;
choiceElement.selectedText = selectedText;
this.showOrHideFreeText(elementId, choiceElement.selectedValue);
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedElement;
this.selectedCondition.selectedValue = selectedText;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
}
/**
* @param {?} elementId
* @param {?} elementLabel
* @param {?} elementValue
* @param {?} selectedCondition
* @return {?}
*/
updateDropdownChoiceSelected(elementId, elementLabel, elementValue, selectedCondition) {
const /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = elementValue;
choiceElement.selectedText = elementLabel;
if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
choiceElement.selectedText = '';
choiceElement.selectedValue = '';
}
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = elementLabel;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
/**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
choiceSelected(elementId, selectedElement, selectedText, selectedValue) {
const /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = selectedValue;
choiceElement.selectedText = selectedText;
this.showOrHideFreeText(elementId, choiceElement.selectedValue);
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedElement;
this.selectedCondition.selectedValue = selectedText;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
/**
* @param {?} element
* @param {?} selectedCondition
* @return {?}
*/
dropdownChoiceSelected(element, selectedCondition) {
const /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = element.id;
choiceElement.selectedValue = (element.options[element.selectedIndex].text === 'Other, please specify…') ? 'freetext' : element.value;
choiceElement.selectedText = element.options[element.selectedIndex].text;
this.showOrHideFreeText(element.id, choiceElement.selectedValue);
if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
choiceElement.selectedText = '';
choiceElement.selectedValue = '';
}
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = element.id;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = element.options[element.selectedIndex].text;
// Code should comes here //
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
/**
* @return {?}
*/
createChoiceElementForm() {
this.choiceElementForm = this.formBuilder.group({
checkBox: ['', Validators.required],
}, {
validator: this.specificValueInsideRange('checkBox')
});
}
/**
* @param {?} elementId
* @param {?} selectedValue
* @return {?}
*/
showOrHideFreeText(elementId, selectedValue) {
if (selectedValue === 'freetext') {
$('#div_' + elementId + '_other').show();
}
else {
$('#div_' + elementId + '_other').hide();
$('#txt_other_' + elementId).val('');
}
}
/**
* @param {?} element
* @param {?} elementId
* @param {?} selectedCondition
* @return {?}
*/
updateFreeText(element, elementId, selectedCondition) {
const /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = (element.value === 'Other') ? 'freetext' : element.value;
choiceElement.selectedText = element.value;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = element.value;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
/**
* @param {?} checkBoxKey
* @return {?}
*/
specificValueInsideRange(checkBoxKey) {
return (group) => {
const /** @type {?} */ choiceControl = group.controls[checkBoxKey];
if ((choiceControl.value === undefined || choiceControl.value === '' || choiceControl.value === '--Select--' || this.choiceValue === '')) {
return choiceControl.setErrors({ notEquivalent: true });
}
else {
return choiceControl.setErrors(null);
}
};
}
}
AssistChoiceElementComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-assist-choice-element',
template: `<form [formGroup]="choiceElementForm" novalidate>
<div class="form-group">
<div class="col-sm-5 text-right">
<label class="control-label break-word">
{{choiceDataElement.label}} <span *ngIf="choiceDataElement.unit != undefined && choiceDataElement.unit != ''"> ({{choiceDataElement.unit}})</span>
</label>
<ng-container *ngIf="choiceDataElement.hint !== '' && choiceDataElement.hint !== undefined">
<i class="whitespace">
<span class="fa fa-info-circle text-primary" data-toggle="tooltip" data-placement="right" title="{{choiceDataElement.hint}}"></span>
</i>
</ng-container>
<ng-container *ngIf="choiceDataElement.diagrams != undefined ">
<acr-hint-diagram [dataElement]="choiceDataElement" [imagePath]="imagePath"></acr-hint-diagram>
</ng-container>
<span *ngIf="choiceElementForm.controls['checkBox'].invalid && this.choiceDataElement.isRequired" class="required-field whitespace"
title="Required Field">*</span>
</div>
<div class="col-sm-7 text-left content-padding">
<ng-container *ngIf="choiceDataElement.choiceInfo.length <= 2">
<ng-container *ngIf="imagePath != undefined">
<ng-container *ngIf="choiceDataElement.imageMap == undefined">
<ng-container *ngFor="let choice of choiceDataElement.choiceInfo">
<div class="radio custom-radio-style">
<label>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" [(ngModel)]="choiceValue" id="{{choice.value}}_{{choiceDataElement.id}}" type="radio" formControlName="checkBox" value="{{choice.value}}"
(change)="choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)"> {{choice.label}}
</label>
</div>
</ng-container>
<ng-container *ngIf="choiceDataElement.allowFreetext">
<div class="radio custom-radio-style">
<label>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" id="other_{{choiceDataElement.id}}" type="radio" formControlName="checkBox" value="freetext" (change)="choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')"> Other, please specify…</label>
</div>
<div id='div_{{choiceDataElement.id}}_other'>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" id="txt_other_{{choiceDataElement.id}}" class="form-control" type="text" formControlName="checkBox" value="other"
class="form-control" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'
placeholder="Please specify '{{choiceDataElement.label}}'">
</div>
</ng-container>
</ng-container>
<ng-container *ngIf="choiceDataElement.imageMap != undefined">
<div class="row">
<div class="col-xs-6 col-sm-2">
<ng-container *ngFor="let choice of choiceDataElement.choiceInfo">
<div class="radio custom-radio-style">
<label>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" [(ngModel)]="choiceValue" id="{{choice.value}}_{{choiceDataElement.id}}" type="radio" formControlName="checkBox" value="{{choice.value}}"
(change)="choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)"> {{choice.label}}
</label>
</div>
</ng-container>
<ng-container *ngIf="choiceDataElement.allowFreetext">
<div class="radio custom-radio-style">
<label>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" id="other_{{choiceDataElement.id}}" type="radio" formControlName="checkBox" value="other" (change)="choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')"> Other, please specify…</label>
</div>
<div id='div_{{choiceDataElement.id}}_other'>
<input [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null" id="txt_other_{{choiceDataElement.id}}" class="form-control" type="text" formControlName="checkBox" value="other"
class="form-control" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'
placeholder="Please specify '{{choiceDataElement.label}}'">
</div>
</ng-container>
</div>
<div class="col-xs-6 col-sm-2">
<label class="control-label">OR</label>
</div>
<acr-image-map [DataElement]="choiceDataElement" [imagePath]="imagePath"></acr-image-map>
</div>
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngIf="choiceDataElement.choiceInfo.length > 2">
<select [attr.disabled]="choiceDataElement.isEditable == false ? 'disabled' : null"
[(ngModel)]="choiceValue" id="{{choiceDataElement.id}}" (change)="dropdownChoiceSelected($event.target, choiceDataElement.label)"
formControlName="checkBox" class="form-control">
<!-- <option
[selected]="choiceDataElement.currentValue == choiceDataElement.ChoiceNotRelevant ? true : false">--Select--</option>
-->
<option [selected]="
choiceDataElement.ChoiceNotRelevant != undefined ?
(choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1 ?
true :
true)
: true">--Select--</option>
<!-- [selected]="choice.value === choiceDataElement.currentValue" -->
<option *ngFor="let choice of choiceDataElement.choiceInfo"
[hidden]="choiceDataElement.ChoiceNotRelevant != undefined ?
choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null
: null"
[value]="choice.value"
[selected]="choiceDataElement.ChoiceNotRelevant != undefined ?
choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1
|| choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1? false :
choice.value === choiceDataElement.currentValue ? true : false
: choice.value === choiceDataElement.currentValue ? true : false"
>{{choice.label}}</option>
<option *ngIf="choiceDataElement.allowFreetext" [value]="'freetext'" [selected]="'freetext'">Other, please specify…</option>
</select>
<div id='div_{{choiceDataElement.id}}_other'>
<input id="txt_other_{{choiceDataElement.id}}" class="form-control" type="text" formControlName="checkBox" value="other"
placeholder="Please specify '{{choiceDataElement.label}}'" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'>
</div>
<ng-container *ngIf="choiceDataElement.imageMap != undefined && imagePath != undefined">
<div class="row padding-top-10">
<div class="col-xs-6 col-sm-2">
<label class="control-label">OR</label>
</div>
<acr-image-map [DataElement]="choiceDataElement" [imagePath]="imagePath"></acr-image-map>
</div>
</ng-container>
</ng-container>
</div>
</div>
</form>
`,
styles: [``, `.required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}`]
},] },
];
/** @nocollapse */
AssistChoiceElementComponent.ctorParameters = () => [
{ type: FormBuilder },
{ type: SimulatorEngineService }
];
AssistChoiceElementComponent.propDecorators = {
choiceDataElement: [{ type: Input }],
imagePath: [{ type: Input }],
returnChoiceElement: [{ type: Output }],
choiceChange: [{ type: Output }],
disabled: [{ type: Input }]
};
function AssistChoiceElementComponent_tsickle_Closure_declarations() {
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceDataElement;
/** @type {?} */
AssistChoiceElementComponent.prototype.imagePath;
/** @type {?} */
AssistChoiceElementComponent.prototype.returnChoiceElement;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceChange;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceValue;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceElementForm;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedCondition;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedIndex;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedChoiceReportText;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedChoiceReportLabel;
/** @type {?} */
AssistChoiceElementComponent.prototype.disabled;
/** @type {?} */
AssistChoiceElementComponent.prototype.formBuilder;
/** @type {?} */
AssistChoiceElementComponent.prototype.simulatorEngineService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1jaG9pY2UtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsdUJBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QixPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBZ0l6RixNQUFNOzs7OztJQWNKLFlBQW9CLFdBQXdCLEVBQVUsc0JBQThDO1FBQWhGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjttQ0FYcEUsSUFBSSxZQUFZLEVBQUU7NEJBQ3pCLElBQUksWUFBWSxFQUFFO0tBVThEOzs7O0lBQ3pHLFFBQVE7UUFDTixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztLQUNoQzs7OztJQUVELGVBQWU7UUFDYixDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMs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TTt1QkFRTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VFbGVtZW50IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2V4ZWN1dGVkLXJlc3VsdC5tb2RlbCc7XHJcbmNvbnN0ICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LWNob2ljZS1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwiY2hvaWNlRWxlbWVudEZvcm1cIiBub3ZhbGlkYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTUgdGV4dC1yaWdodFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGJyZWFrLXdvcmRcIj5cclxuICAgICAgICB7e2Nob2ljZURhdGFFbGVtZW50LmxhYmVsfX0gPHNwYW4gKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC51bml0ICE9IHVuZGVmaW5lZCAmJiBjaG9pY2VEYXRhRWxlbWVudC51bml0ICE9ICcnXCI+ICh7e2Nob2ljZURhdGFFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5oaW50ICE9PSAnJyAmJiBjaG9pY2VEYXRhRWxlbWVudC5oaW50ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICA8aSBjbGFzcz1cIndoaXRlc3BhY2VcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1wcmltYXJ5XCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIHRpdGxlPVwie3tjaG9pY2VEYXRhRWxlbWVudC5oaW50fX1cIj48L3NwYW4+XHJcbiAgICAgICAgPC9pPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmRpYWdyYW1zICE9IHVuZGVmaW5lZCBcIj5cclxuICAgICAgICA8YWNyLWhpbnQtZGlhZ3JhbSBbZGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiY2hvaWNlRWxlbWVudEZvcm0uY29udHJvbHNbJ2NoZWNrQm94J10uaW52YWxpZCAgJiYgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5pc1JlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1maWVsZCB3aGl0ZXNwYWNlXCJcclxuICAgICAgICB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+Kjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgdGV4dC1sZWZ0IGNvbnRlbnQtcGFkZGluZ1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gMlwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuaW1hZ2VNYXAgPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvIGN1c3RvbS1yYWRpby1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlLnZhbHVlfX1fe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cInt7Y2hvaWNlLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hvaWNlU2VsZWN0ZWQoY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsLCAoY2hvaWNlLnJlcG9ydFRleHQgIT09IHVuZGVmaW5lZCkgPyBjaG9pY2UucmVwb3J0VGV4dCA6IGNob2ljZS5sYWJlbCwgY2hvaWNlLnZhbHVlKVwiPiB7e2Nob2ljZS5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmFsbG93RnJlZXRleHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5kaXNhYmxlZF09XCJjaG9pY2VEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBpZD1cIm90aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIHR5cGU9XCJyYWRpb1wiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJmcmVldGV4dFwiIChjaGFuZ2UpPVwiY2hvaWNlU2VsZWN0ZWQoY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsLCAnT3RoZXInLCAnZnJlZXRleHQnKVwiPiBPdGhlciwgcGxlYXNlIHNwZWNpZnnigKY8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgaWQ9J2Rpdl97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1fb3RoZXInPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiIChrZXl1cCk9J3VwZGF0ZUZyZWVUZXh0KCRldmVudC50YXJnZXQsIGNob2ljZURhdGFFbGVtZW50LmlkLCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbCknXHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5pbWFnZU1hcCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvIGN1c3RvbS1yYWRpby1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5kaXNhYmxlZF09XCJjaG9pY2VEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBbKG5nTW9kZWwpXT1cImNob2ljZVZhbHVlXCIgaWQ9XCJ7e2Nob2ljZS52YWx1ZX19X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIHR5cGU9XCJyYWRpb1wiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJ7e2Nob2ljZS52YWx1ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCBjaG9pY2UudmFsdWUpXCI+IHt7Y2hvaWNlLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmFsbG93RnJlZXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvIGN1c3RvbS1yYWRpby1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5kaXNhYmxlZF09XCJjaG9pY2VEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBpZD1cIm90aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIHR5cGU9XCJyYWRpb1wiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiIChjaGFuZ2UpPVwiY2hvaWNlU2VsZWN0ZWQoY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsLCAnT3RoZXInLCAnZnJlZXRleHQnKVwiPiBPdGhlciwgcGxlYXNlIHNwZWNpZnnigKY8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICBbYXR0ci5kaXNhYmxlZF09XCJjaG9pY2VEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBpZD1cInR4dF9vdGhlcl97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cIm90aGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSdcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTYgY29sLXNtLTJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5PUjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGFjci1pbWFnZS1tYXAgW0RhdGFFbGVtZW50XT1cImNob2ljZURhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1pbWFnZS1tYXA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA+IDJcIj4gICAgICAgICAgICBcclxuICAgICAgICA8c2VsZWN0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiXHJcbiAgICAgICAgIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIChjaGFuZ2UpPVwiZHJvcGRvd25DaG9pY2VTZWxlY3RlZCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbClcIlxyXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgPCEtLSA8b3B0aW9uIFxyXG4gICAgICAgICAgW3NlbGVjdGVkXT1cImNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9PSBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudCA/IHRydWUgOiBmYWxzZVwiPi0tU2VsZWN0LS08L29wdGlvbj5cclxuICAgICAgICAgLS0+XHJcbiAgICAgICAgICAgPG9wdGlvbiBbc2VsZWN0ZWRdPVwiXHJcbiAgICAgICAgICBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudCAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgKGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50LmluZGV4T2YoY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSA+IC0xID8gXHJcbiAgICAgICAgICB0cnVlIDpcclxuICAgICAgICAgIHRydWUpXHJcbiAgICAgICAgICA6IHRydWVcIj4tLVNlbGVjdC0tPC9vcHRpb24+XHJcblxyXG4gICAgICAgICAgPCEtLSBbc2VsZWN0ZWRdPVwiY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWVcIiAtLT5cclxuXHJcbiAgICAgICAgXHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1wiXHJcbiAgICAgICAgICBbaGlkZGVuXT1cImNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/IFxyXG4gICAgICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50LmluZGV4T2YoY2hvaWNlLnZhbHVlKSA+IC0xID8gdHJ1ZTogbnVsbFxyXG4gICAgICAgICAgICAgIDogbnVsbFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiY2hvaWNlLnZhbHVlXCIgICBcclxuICAgICAgICAgIFtzZWxlY3RlZF09XCJjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudCAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50LmluZGV4T2YoY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSA+IC0xXHJcbiAgICAgICAgICAgfHwgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2UudmFsdWUpID4gLTE/IGZhbHNlIDogXHJcbiAgICAgICAgICAgY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPyB0cnVlIDogZmFsc2VcclxuICAgICAgICAgICA6IGNob2ljZS52YWx1ZSA9PT0gY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID8gdHJ1ZSA6IGZhbHNlXCIgICAgICAgXHJcbiAgICAgICAgICA+e3tjaG9pY2UubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmFsbG93RnJlZXRleHRcIiBbdmFsdWVdPVwiJ2ZyZWV0ZXh0J1wiIFtzZWxlY3RlZF09XCInZnJlZXRleHQnXCI+T3RoZXIsIHBsZWFzZSBzcGVjaWZ54oCmPC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcblxyXG4gICAgICAgICAgPGlucHV0IGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBsZWFzZSBzcGVjaWZ5ICd7e2Nob2ljZURhdGFFbGVtZW50LmxhYmVsfX0nXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmltYWdlTWFwICE9IHVuZGVmaW5lZCAgJiYgaW1hZ2VQYXRoICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwYWRkaW5nLXRvcC0xMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTYgY29sLXNtLTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+T1I8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGFjci1pbWFnZS1tYXAgW0RhdGFFbGVtZW50XT1cImNob2ljZURhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1pbWFnZS1tYXA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuYCxcclxuICBzdHlsZXM6IFtgYCwgYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LnBhZGRpbmctbC01e3BhZGRpbmctbGVmdDo1cHh9LndoaXRlc3BhY2V7bWFyZ2luLWxlZnQ6NXB4fS5tYXgtdy1oLTEwMHttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2w+LmZhe2ZvbnQtc2l6ZTo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTIwcHh9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0LC5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1zaW11bGF0b3ItZm9ybS1oZWlnaHR7aGVpZ2h0OmNhbGMoMTAwdmggLSAxMDBweCk7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1yZXBvcnQtdGV4dC1zY3JvbGx7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMwMHB4KX0ucGFkZGluZy1yLTEwe3BhZGRpbmctcmlnaHQ6MTBweH0uc2xpZGUtbGVmdHtsZWZ0OjMwcHh9LnNsaWRlLXJpZ2h0e3JpZ2h0OjMwcHh9aHJ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0ud2hpdGUtc3BhY2UtbGluZXt3aGl0ZS1zcGFjZTpwcmUtbGluZTt3b3JkLXdyYXA6YnJlYWstd29yZH1we21hcmdpbjowIDAgMTBweH0uZm9ybS1jb250cm9se2JvcmRlci1yYWRpdXM6MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiNkMmQ2ZGV9aDQubW9kYWwtdGl0bGUuZmxvYXQtbGVmdHtmbG9hdDpsZWZ0fS5tYXJnaW4tYi0we21hcmdpbi1ib3R0b206MH0uZm9udC13ZWlnaHQtNDAwe2ZvbnQtd2VpZ2h0OjQwMH0uY3VzdG9tLXJhZGlvLXN0eWxle2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnpvb217d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS56b29tIGltZ3toZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO21heC13aWR0aDppbmhlcml0IWltcG9ydGFudH0uYnRuLXpvb217YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O2NvbG9yOiM0NDQ7Ym9yZGVyLWNvbG9yOiNkZGR9LmJ0bi16b29tLmhvdmVyLC5idG4tem9vbTphY3RpdmUsLmJ0bi16b29tOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7bGFiZWwuY29udHJvbC1sYWJlbHtwYWRkaW5nLWxlZnQ6MjBweH19LnBhZGRpbmctNXtwYWRkaW5nOjVweH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNzaXN0Q2hvaWNlRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgY2hvaWNlRGF0YUVsZW1lbnQ6IENob2ljZURhdGFFbGVtZW50O1xyXG4gIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSByZXR1cm5DaG9pY2VFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBjaG9pY2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgY2hvaWNlVmFsdWU6IHN0cmluZztcclxuXHJcbiAgY2hvaWNlRWxlbWVudEZvcm06IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZENvbmRpdGlvbjogU2VsZWN0ZWRDb25kaXRpb247XHJcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xyXG4gIHNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkQ2hvaWNlUmVwb3J0TGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkgeyB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNyZWF0ZUNob2ljZUVsZW1lbnRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAkKCcjZGl2XycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlkICsgJ19vdGhlcicpLmhpZGUoKTtcclxuICAgIGlmICh0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICQoJyMnICsgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgKyAnXycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuY2hvaWNlVmFsdWUgPSB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgY2hvaWNlIGluIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS52YWx1ZSA9PT0gJ2h5cG9FbmhhbmNpbmcnKXtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2FzZGFzZCcpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlID09PSB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnJlcG9ydFRleHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnJlcG9ydFRleHQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0TGFiZWwgPSB0aGlzLmNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS5sYWJlbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoIDw9IDUpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNob2ljZVZhbHVlKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsXHJcbiAgICAgICAgICAodGhpcy5zZWxlY3RlZENob2ljZVJlcG9ydFRleHQgIT09IHVuZGVmaW5lZCkgPyB0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCA6IHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25DaG9pY2VTZWxlY3RlZCh0aGlzLmNob2ljZURhdGFFbGVtZW50LmlkLCB0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0TGFiZWwsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlLCB0aGlzLmNob2ljZURhdGFFbGVtZW50LmxhYmVsKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQodW5kZWZpbmVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNob2ljZVZhbHVlKGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZEVsZW1lbnQ6IHN0cmluZywgc2VsZWN0ZWRUZXh0OiBzdHJpbmcsIHNlbGVjdGVkVmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0O1xyXG4gICAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQsIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZEVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IHNlbGVjdGVkVGV4dDtcclxuXHJcbiAgICAgIHRoaXMucmV0dXJuQ2hvaWNlRWxlbWVudC5lbWl0KHsgcmVjZWl2ZWRFbGVtZW50OiBjaG9pY2VFbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbjogdGhpcy5zZWxlY3RlZENvbmRpdGlvbiB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZURyb3Bkb3duQ2hvaWNlU2VsZWN0ZWQoZWxlbWVudElkLCBlbGVtZW50TGFiZWwsIGVsZW1lbnRWYWx1ZSwgc2VsZWN0ZWRDb25kaXRpb24pIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50VmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnRMYWJlbDtcclxuXHJcbiAgICBpZiAodGhpcy5jaG9pY2VWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJy0tU2VsZWN0LS0nIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnJykge1xyXG4gICAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9ICcnO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudElkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gZWxlbWVudExhYmVsO1xyXG4gICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hvaWNlU2VsZWN0ZWQoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkRWxlbWVudDogc3RyaW5nLCBzZWxlY3RlZFRleHQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0O1xyXG4gICAgdGhpcy5zaG93T3JIaWRlRnJlZVRleHQoZWxlbWVudElkLCBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRFbGVtZW50O1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRUZXh0O1xyXG4gICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgZHJvcGRvd25DaG9pY2VTZWxlY3RlZChlbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSAoZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dCA9PT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmeeKApicpID8gJ2ZyZWV0ZXh0JyA6IGVsZW1lbnQudmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdLnRleHQ7XHJcblxyXG4gICAgdGhpcy5zaG93T3JIaWRlRnJlZVRleHQoZWxlbWVudC5pZCwgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5jaG9pY2VWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJy0tU2VsZWN0LS0nIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnJykge1xyXG4gICAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9ICcnO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudC5pZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdLnRleHQ7XHJcblxyXG4gICAgLy8gQ29kZSBzaG91bGQgY29tZXMgaGVyZSAvL1xyXG4gICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDaG9pY2VFbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMuY2hvaWNlRWxlbWVudEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgY2hlY2tCb3g6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB9LCB7XHJcbiAgICAgICAgdmFsaWRhdG9yOiB0aGlzLnNwZWNpZmljVmFsdWVJbnNpZGVSYW5nZSgnY2hlY2tCb3gnKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PT0gJ2ZyZWV0ZXh0Jykge1xyXG4gICAgICAkKCcjZGl2XycgKyBlbGVtZW50SWQgKyAnX290aGVyJykuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnI2Rpdl8nICsgZWxlbWVudElkICsgJ19vdGhlcicpLmhpZGUoKTtcclxuICAgICAgJCgnI3R4dF9vdGhlcl8nICsgZWxlbWVudElkKS52YWwoJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRnJlZVRleHQoZWxlbWVudCwgZWxlbWVudElkLCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IChlbGVtZW50LnZhbHVlID09PSAnT3RoZXInKSA/ICdmcmVldGV4dCcgOiBlbGVtZW50LnZhbHVlO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIHNwZWNpZmljVmFsdWVJbnNpZGVSYW5nZShjaGVja0JveEtleTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gKGdyb3VwOiBGb3JtR3JvdXApID0+IHtcclxuICAgICAgY29uc3QgY2hvaWNlQ29udHJvbCA9IGdyb3VwLmNvbnRyb2xzW2NoZWNrQm94S2V5XTtcclxuICAgICAgaWYgKChjaG9pY2VDb250cm9sLnZhbHVlID09PSB1bmRlZmluZWQgfHwgY2hvaWNlQ29udHJvbC52YWx1ZSA9PT0gJycgfHwgY2hvaWNlQ29udHJvbC52YWx1ZSA9PT0gJy0tU2VsZWN0LS0nIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSkge1xyXG4gICAgICAgIHJldHVybiBjaG9pY2VDb250cm9sLnNldEVycm9ycyh7IG5vdEVxdWl2YWxlbnQ6IHRydWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=