@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
109 lines • 24.1 kB
JavaScript
import { Component, forwardRef, Input } from '@angular/core';
import { FormBuilder, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
import { take } from 'rxjs/operators';
import { AlarmEventAttributesFormService } from './alarm-event-attributes-form.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "./alarm-event-attributes-form.service";
import * as i3 from "@angular/common";
import * as i4 from "@c8y/ngx-components";
export class AlarmEventAttributesFormComponent {
constructor(formBuilder, alarmEventAttributesFormService) {
this.formBuilder = formBuilder;
this.alarmEventAttributesFormService = alarmEventAttributesFormService;
this.omitProperties = {};
this.selectedItems = [];
this.datapoints = [];
}
ngOnInit() {
this.formGroup = this.formBuilder.group({
filters: this.formBuilder.group({
type: new FormControl('', [
Validators.required,
this.alarmEventAttributesFormService.duplicateTypeValidator(this.selectedItems)
])
}),
timelineType: new FormControl(''),
selectedDatapoint: new FormControl(null)
});
if (!this.omitProperties.label) {
this.formGroup.addControl('label', new FormControl('', Validators.required));
}
if (this.datapoints?.length > 0) {
this.filterKpis();
}
}
validate(_control) {
return this.formGroup?.valid ? null : { formInvalid: {} };
}
writeValue(obj) {
this.formGroup.patchValue(obj);
}
registerOnChange(fn) {
this.formGroup.valueChanges.subscribe(fn);
}
registerOnTouched(fn) {
this.formGroup.valueChanges.pipe(take(1)).subscribe(fn);
}
setDisabledState(isDisabled) {
isDisabled ? this.formGroup.disable() : this.formGroup.enable();
}
changeDatapointSelection(event) {
const selectElement = event.target;
const selectedIndex = selectElement.selectedIndex;
const selectedDatapoint = this.datapoints[selectedIndex];
const trimmedDatapoint = {
target: selectedDatapoint.__target.id,
fragment: selectedDatapoint.fragment,
series: selectedDatapoint.series
};
this.formGroup.patchValue({ selectedDatapoint: trimmedDatapoint });
}
trackByFn(_index, item) {
return `${item.fragment}-${item.series}-${item.__target?.id}`;
}
filterKpis() {
if (this.target && this.target.id) {
this.datapoints = this.datapoints.filter(dp => dp.__target?.id === this.target.id);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmEventAttributesFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.AlarmEventAttributesFormService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AlarmEventAttributesFormComponent, selector: "c8y-alarm-event-attributes-form", inputs: { timelineType: "timelineType", omitProperties: "omitProperties", selectedItems: "selectedItems", target: "target", datapoints: "datapoints" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmEventAttributesFormComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmEventAttributesFormComponent),
multi: true
}
], ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"formGroup.controls.label\"\n >\n <label class=\"m-0\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example: timelineType === 'ALARM' ? 'Alarm unavailable' : 'Location update'\n }\n \"\n />\n </c8y-form-group>\n\n <div formGroupName=\"filters\">\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"m-0\">{{ 'Type' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"type\"\n formControlName=\"type\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n timelineType === 'ALARM' ? 'c8y_UnavailabilityAlarm' : 'c8y_LocationUpdate'\n }\n \"\n />\n <c8y-messages>\n <c8y-message\n name=\"duplicateType\"\n [text]=\"'Type already used.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"datapoints?.length > 0\"\n >\n <label>{{ 'Select data point' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n (change)=\"changeDatapointSelection($event)\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n *ngFor=\"let datapoint of datapoints; trackBy: trackByFn\"\n [ngValue]=\"{\n target: datapoint.__target.id,\n fragment: datapoint.fragment,\n series: datapoint.series\n }\"\n [selected]=\"\n datapoint.__target.id === formGroup.value.selectedDatapoint?.target &&\n datapoint.fragment === formGroup.value.selectedDatapoint?.fragment &&\n datapoint.series === formGroup.value.selectedDatapoint?.series\n \"\n >\n {{ datapoint?.label }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmEventAttributesFormComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-alarm-event-attributes-form', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmEventAttributesFormComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmEventAttributesFormComponent),
multi: true
}
], template: "<div [formGroup]=\"formGroup\">\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"formGroup.controls.label\"\n >\n <label class=\"m-0\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example: timelineType === 'ALARM' ? 'Alarm unavailable' : 'Location update'\n }\n \"\n />\n </c8y-form-group>\n\n <div formGroupName=\"filters\">\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"m-0\">{{ 'Type' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"type\"\n formControlName=\"type\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n timelineType === 'ALARM' ? 'c8y_UnavailabilityAlarm' : 'c8y_LocationUpdate'\n }\n \"\n />\n <c8y-messages>\n <c8y-message\n name=\"duplicateType\"\n [text]=\"'Type already used.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"datapoints?.length > 0\"\n >\n <label>{{ 'Select data point' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n (change)=\"changeDatapointSelection($event)\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n *ngFor=\"let datapoint of datapoints; trackBy: trackByFn\"\n [ngValue]=\"{\n target: datapoint.__target.id,\n fragment: datapoint.fragment,\n series: datapoint.series\n }\"\n [selected]=\"\n datapoint.__target.id === formGroup.value.selectedDatapoint?.target &&\n datapoint.fragment === formGroup.value.selectedDatapoint?.fragment &&\n datapoint.series === formGroup.value.selectedDatapoint?.series\n \"\n >\n {{ datapoint?.label }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.AlarmEventAttributesFormService }], propDecorators: { timelineType: [{
type: Input
}], omitProperties: [{
type: Input
}], selectedItems: [{
type: Input
}], target: [{
type: Input
}], datapoints: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FsYXJtLWV2ZW50LXNlbGVjdG9yL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS9hbGFybS1ldmVudC1hdHRyaWJ1dGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vYWxhcm0tZXZlbnQtc2VsZWN0b3IvYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUdMLFdBQVcsRUFDWCxXQUFXLEVBRVgsYUFBYSxFQUNiLGlCQUFpQixFQUdqQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7OztBQTJCeEYsTUFBTSxPQUFPLGlDQUFpQztJQVE1QyxZQUNVLFdBQXdCLEVBQ3hCLCtCQUFnRTtRQURoRSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQ0FBK0IsR0FBL0IsK0JBQStCLENBQWlDO1FBUmpFLG1CQUFjLEdBQTJCLEVBQUUsQ0FBQztRQUM1QyxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFFbkMsZUFBVSxHQUFpQixFQUFFLENBQUM7SUFNcEMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxFQUFFLElB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TSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDOytHQTFFVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyxrTkFiakM7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlDQUFpQyxDQUFDO2dCQUNoRSxLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUM7Z0JBQ2hFLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkN2Q0gsa3dFQTJFQTs7NEZEbENhLGlDQUFpQztrQkFoQjdDLFNBQVM7K0JBQ0UsaUNBQWlDLGFBRWhDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtDQUFrQyxDQUFDOzRCQUNoRSxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0NBQWtDLENBQUM7NEJBQ2hFLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhIQUdRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZSB9IGZyb20gJy4vYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQWxhcm1PckV2ZW50LFxuICBPbWl0U2VsZWN0b3JQcm9wZXJ0aWVzLFxuICBTZWxlY3RlZERhdGFwb2ludCxcbiAgVGltZWxpbmVUeXBlXG59IGZyb20gJy4uL2FsYXJtLWV2ZW50LXNlbGVjdG9yLm1vZGVsJztcbmltcG9ydCB7IElJZGVudGlmaWVkIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IEFsYXJtRXZlbnRBdHRyaWJ1dGVGb3JtIH0gZnJvbSAnLi9hbGFybS1ldmVudC1hdHRyaWJ1dGVzLWZvcm0ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFsYXJtRXZlbnRBdHRyaWJ1dGVzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHRpbWVsaW5lVHlwZTogVGltZWxpbmVUeXBlO1xuICBASW5wdXQoKSBvbWl0UHJvcGVydGllczogT21pdFNlbGVjdG9yUHJvcGVydGllcyA9IHt9O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBBbGFybU9yRXZlbnRbXSA9IFtdO1xuICBASW5wdXQoKSB0YXJnZXQ6IElJZGVudGlmaWVkO1xuICBASW5wdXQoKSBkYXRhcG9pbnRzOiBLUElEZXRhaWxzW10gPSBbXTtcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXA8QWxhcm1FdmVudEF0dHJpYnV0ZUZvcm0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgYWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZTogQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGZpbHRlcnM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgdGhpcy5hbGFybUV2ZW50QXR0cmlidXRlc0Zvcm1TZXJ2aWNlLmR1cGxpY2F0ZVR5cGVWYWxpZGF0b3IodGhpcy5zZWxlY3RlZEl0ZW1zKVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICB0aW1lbGluZVR5cGU6IG5ldyBGb3JtQ29udHJvbDxUaW1lbGluZVR5cGU+KCcnIGFzIFRpbWVsaW5lVHlwZSksXG4gICAgICBzZWxlY3RlZERhdGFwb2ludDogbmV3IEZvcm1Db250cm9sPG51bGwgfCBTZWxlY3RlZERhdGFwb2ludD4obnVsbClcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5vbWl0UHJvcGVydGllcy5sYWJlbCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbCgnbGFiZWwnLCBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YXBvaW50cz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWx0ZXJLcGlzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cD8udmFsaWQgPyBudWxsIDogeyBmb3JtSW52YWxpZDoge30gfTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKG9iaik7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGZuKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaXNEaXNhYmxlZCA/IHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKSA6IHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgY2hhbmdlRGF0YXBvaW50U2VsZWN0aW9uKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleDtcbiAgICBjb25zdCBzZWxlY3RlZERhdGFwb2ludCA9IHRoaXMuZGF0YXBvaW50c1tzZWxlY3RlZEluZGV4XTtcbiAgICBjb25zdCB0cmltbWVkRGF0YXBvaW50ID0ge1xuICAgICAgdGFyZ2V0OiBzZWxlY3RlZERhdGFwb2ludC5fX3RhcmdldC5pZCBhcyBzdHJpbmcsXG4gICAgICBmcmFnbWVudDogc2VsZWN0ZWREYXRhcG9pbnQuZnJhZ21lbnQsXG4gICAgICBzZXJpZXM6IHNlbGVjdGVkRGF0YXBvaW50LnNlcmllc1xuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgc2VsZWN0ZWREYXRhcG9pbnQ6IHRyaW1tZWREYXRhcG9pbnQgfSk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IEtQSURldGFpbHMpIHtcbiAgICByZXR1cm4gYCR7aXRlbS5mcmFnbWVudH0tJHtpdGVtLnNlcmllc30tJHtpdGVtLl9fdGFyZ2V0Py5pZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJLcGlzKCkge1xuICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5pZCkge1xuICAgICAgdGhpcy5kYXRhcG9pbnRzID0gdGhpcy5kYXRhcG9pbnRzLmZpbHRlcihkcCA9PiBkcC5fX3RhcmdldD8uaWQgPT09IHRoaXMudGFyZ2V0LmlkKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgPGM4eS1mb3JtLWdyb3VwXG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtXCJcbiAgICAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5sYWJlbFwiXG4gID5cbiAgICA8bGFiZWwgY2xhc3M9XCJtLTBcIj57eyAnTGFiZWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZ3Jvd1wiXG4gICAgICBuYW1lPVwibGFiZWxcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB0aW1lbGluZVR5cGUgPT09ICdBTEFSTScgPyAnQWxhcm0gdW5hdmFpbGFibGUnIDogJ0xvY2F0aW9uIHVwZGF0ZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgXCJcbiAgICAvPlxuICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gIDxkaXYgZm9ybUdyb3VwTmFtZT1cImZpbHRlcnNcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJtLTBcIj57eyAnVHlwZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZ3Jvd1wiXG4gICAgICAgIG5hbWU9XCJ0eXBlXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBleGFtcGxlOlxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZVR5cGUgPT09ICdBTEFSTScgPyAnYzh5X1VuYXZhaWxhYmlsaXR5QWxhcm0nIDogJ2M4eV9Mb2NhdGlvblVwZGF0ZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFwiXG4gICAgICAvPlxuICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgbmFtZT1cImR1cGxpY2F0ZVR5cGVcIlxuICAgICAgICAgIFt0ZXh0XT1cIidUeXBlIGFscmVhZHkgdXNlZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cblxuICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICBjbGFzcz1cImZvcm0tZ3JvdXAtc21cIlxuICAgICpuZ0lmPVwiZGF0YXBvaW50cz8ubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8bGFiZWw+e3sgJ1NlbGVjdCBkYXRhIHBvaW50JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgPHNlbGVjdFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlRGF0YXBvaW50U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YXBvaW50IG9mIGRhdGFwb2ludHM7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgW25nVmFsdWVdPVwie1xuICAgICAgICAgICAgdGFyZ2V0OiBkYXRhcG9pbnQuX190YXJnZXQuaWQsXG4gICAgICAgICAgICBmcmFnbWVudDogZGF0YXBvaW50LmZyYWdtZW50LFxuICAgICAgICAgICAgc2VyaWVzOiBkYXRhcG9pbnQuc2VyaWVzXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW3NlbGVjdGVkXT1cIlxuICAgICAgICAgICAgZGF0YXBvaW50Ll9fdGFyZ2V0LmlkID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LnRhcmdldCAmJlxuICAgICAgICAgICAgZGF0YXBvaW50LmZyYWdtZW50ID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LmZyYWdtZW50ICYmXG4gICAgICAgICAgICBkYXRhcG9pbnQuc2VyaWVzID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LnNlcmllc1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBkYXRhcG9pbnQ/LmxhYmVsIH19XG4gICAgICAgIDwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIDwvYzh5LWZvcm0tZ3JvdXA+XG48L2Rpdj5cbiJdfQ==