acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
228 lines (227 loc) • 33.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { MultiChoiceDataElement } from '../../../core/elements/models/multi-choice-data-element';
import { MultiChoiceElement } from '../assist-data-element.component';
import { FormBuilder, Validators } from '@angular/forms';
import { SelectedCondition } from '../../../core/models/executed-result.model';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
const /** @type {?} */ $ = require('jquery');
export class AssistMultiChoiceElementComponent {
/**
* @param {?} formBuilder
* @param {?} simulatorEngineService
*/
constructor(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnMultiChoice = new EventEmitter();
this.multiElements = [];
this.multiChoiceValues = [];
this.multiChoiceComaprisonValues = [];
this.choiceValue = [];
}
/**
* @return {?}
*/
ngOnInit() {
this.createMultiChoiceElementForm();
}
/**
* @return {?}
*/
ngAfterViewInit() {
if (this.multiChoiceElement.currentValue !== undefined) {
const /** @type {?} */ values = [];
const /** @type {?} */ labels = [];
for (const /** @type {?} */ choice in this.multiChoiceElement.choiceInfo) {
if (Array.isArray(this.multiChoiceElement.currentValue)) {
for (const /** @type {?} */ currValue of this.multiChoiceElement.currentValue) {
if (currValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
this.choiceValue = this.multiChoiceElement.currentValue;
$('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.choiceInfo[choice].value).prop('checked', true);
values.push(currValue);
labels.push(this.multiChoiceElement.choiceInfo[choice].label);
break;
}
}
}
else {
if (this.multiChoiceElement.currentValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
this.choiceValue = this.multiChoiceElement.currentValue;
$('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.currentValue).prop('checked', true);
values.push(this.multiChoiceElement.currentValue);
labels.push(this.multiChoiceElement.choiceInfo[choice].label);
}
}
}
this.selectedMultiChoice(this.multiChoiceElement.id, this.multiChoiceElement.label, values, labels);
}
else {
this.returnMultiChoice.emit(undefined);
}
}
/**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} choiceValue
* @param {?} choiceLabel
* @return {?}
*/
selectedMultiChoice(elementId, selectedCondition, choiceValue, choiceLabel) {
const /** @type {?} */ multiElement = new MultiChoiceElement();
if ($('#' + elementId + '_' + choiceValue).is(':checked')) {
this.multiChoiceValues = choiceLabel;
this.multiChoiceComaprisonValues = choiceValue;
}
else {
const /** @type {?} */ index = this.multiChoiceValues.indexOf(choiceLabel);
const /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(choiceValue);
if (index > -1) {
this.multiChoiceValues.splice(index, 1);
}
if (comparisonIndex > -1) {
this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
}
}
multiElement.elementId = elementId;
multiElement.selectedValues = this.multiChoiceValues;
multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = this.multiChoiceValues;
this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
}
/**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} value
* @param {?} event
* @return {?}
*/
updateMultiChoice(elementId, selectedCondition, value, event) {
const /** @type {?} */ multiElement = new MultiChoiceElement();
if (event.currentTarget.checked) {
this.multiChoiceValues.push(value);
this.multiChoiceComaprisonValues.push(event.currentTarget.value);
}
else {
const /** @type {?} */ index = this.multiChoiceValues.indexOf(value);
const /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(event.currentTarget.value);
if (index > -1) {
this.multiChoiceValues.splice(index, 1);
}
if (comparisonIndex > -1) {
this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
}
}
multiElement.elementId = elementId;
multiElement.selectedValues = this.multiChoiceValues;
multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = this.multiChoiceValues;
this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
}
/**
* @return {?}
*/
createMultiChoiceElementForm() {
this.multiChoiceElementForm = this.formBuilder.group({
multiCheckBox: ['', Validators.required],
}, {
validator: this.specificValueInsideRange('multiCheckBox')
});
}
/**
* @param {?} checkBoxKey
* @return {?}
*/
specificValueInsideRange(checkBoxKey) {
return (group) => {
const /** @type {?} */ choiceControl = group.controls[checkBoxKey];
if (this.multiChoiceElement.isRequired) {
return choiceControl.setErrors({ notEquivalent: true });
}
else {
return choiceControl.setErrors(null);
}
};
}
}
AssistMultiChoiceElementComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-assist-multi-choice-element',
template: `<form [formGroup]="multiChoiceElementForm" novalidate>
<div class="form-group">
<div class="col-sm-5 text-right">
<label class="control-label break-word">{{multiChoiceElement.label}} <span *ngIf="multiChoiceElement.unit != undefined && multiChoiceElement.unit != ''"> ({{multiChoiceElement.unit}})</span>
</label>
<ng-container *ngIf="multiChoiceElement.hint !== '' && multiChoiceElement.hint !== undefined">
<i class="fa fa-info-circle text-primary whitespace" title="{{multiChoiceElement.hint}}"></i>
</ng-container>
<ng-container *ngIf="multiChoiceElement.diagrams != undefined ">
<acr-hint-diagram [dataElement]="multiChoiceElement" [imagePath]="imagePath"></acr-hint-diagram>
</ng-container>
<ng-container *ngIf="multiChoiceElement.isRequired">
<span *ngIf="multiChoiceElementForm.controls['multiCheckBox'].invalid && !multiChoiceValues.length" class="required-field"
title="Required Field">
*
</span>
</ng-container>
</div>
<div class="col-sm-7" [ngClass]="multiChoiceElement.isEditable == false ? 'disabled-element' : ''">
<div *ngFor="let choice of multiChoiceElement.choiceInfo" class="checkbox checkboxCustomized" title="{{choice.hint}}">
<label [hidden]="multiChoiceElement.ChoiceNotRelevant != undefined ?
multiChoiceElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null
: null">
<input type="checkbox" id="{{multiChoiceElement.id}}_{{choice.value}}" [checked]="false" formControlName="multiCheckBox"
value="{{choice.value}}" (change)="updateMultiChoice(multiChoiceElement.id, multiChoiceElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, $event)">
{{choice.label}}
</label>
</div>
</div>
</div>
</form>`,
styles: [`.checkboxCustomized{min-height:0!important;padding-top:0!important}.disabled-element{cursor:not-allowed}.disabled-element:before{content:"";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}`, `.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 */
AssistMultiChoiceElementComponent.ctorParameters = () => [
{ type: FormBuilder },
{ type: SimulatorEngineService }
];
AssistMultiChoiceElementComponent.propDecorators = {
multiChoiceElement: [{ type: Input }],
imagePath: [{ type: Input }],
returnMultiChoice: [{ type: Output }]
};
function AssistMultiChoiceElementComponent_tsickle_Closure_declarations() {
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.multiChoiceElement;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.imagePath;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.returnMultiChoice;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.multiElements;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.multiChoiceValues;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.multiChoiceComaprisonValues;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.multiChoiceElementForm;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.selectedCondition;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.choiceValue;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.formBuilder;
/** @type {?} */
AssistMultiChoiceElementComponent.prototype.simulatorEngineService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1tdWx0aS1jaG9pY2UtZWxlbWVudC9hc3Npc3QtbXVsdGktY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pGLHVCQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFxQzVCLE1BQU07Ozs7O0lBV0osWUFBb0IsV0FBd0IsRUFBVSxzQkFBOEM7UUFBaEYsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO2lDQVJ0RSxJQUFJLFlBQVksRUFBRTs2QkFDVixFQUFFO2lDQUNWLEVBQUU7MkNBQ1EsRUFBRTsyQkFHbEIsRUFBRTtLQUUrRTs7OztJQUV6RyxRQUFRO1FBQ04sSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7S0FDckM7Ozs7SUFDRCxlQUFlO1FBRWIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFD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LENBQUMsQ0FBQzthQUN6RDtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1NBQ0YsQ0FBQzs7OztZQXhKTCxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlDQUFpQztnQkFDM0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUE4Qko7Z0JBQ04sTUFBTSxFQUFFLENBQUMsOE9BQThPLEVBQUUsazdDQUFrN0MsQ0FBQzthQUM3cUQ7Ozs7WUF2Q21CLFdBQVc7WUFFdEIsc0JBQXNCOzs7aUNBdUM1QixLQUFLO3dCQUNMLEtBQUs7Z0NBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTXVsdGlDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL211bHRpLWNob2ljZS1kYXRhLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBNdWx0aUNob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwibXVsdGlDaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPnt7bXVsdGlDaG9pY2VFbGVtZW50LmxhYmVsfX0gPHNwYW4gKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQudW5pdCAhPSB1bmRlZmluZWQgJiYgbXVsdGlDaG9pY2VFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7bXVsdGlDaG9pY2VFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaGludCAhPT0gJycgJiYgbXVsdGlDaG9pY2VFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1wcmltYXJ5IHdoaXRlc3BhY2VcIiB0aXRsZT1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJtdWx0aUNob2ljZUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIm11bHRpQ2hvaWNlRWxlbWVudEZvcm0uY29udHJvbHNbJ211bHRpQ2hlY2tCb3gnXS5pbnZhbGlkICYmICFtdWx0aUNob2ljZVZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCJcclxuICAgICAgICB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCIgW25nQ2xhc3NdPVwibXVsdGlDaG9pY2VFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtZWxlbWVudCcgOiAnJ1wiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgbXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9cIiBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94Q3VzdG9taXplZFwiIHRpdGxlPVwie3tjaG9pY2UuaGludH19XCI+XHJcbiAgICAgICAgPGxhYmVsIFtoaWRkZW5dPVwibXVsdGlDaG9pY2VFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/IFxyXG4gICAgICAgIG11bHRpQ2hvaWNlRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMSA/IHRydWU6IG51bGxcclxuICAgICAgICA6IG51bGxcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmlkfX1fe3tjaG9pY2UudmFsdWV9fVwiIFtjaGVja2VkXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibXVsdGlDaGVja0JveFwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiIChjaGFuZ2UpPVwidXBkYXRlTXVsdGlDaG9pY2UobXVsdGlDaG9pY2VFbGVtZW50LmlkLCBtdWx0aUNob2ljZUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICB7e2Nob2ljZS5sYWJlbH19XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPmAsXHJcbiAgc3R5bGVzOiBbYC5jaGVja2JveEN1c3RvbWl6ZWR7bWluLWhlaWdodDowIWltcG9ydGFudDtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0uZGlzYWJsZWQtZWxlbWVudHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkLWVsZW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XCJcIjt6LWluZGV4OjE7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX1gLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RNdWx0aUNob2ljZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIG11bHRpQ2hvaWNlRWxlbWVudDogTXVsdGlDaG9pY2VEYXRhRWxlbWVudDtcclxuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcmV0dXJuTXVsdGlDaG9pY2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgbXVsdGlFbGVtZW50czogTXVsdGlDaG9pY2VFbGVtZW50W10gPSBbXTtcclxuICBtdWx0aUNob2ljZVZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBtdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgbXVsdGlDaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVNdWx0aUNob2ljZUVsZW1lbnRGb3JtKCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgdmFsdWVzOiBhbnkgPSBbXTtcclxuICAgICAgY29uc3QgbGFiZWxzOiBhbnkgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgY3VyclZhbHVlIG9mIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VyclZhbHVlID09PSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgJiYgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNob2ljZVZhbHVlID0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChjdXJyVmFsdWUpO1xyXG4gICAgICAgICAgICAgIGxhYmVscy5wdXNoKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSA9PT0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICYmIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hvaWNlVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgdmFsdWVzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlKTtcclxuICAgICAgICAgICAgbGFiZWxzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZE11bHRpQ2hvaWNlKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmlkLCB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5sYWJlbCwgdmFsdWVzLCBsYWJlbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZE11bHRpQ2hvaWNlKGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZENvbmRpdGlvbjogc3RyaW5nLCBjaG9pY2VWYWx1ZTogYW55LCBjaG9pY2VMYWJlbDogYW55KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoJCgnIycgKyBlbGVtZW50SWQgKyAnXycgKyBjaG9pY2VWYWx1ZSkuaXMoJzpjaGVja2VkJykpIHtcclxuICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcyA9IGNob2ljZUxhYmVsO1xyXG4gICAgICB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcyA9IGNob2ljZVZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLmluZGV4T2YoY2hvaWNlTGFiZWwpO1xyXG4gICAgICBjb25zdCBjb21wYXJpc29uSW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcy5pbmRleE9mKGNob2ljZVZhbHVlKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbXBhcmlzb25JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXMuc3BsaWNlKGNvbXBhcmlzb25JbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG11bHRpRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBtdWx0aUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkQ29tcGFyaXNvblZhbHVlcyA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHsgcmVjZWl2ZWRFbGVtZW50OiBtdWx0aUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTXVsdGlDaG9pY2UoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkQ29uZGl0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGV2ZW50KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnB1c2goZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNvbXBhcmlzb25JbmRleCA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLmluZGV4T2YoZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wYXJpc29uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnNwbGljZShjb21wYXJpc29uSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtdWx0aUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkVmFsdWVzID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIG11bHRpRWxlbWVudC5zZWxlY3RlZENvbXBhcmlzb25WYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcztcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudElkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIHRoaXMucmV0dXJuTXVsdGlDaG9pY2UuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogbXVsdGlFbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbjogdGhpcy5zZWxlY3RlZENvbmRpdGlvbiB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTXVsdGlDaG9pY2VFbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBtdWx0aUNoZWNrQm94OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSwge1xyXG4gICAgICAgIHZhbGlkYXRvcjogdGhpcy5zcGVjaWZpY1ZhbHVlSW5zaWRlUmFuZ2UoJ211bHRpQ2hlY2tCb3gnKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHJldHVybiBjaG9pY2VDb250cm9sLnNldEVycm9ycyh7IG5vdEVxdWl2YWxlbnQ6IHRydWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=