acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
504 lines • 61.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { DurationDataElement } from '../../../core/elements/models/duration-data-element.model';
import { FormBuilder, Validators } from '@angular/forms';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
import { SimulatorCommunicationService } from '../../shared/services/simulator-communication.service';
export class AssistDurationElementComponent {
/**
* @param {?} formBuilder
* @param {?} simulatorEngineService
* @param {?} simulatorCommunicationService
*/
constructor(formBuilder, simulatorEngineService, simulatorCommunicationService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.supportedUnits = {
millisecond: {
'label': 'Millisecond',
'max': 999,
'min': 0,
'value': 0,
'step': 1
},
second: {
'label': 'Second',
'max': 59,
'min': 0,
'value': 0,
'step': 1
},
minute: {
'label': 'Minutes',
'max': 59,
'min': 0,
'value': 0,
'step': 1
},
hour: {
'label': 'Hours',
'max': 23,
'min': 0,
'value': 0,
'step': 1
},
day: {
'label': 'Days',
'max': 7,
'min': 0,
'value': 0,
'step': 1
},
week: {
'label': 'Week',
'max': 51,
'min': 0,
'value': 0,
'step': 1
}
};
this.daysvalue = 0;
this.hoursvalue = 0;
this.minutesvalue = 0;
this.DurationVal = 'PT0S';
this.durationOptions = {
showNegative: false,
showPreview: false,
showYears: false,
showMonths: false,
showWeeks: false,
min: 0
};
this.showdayminValidation = false;
this.showdaymaxValidation = false;
this.showminutemaxValidation = false;
this.showminuteminValidation = false;
this.showhourminValidation = false;
this.showhourmaxValidation = false;
this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(mission => {
this.SetRangeValuesForDurationPicker();
this.UpdateFormValidator();
});
}
/**
* @return {?}
*/
ngOnInit() {
this.SetRangeValuesForDurationPicker();
this.createDurationElementForm();
this.onChanges();
}
/**
* @return {?}
*/
ResetValidationVisibility() {
this.showdayminValidation = false;
this.showdaymaxValidation = false;
this.showminutemaxValidation = false;
this.showminuteminValidation = false;
this.showhourminValidation = false;
this.showhourmaxValidation = false;
}
/**
* @return {?}
*/
onChanges() {
this.durationElementForm.statusChanges
.subscribe(val => {
this.ResetValidationVisibility();
if (this.durationElementForm.controls['durationdayselement'].invalid
&& this.durationElementForm.controls['durationdayselement'].errors["max"]) {
this.showdaymaxValidation = true;
}
else if (this.durationElementForm.controls['durationdayselement'].invalid
&& this.durationElementForm.controls['durationdayselement'].errors["min"]) {
this.showdayminValidation = true;
}
else if (this.durationElementForm.controls['durationminuteselement'].invalid
&& this.durationElementForm.controls['durationminuteselement'].errors["min"]) {
this.showminuteminValidation = true;
}
else if (this.durationElementForm.controls['durationminuteselement'].invalid
&& this.durationElementForm.controls['durationminuteselement'].errors["max"]) {
this.showminutemaxValidation = true;
}
else if (this.durationElementForm.controls['durationhourselement'].invalid
&& this.durationElementForm.controls['durationhourselement'].errors["min"]) {
this.showhourminValidation = true;
}
else if (this.durationElementForm.controls['durationhourselement'].invalid
&& this.durationElementForm.controls['durationhourselement'].errors["max"]) {
this.showhourmaxValidation = true;
}
});
}
/**
* @return {?}
*/
SetRangeValuesForDurationPicker() {
const /** @type {?} */ $element = this.durationDataElement;
this.supportedUnits['day'].min = $element.MinimumDay !== undefined && $element.MinimumDay != null ?
$element.MinimumDay : 0;
this.supportedUnits['hour'].min = $element.MinimumHours !== undefined && $element.MinimumHours != null ?
$element.MinimumHours : 0;
this.supportedUnits['minute'].min = $element.MinimumMinutes !== undefined && $element.MinimumMinutes != null ?
$element.MinimumMinutes : 0;
this.supportedUnits['day'].max = $element.MaximumDay !== undefined && $element.MaximumDay != null ?
$element.MaximumDay : 9007199254740991;
this.supportedUnits['hour'].max = $element.MaximumHours !== undefined && $element.MaximumHours != null ?
$element.MaximumHours : 9007199254740991;
this.supportedUnits['minute'].max = $element.MaxmimumMinutes !== undefined && $element.MaxmimumMinutes != null ?
$element.MaxmimumMinutes : 9007199254740991;
}
/**
* @return {?}
*/
createDurationElementForm() {
this.durationElementForm = this.formBuilder.group({
durationdayselement: ['', Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['day'].min), Validators.max(+this.supportedUnits['day'].max)])],
durationminuteselement: ['', Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['minute'].min), Validators.max(+this.supportedUnits['minute'].max)])],
durationhourselement: ['', Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['hour'].min), Validators.max(+this.supportedUnits['hour'].max)])]
});
}
/**
* @param {?} event
* @return {?}
*/
onlyInteger(event) {
return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
}
/**
* @return {?}
*/
UpdateFormValidator() {
this.durationElementForm.controls['durationdayselement'].setValidators([Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['day'].min), Validators.max(+this.supportedUnits['day'].max)])]);
this.durationElementForm.controls['durationdayselement'].updateValueAndValidity();
this.durationElementForm.controls['durationminuteselement'].setValidators([Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['minute'].min), Validators.max(+this.supportedUnits['minute'].max)])]);
this.durationElementForm.controls['durationminuteselement'].updateValueAndValidity();
this.durationElementForm.controls['durationhourselement'].setValidators([Validators.compose([Validators.required,
Validators.min(+this.supportedUnits['hour'].min), Validators.max(+this.supportedUnits['hour'].max)])]);
this.durationElementForm.controls['durationhourselement'].updateValueAndValidity();
}
/**
* @param {?} property
* @return {?}
*/
increaseValue(property) {
let /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue === undefined || this.daysvalue == null ? 0 : this.daysvalue;
if (currentValue < this.supportedUnits['day'].max) {
currentValue = currentValue + this.supportedUnits['day'].step;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue === undefined || this.hoursvalue == null ? 0 : this.hoursvalue;
if (currentValue < this.supportedUnits['hour'].max) {
currentValue = currentValue + this.supportedUnits['hour'].step;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue === undefined || this.minutesvalue == null ? 0 : this.minutesvalue;
if (currentValue < this.supportedUnits['minute'].max) {
currentValue = currentValue + this.supportedUnits['minute'].step;
}
this.minutesvalue = currentValue;
break;
}
}
/**
* @param {?} property
* @return {?}
*/
decreaseValue(property) {
let /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue;
if (currentValue > this.supportedUnits['day'].min) {
currentValue = currentValue - this.supportedUnits['day'].step;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue;
if (currentValue > this.supportedUnits['hour'].min) {
currentValue = currentValue - this.supportedUnits['hour'].step;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue;
if (currentValue > this.supportedUnits['minute'].min) {
currentValue = currentValue - this.supportedUnits['minute'].step;
}
this.minutesvalue = currentValue;
break;
}
}
/**
* @param {?} event
* @param {?} property
* @return {?}
*/
checkValue(event, property) {
let /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.minutesvalue = currentValue;
break;
}
}
/**
* @return {?}
*/
ngOnDestroy() {
// prevent memory leak when component destroyed
this.subscription.unsubscribe();
}
}
AssistDurationElementComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-assist-duration-element',
template: `<form [formGroup]="durationElementForm" novalidate>
<div class="form-group">
<div class="col-sm-5 text-right">
<label class="control-label break-word">
<!-- {{dateTimeDataElement | json}} -->
{{durationDataElement.label}}
<span *ngIf="durationDataElement.unit != undefined && durationDataElement.unit != ''">
({{durationDataElement.unit}})</span>
</label>
<ng-container *ngIf="durationDataElement.hint !== '' && durationDataElement.hint !== undefined">
<i class="fa fa-info-circle text-primary whitespace" title="{{durationDataElement.hint}}"></i>
</ng-container>
<!-- <ng-container *ngIf="durationDataElement.diagrams != undefined ">
<acr-hint-diagram [dataElement]="durationDataElement" [imagePath]="imagePath"></acr-hint-diagram>
</ng-container> -->
<!-- <ng-container *ngIf="this.durationDataElement.isRequired">
<span *ngIf="DurationVal == 'PT0S' || DurationVal == null" class="required-field" title="Duration field should be non zero">
*
</span>
</ng-container> -->
<ng-container *ngIf="this.durationDataElement.isRequired
&& (!showdayminValidation && !showdaymaxValidation && !showminuteminValidation
&& !showminutemaxValidation && !showhourminValidation && !showhourmaxValidation)">
<span *ngIf="durationElementForm.controls['durationdayselement'].invalid
|| durationElementForm.controls['durationminuteselement'].invalid
|| durationElementForm.controls['durationhourselement'].invalid">
<span *ngIf="durationElementForm.controls['durationdayselement'].errors != null && durationElementForm.controls['durationdayselement'].errors.required
|| durationElementForm.controls['durationminuteselement'].errors != null && durationElementForm.controls['durationminuteselement'].errors.required
|| durationElementForm.controls['durationhourselement'].errors != null && durationElementForm.controls['durationhourselement'].errors.required "
class="required-field" title="Required Field">
*
</span>
</span>
</ng-container>
<span *ngIf="showdayminValidation"
class="required-field" title=" Minimum value for day is {{supportedUnits['day'].min}}">
*
</span>
<span *ngIf="showdaymaxValidation"
class="required-field" title=" Maximum value for day is {{supportedUnits['day'].max}}">
*
</span>
<span *ngIf="showminuteminValidation"
class="required-field" title=" Minimum value for minute is {{supportedUnits['minute'].min}}">
*
</span>
<span *ngIf="showminutemaxValidation"
class="required-field" title=" Maximum value for minute is {{supportedUnits['minute'].max}}">
*
</span>
<span *ngIf="showhourminValidation"
class="required-field" title=" Minimum value for hour is {{supportedUnits['hour'].min}}">
*
</span>
<span *ngIf="showhourmaxValidation"
class="required-field" title=" Maximum value for hour is {{supportedUnits['hour'].max}}">
*
</span>
</div>
<div class="col-sm-7" style="display:inline-flex">
<!-- <div [ngClass]="durationDataElement.isEditable == false ? 'disabled-picker' : ''">
<ngx-duration-picker min="0" formControlName="durationElement" [options]="durationOptions" [(value)]="DurationVal"></ngx-duration-picker>
</div> -->
<!-- <div class="form-group"> -->
<div [ngClass]="durationDataElement.isEditable == false ? 'disabled-picker' : ''">
<table>
<tbody>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="increaseValue('days')" class="btn btn-link btn-decrementer">
+
</button>
</td>
</tr> -->
<tr class="text-center">
<td class="input-group input-group-sm">
<input tabindex="1" [attr.disabled]="durationDataElement.isEditable == false ? 'disabled' : null"
formControlName="durationdayselement" [(ngModel)]="daysvalue" class="form-control text-center txt-duration"
(blur)="checkValue($event, 'days')" type="number" min="{{supportedUnits['day'].min}}" max="{{supportedUnits['day'].max}}"
(keypress)="onlyInteger($event)" onpaste="return false;" required />
<span class="input-group-addon" style="padding: 5px;">{{supportedUnits['day'].label}}</span>
</td>
</tr>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="decreaseValue('days')" class="btn btn-link btn-decrementer">
-
</button>
</td>
</tr> -->
</tbody>
</table>
</div>
<table style="margin-left:10px;">
<tbody>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="increaseValue('hour')" class="btn btn-link btn-incrementer">
+
</button>
</td>
</tr> -->
<tr class="text-center">
<td class="input-group input-group-sm">
<input tabindex="2" [attr.disabled]="durationDataElement.isEditable == false ? 'disabled' : null"
formControlName="durationhourselement" [(ngModel)]="hoursvalue" class="form-control text-center txt-duration"
(blur)="checkValue($event,'hour')" type="number" min="{{supportedUnits['hour'].min}}" max="{{supportedUnits['hour'].max}}"
(keypress)="onlyInteger($event)" onpaste="return false;" required />
<span class="input-group-addon" style="padding: 5px;">{{supportedUnits['hour'].label}}</span>
</td>
</tr>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="decreaseValue('hour')" class="btn btn-link btn-decrementer">
-
</button>
</td>
</tr> -->
</tbody>
</table>
<table style="margin-left:10px;">
<tbody>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="increaseValue('minute')" class="btn btn-link btn-decrementer">
+
</button>
</td>
</tr> -->
<tr class="text-center">
<td class="input-group input-group-sm">
<input tabindex="3" [(ngModel)]="minutesvalue" formControlName="durationminuteselement" [attr.disabled]="durationDataElement.isEditable == false ? 'disabled' : null"
class="form-control text-center txt-duration" (blur)="checkValue($event, 'minute')" type="number" min="{{supportedUnits['minute'].min}}"
max="{{supportedUnits['minute'].max}}" (keypress)="onlyInteger($event)" onpaste="return false;" required />
<span class="input-group-addon" style="padding: 5px;">{{supportedUnits['minute'].label}}</span>
</td>
</tr>
<!-- <tr class="text-center">
<td>
<button type="button" (click)="decreaseValue('minute')" class="btn btn-link btn-decrementer">
-
</button>
</td>
</tr> -->
</tbody>
</table>
<!-- </div> -->
</div>
</div>
</form>`,
styles: [`.required-field{color:red}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:"";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{text-align:center}.btn-decrementer,.btn-incrementer{text-decoration:none;outline:0}.txt-duration{width:42px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:0!important;outline-offset:-2px}`]
},] },
];
/** @nocollapse */
AssistDurationElementComponent.ctorParameters = () => [
{ type: FormBuilder },
{ type: SimulatorEngineService },
{ type: SimulatorCommunicationService }
];
AssistDurationElementComponent.propDecorators = {
durationDataElement: [{ type: Input }]
};
function AssistDurationElementComponent_tsickle_Closure_declarations() {
/** @type {?} */
AssistDurationElementComponent.prototype.durationDataElement;
/** @type {?} */
AssistDurationElementComponent.prototype.durationElementForm;
/** @type {?} */
AssistDurationElementComponent.prototype.subscription;
/** @type {?} */
AssistDurationElementComponent.prototype.supportedUnits;
/** @type {?} */
AssistDurationElementComponent.prototype.daysvalue;
/** @type {?} */
AssistDurationElementComponent.prototype.hoursvalue;
/** @type {?} */
AssistDurationElementComponent.prototype.minutesvalue;
/** @type {?} */
AssistDurationElementComponent.prototype.DurationVal;
/** @type {?} */
AssistDurationElementComponent.prototype.durationOptions;
/** @type {?} */
AssistDurationElementComponent.prototype.showdayminValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.showdaymaxValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.showminutemaxValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.showminuteminValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.showhourminValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.showhourmaxValidation;
/** @type {?} */
AssistDurationElementComponent.prototype.formBuilder;
/** @type {?} */
AssistDurationElementComponent.prototype.simulatorEngineService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNoRyxPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBMEt0RyxNQUFNOzs7Ozs7SUFzREosWUFBb0IsV0FBd0IsRUFBVSxzQkFBOEMsRUFDbEcsNkJBQTREO1FBRDFDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3Qjs4QkFqRDlFO1lBQ3BCLFdBQVcsRUFBRTtnQkFDWCxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLENBQUM7YUFDVjtZQUNELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsUUFBUTtnQkFDakIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLENBQUM7YUFDVjtZQUNELE1BQU0sRUFBRTtn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WUFFdEIsNkJBQTZCOzs7a0NBMktuQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kdXJhdGlvbi1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJkdXJhdGlvbkVsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHRleHQtcmlnaHRcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBicmVhay13b3JkXCI+XHJcbiAgICAgICAgPCEtLSB7e2RhdGVUaW1lRGF0YUVsZW1lbnQgfCBqc29ufX0gLS0+XHJcbiAgICAgICAge3tkdXJhdGlvbkRhdGFFbGVtZW50LmxhYmVsfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQudW5pdCAhPSB1bmRlZmluZWQgJiYgZHVyYXRpb25EYXRhRWxlbWVudC51bml0ICE9ICcnXCI+XHJcbiAgICAgICAgICAoe3tkdXJhdGlvbkRhdGFFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkdXJhdGlvbkRhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGR1cmF0aW9uRGF0YUVsZW1lbnQuaGludCAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnkgd2hpdGVzcGFjZVwiIHRpdGxlPVwie3tkdXJhdGlvbkRhdGFFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJkdXJhdGlvbkRhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoaXMuZHVyYXRpb25EYXRhRWxlbWVudC5pc1JlcXVpcmVkXCI+ICAgICAgXHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJEdXJhdGlvblZhbCA9PSAnUFQwUycgfHwgRHVyYXRpb25WYWwgPT0gbnVsbFwiIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIkR1cmF0aW9uIGZpZWxkIHNob3VsZCBiZSBub24gemVyb1wiPlxyXG4gICAgICAgICAgKlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5kdXJhdGlvbkRhdGFFbGVtZW50LmlzUmVxdWlyZWRcclxuICAgICAgJiYgKCFzaG93ZGF5bWluVmFsaWRhdGlvbiAmJiAhc2hvd2RheW1heFZhbGlkYXRpb24gJiYgIXNob3dtaW51dGVtaW5WYWxpZGF0aW9uXHJcbiAgICAgICAgICAgJiYgIXNob3dtaW51dGVtYXhWYWxpZGF0aW9uICYmICFzaG93aG91cm1pblZhbGlkYXRpb24gJiYgIXNob3dob3VybWF4VmFsaWRhdGlvbilcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzICE9IG51bGwgJiYgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmVycm9ycy5yZXF1aXJlZCBcclxuICAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uZXJyb3JzLnJlcXVpcmVkIFxyXG4gICAgICAgICAgfHwgIGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uZXJyb3JzICE9IG51bGwgJiYgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWQgXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj5cclxuICAgICAgICAgICAgKlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+ICAgICAgXHJcblxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dkYXltaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgZGF5IGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbn19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIFxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dkYXltYXhWYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWF4aW11bSB2YWx1ZSBmb3IgZGF5IGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heH19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dtaW51dGVtaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgbWludXRlIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbn19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd21pbnV0ZW1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBtaW51dGUgaXMge3tzdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4fX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2hvdXJtaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgaG91ciBpcyB7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93aG91cm1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBob3VyIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXh9fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4XCI+XHJcbiAgICAgIDwhLS0gPGRpdiBbbmdDbGFzc109XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgPG5neC1kdXJhdGlvbi1waWNrZXIgbWluPVwiMFwiIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uRWxlbWVudFwiIFtvcHRpb25zXT1cImR1cmF0aW9uT3B0aW9uc1wiIFsodmFsdWUpXT1cIkR1cmF0aW9uVmFsXCI+PC9uZ3gtZHVyYXRpb24tcGlja2VyPlxyXG4gICAgICA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPiAtLT5cclxuICAgICAgPGRpdiBbbmdDbGFzc109XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgPHRhYmxlPlxyXG4gICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImluY3JlYXNlVmFsdWUoJ2RheXMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICArXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHRhYmluZGV4PVwiMVwiIFthdHRyLmRpc2FibGVkXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25kYXlzZWxlbWVudFwiIFsobmdNb2RlbCldPVwiZGF5c3ZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsICdkYXlzJylcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwie3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWlufX1cIiBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydkYXknXS5tYXh9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPCEtLSA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdkYXlzJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgLVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHRhYmxlIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnaG91cicpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWluY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICArXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHRhYmluZGV4PVwiMlwiIFthdHRyLmRpc2FibGVkXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uaG91cnNlbGVtZW50XCIgWyhuZ01vZGVsKV09XCJob3Vyc3ZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCJcclxuICAgICAgICAgICAgICAgIChibHVyKT1cImNoZWNrVmFsdWUoJGV2ZW50LCdob3VyJylcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwie3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1pbn19XCIgbWF4PVwie3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1heH19XCJcclxuICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj57e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVjcmVhc2VWYWx1ZSgnaG91cicpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPHRhYmxlIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnbWludXRlJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIzXCIgWyhuZ01vZGVsKV09XCJtaW51dGVzdmFsdWVcIiBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvbm1pbnV0ZXNlbGVtZW50XCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCIgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsICdtaW51dGUnKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW59fVwiXHJcbiAgICAgICAgICAgICAgICBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXh9fVwiIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj57e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdtaW51dGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgLVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuXHJcbiAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPmAsXHJcbiAgc3R5bGVzOiBbYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LmRpc2FibGVkLXBpY2tlcntjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkLXBpY2tlcjpiZWZvcmV7Y29udGVudDpcIlwiO3otaW5kZXg6MTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfWlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixpbnB1dFt0eXBlPW51bWJlcl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7bWFyZ2luOjB9aW5wdXRbdHlwZT1udW1iZXJde3RleHQtYWxpZ246Y2VudGVyfS5idG4tZGVjcmVtZW50ZXIsLmJ0bi1pbmNyZW1lbnRlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtvdXRsaW5lOjB9LnR4dC1kdXJhdGlvbnt3aWR0aDo0MnB4fS5idG4uYWN0aXZlLmZvY3VzLC5idG4uYWN0aXZlOmZvY3VzLC5idG4uZm9jdXMsLmJ0bjphY3RpdmUuZm9jdXMsLmJ0bjphY3RpdmU6Zm9jdXMsLmJ0bjpmb2N1c3tvdXRsaW5lOjAhaW1wb3J0YW50O291dGxpbmUtb2Zmc2V0Oi0ycHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFzc2lzdER1cmF0aW9uRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgZHVyYXRpb25EYXRhRWxlbWVudDogRHVyYXRpb25EYXRhRWxlbWVudDtcclxuICBkdXJhdGlvbkVsZW1lbnRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHN1cHBvcnRlZFVuaXRzOiBhbnkgPSB7XHJcbiAgICBtaWxsaXNlY29uZDoge1xyXG4gICAgICAnbGFiZWwnOiAnTWlsbGlzZWNvbmQnLFxyXG4gICAgICAnbWF4JzogOTk5LFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgc2Vjb25kOiB7XHJcbiAgICAgICdsYWJlbCc6ICdTZWNvbmQnLFxyXG4gICAgICAnbWF4JzogNTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBtaW51dGU6IHtcclxuICAgICAgJ2xhYmVsJzogJ01pbnV0ZXMnLFxyXG4gICAgICAnbWF4JzogNTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBob3VyOiB7XHJcbiAgICAgICdsYWJlbCc6ICdIb3VycycsXHJcbiAgICAgICdtYXgnOiAyMyxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIGRheToge1xyXG4gICAgICAnbGFiZWwnOiAnRGF5cycsXHJcbiAgICAgICdtYXgnOiA3LFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgd2Vlazoge1xyXG4gICAgICAnbGFiZWwnOiAnV2VlaycsXHJcbiAgICAgICdtYXgnOiA1MSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGRheXN2YWx1ZSA9IDA7XHJcbiAgaG91cnN2YWx1ZSA9IDA7XHJcbiAgbWludXRlc3ZhbHVlID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSxcclxuICAgIHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlOiBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBzaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZS5zaW11bGF0b3JTb3VyY2UkLnN1YnNjcmliZShcclxuICAgICAgbWlzc2lvbiA9PiB7XHJcbiAgICAgICAgdGhpcy5TZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCk7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVGb3JtVmFsaWRhdG9yKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBEdXJhdGlvblZhbCA9ICdQVDBTJztcclxuICBkdXJhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICBzaG93TmVnYXRpdmU6IGZhbHNlLFxyXG4gICAgc2hvd1ByZXZpZXc6IGZhbHNlLFxyXG4gICAgc2hvd1llYXJzOiBmYWxzZSxcclxuICAgIHNob3dNb250aHM6IGZhbHNlLFxyXG4gICAgc2hvd1dlZWtzOiBmYWxzZSxcclxuICAgIG1pbjogMFxyXG4gIH07XHJcblxyXG4gIHNob3dkYXltaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2RheW1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gIHNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2hvdXJtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5TZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUR1cmF0aW9uRWxlbWVudEZvcm0oKTtcclxuICAgIHRoaXMub25DaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBSZXNldFZhbGlkYXRpb25WaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93ZGF5bWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93ZGF5bWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93bWludXRlbWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93aG91cm1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICAgICAgdGhpcy5SZXNldFZhbGlkYXRpb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2RheW1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLm1pbikge1xyXG4gICAgICAgICAgdGhpcy5zaG93ZGF5bWluVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd21pbnV0ZW1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dob3VybWluVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCkge1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSB0aGlzLmR1cmF0aW9uRGF0YUVsZW1lbnQ7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtRGF5ICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWluaW11bURheSAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWluaW11bURheSA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluID0gJGVsZW1lbnQuTWluaW11bUhvdXJzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWluaW11bUhvdXJzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtSG91cnMgOiAwO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluID0gJGVsZW1lbnQuTWluaW11bU1pbnV0ZXMgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtTWludXRlcyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWluaW11bU1pbnV0ZXMgOiAwO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4ID0gJGVsZW1lbnQuTWF4aW11bURheSAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heGltdW1EYXkgIT0gbnVsbCA/XHJcbiAgICAgICRlbGVtZW50Lk1heGltdW1EYXkgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1heCA9ICRlbGVtZW50Lk1heGltdW1Ib3VycyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heGltdW1Ib3VycyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4aW11bUhvdXJzIDogOTAwNzE5OTI1NDc0MDk5MTtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCA9ICRlbGVtZW50Lk1heG1pbXVtTWludXRlcyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heG1pbXVtTWludXRlcyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzIDogOTAwNzE5OTI1NDc0MDk5MTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRHVyYXRpb25FbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBkdXJhdGlvbmRheXNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXgpXSldLFxyXG4gICAgICBkdXJhdGlvbm1pbnV0ZXNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXgpXSldLFxyXG4gICAgICBkdXJhdGlvbmhvdXJzZWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpXSldXHJcbiAgICAgIC8vIGR1cmF0aW9uZGF5c2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbmx5SW50ZWdlcihldmVudCkge1xyXG4gICAgcmV0dXJuIChldmVudC5jaGFyQ29kZSA9PT0gOCB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBudWxsIDogZXZlbnQuY2hhckNvZGUgPj0gNDggJiYgZXZlbnQuY2hhckNvZGUgPD0gNTc7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVGb3JtVmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXgpXSldKTtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCldKV0pO1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4KV0pXSk7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluY3JlYXNlVmFsdWUocHJvcGVydHkpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmRheXN2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGF5c3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlICsgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlID09PSB1bmRlZmluZWQgfHwgdGhpcy5ob3Vyc3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4KSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgKyB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm1pbnV0ZXN2YWx1ZSA9PSBudWxsID8gMCA6IHRoaXMubWludXRlc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXgpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLnN0ZXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pbnV0ZXN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWNyZWFzZVZhbHVlKHByb3BlcnR5KTogdm9pZCB7XHJcbiAgICBsZXQgY3VycmVudFZhbHVlID0gMDtcclxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuICAgICAgY2FzZSAnZGF5cyc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbikge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlIC0gdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPiB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbikge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlIC0gdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWludXRlc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tWYWx1ZShldmVudDogYW55LCBwcm9wZXJ0eSkge1xyXG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF5c3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50VmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50VmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5taW51dGVzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dXNlLWxpZmUtY3ljbGUtaW50ZXJmYWNlXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBwcmV2ZW50IG1lbW9yeSBsZWFrIHdoZW4gY29tcG9uZW50IGRlc3Ryb3llZFxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19