UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

47 lines 22 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { Base } from './export-schedules.interface'; import { CronService } from './cron.service'; import * as i0 from "@angular/core"; import * as i1 from "./cron.service"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; import * as i4 from "@angular/forms"; export class CronComponent { constructor(cronService) { this.cronService = cronService; this.emitter = new EventEmitter(); this.emittedCron = { valid: false, cron: '' }; this.base = Base.Initial; // } ngOnInit() { this.daysOfWeekPosix = this.cronService.daysOfWeekPosix; this.daysOfMonth = this.cronService.daysOfMonth; this.months = this.cronService.months; this.hours = this.cronService.hours; this.minutes = this.cronService.minutes; this.intervals = this.cronService.intervals; this.cronConfig = this.cronService.generateCronConfig(this.cronIn); this.base = this.cronService.getBase(this.cronConfig); } onChangeSelect() { this.cronService.clearNextModels(this.base, this.cronConfig); this.emittedCron.valid = this.cronService.validateModels(this.base, this.cronConfig); this.emittedCron.cron = this.cronService.generateCron(this.cronConfig); this.emitter.emit(this.emittedCron); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronComponent, deps: [{ token: i1.CronService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CronComponent, selector: "cron", inputs: { cronIn: "cronIn" }, outputs: { emitter: "emitter" }, ngImport: i0, template: "<div class=\"cron-wrap\">\n <div class=\"form-group smart-cron-job-every\">\n <label for=\"smart-cron-job-every\" class=\"control-label\" translate>Interval</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control\"\n id=\"smart-cron-job-every\"\n [(ngModel)]=\"base\"\n required=\"true\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngIf=\"base === 1\" value=\"1\" translate>Select\u2026</option>\n <option *ngFor=\"let baseInterval of intervals\" [ngValue]=\"baseInterval.value\">\n {{ baseInterval.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"form-group smart-cron-job-on col-md-6\" *ngIf=\"base == 4\">\n <label class=\"control-label\" for=\"smart-cron-job-on\" translate>Day</label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control day-value\"\n id=\"smart-cron-job-on\"\n [(ngModel)]=\"cronConfig.weekday\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let dayOfWeek of daysOfWeekPosix\" [ngValue]=\"dayOfWeek.value\">\n {{ dayOfWeek.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-of col-md-6\" *ngIf=\"base == 6\">\n <label for=\"smart-cron-job-of\" class=\"control-label\" translate>Month</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"smart-cron-job-of\"\n class=\"cron-select form-control month-value\"\n [(ngModel)]=\"cronConfig.month\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\n {{ month.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-on-the col-md-6\" *ngIf=\"base >= 5\">\n <label for=\"smart-cron-job-on-the\" class=\"control-label\" translate>Day</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"smart-cron-job-on-the\"\n class=\"cron-select form-control day-of-month-value\"\n [(ngModel)]=\"cronConfig.day\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let dayOfMonth of daysOfMonth\" [ngValue]=\"dayOfMonth.value\">\n {{ dayOfMonth.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-at\" *ngIf=\"base >= 2\">\n <label for=\"smart-cron-job-at-hour\" class=\"control-label\">\n <span *ngIf=\"base >= 3\" translate>Time</span>\n <span *ngIf=\"base < 3\" translate>Minutes</span>\n </label>\n <div>\n <div class=\"form-inline\">\n <div class=\"c8y-select-wrapper\" *ngIf=\"base >= 3\">\n <select\n id=\"smart-cron-job-at-hour\"\n class=\"cron-select form-control hour-value\"\n [(ngModel)]=\"cronConfig.hour\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let hour of hours\" [ngValue]=\"hour.value\">\n {{ hour.value | number: '2.0-0' }}\n </option>\n </select>\n <span></span>\n </div>\n <span *ngIf=\"base >= 3\">:</span>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control minute-value\"\n id=\"smart-cron-job-at-minute\"\n [(ngModel)]=\"cronConfig.minute\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let minute of minutes\" [ngValue]=\"minute.value\">\n {{ minute.value | number: '2.0-0' }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { 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: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronComponent, decorators: [{ type: Component, args: [{ selector: 'cron', template: "<div class=\"cron-wrap\">\n <div class=\"form-group smart-cron-job-every\">\n <label for=\"smart-cron-job-every\" class=\"control-label\" translate>Interval</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control\"\n id=\"smart-cron-job-every\"\n [(ngModel)]=\"base\"\n required=\"true\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngIf=\"base === 1\" value=\"1\" translate>Select\u2026</option>\n <option *ngFor=\"let baseInterval of intervals\" [ngValue]=\"baseInterval.value\">\n {{ baseInterval.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"form-group smart-cron-job-on col-md-6\" *ngIf=\"base == 4\">\n <label class=\"control-label\" for=\"smart-cron-job-on\" translate>Day</label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control day-value\"\n id=\"smart-cron-job-on\"\n [(ngModel)]=\"cronConfig.weekday\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let dayOfWeek of daysOfWeekPosix\" [ngValue]=\"dayOfWeek.value\">\n {{ dayOfWeek.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-of col-md-6\" *ngIf=\"base == 6\">\n <label for=\"smart-cron-job-of\" class=\"control-label\" translate>Month</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"smart-cron-job-of\"\n class=\"cron-select form-control month-value\"\n [(ngModel)]=\"cronConfig.month\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\n {{ month.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-on-the col-md-6\" *ngIf=\"base >= 5\">\n <label for=\"smart-cron-job-on-the\" class=\"control-label\" translate>Day</label>\n <div>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"smart-cron-job-on-the\"\n class=\"cron-select form-control day-of-month-value\"\n [(ngModel)]=\"cronConfig.day\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let dayOfMonth of daysOfMonth\" [ngValue]=\"dayOfMonth.value\">\n {{ dayOfMonth.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-group smart-cron-job-at\" *ngIf=\"base >= 2\">\n <label for=\"smart-cron-job-at-hour\" class=\"control-label\">\n <span *ngIf=\"base >= 3\" translate>Time</span>\n <span *ngIf=\"base < 3\" translate>Minutes</span>\n </label>\n <div>\n <div class=\"form-inline\">\n <div class=\"c8y-select-wrapper\" *ngIf=\"base >= 3\">\n <select\n id=\"smart-cron-job-at-hour\"\n class=\"cron-select form-control hour-value\"\n [(ngModel)]=\"cronConfig.hour\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let hour of hours\" [ngValue]=\"hour.value\">\n {{ hour.value | number: '2.0-0' }}\n </option>\n </select>\n <span></span>\n </div>\n <span *ngIf=\"base >= 3\">:</span>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"cron-select form-control minute-value\"\n id=\"smart-cron-job-at-minute\"\n [(ngModel)]=\"cronConfig.minute\"\n (change)=\"onChangeSelect()\"\n >\n <option *ngFor=\"let minute of minutes\" [ngValue]=\"minute.value\">\n {{ minute.value | number: '2.0-0' }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.CronService }], propDecorators: { cronIn: [{ type: Input }], emitter: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9yZXBvcnRzL2Nyb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcmVwb3J0cy9jcm9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEyQixJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU03QyxNQUFNLE9BQU8sYUFBYTtJQWtCeEIsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFoQmxDLFlBQU8sR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRSxnQkFBVyxHQUFnQjtZQUN6QixLQUFLLEVBQUUsS0FBSztZQUNaLElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztRQUVGLFNBQUksR0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBV3hCLEVBQUU7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBRTVDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7K0dBdkNVLGFBQWE7bUdBQWIsYUFBYSwyR0NSMUIsbW9JQXFIQTs7NEZEN0dhLGFBQWE7a0JBSnpCLFNBQVM7K0JBQ0UsTUFBTTtnRkFJUCxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVtaXR0ZWRDcm9uLCBDcm9uQ29uZmlnLCBCYXNlIH0gZnJvbSAnLi9leHBvcnQtc2NoZWR1bGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9uU2VydmljZSB9IGZyb20gJy4vY3Jvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3JvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcm9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDcm9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY3JvbkluOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8RW1pdHRlZENyb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBlbWl0dGVkQ3JvbjogRW1pdHRlZENyb24gPSB7XG4gICAgdmFsaWQ6IGZhbHNlLFxuICAgIGNyb246ICcnXG4gIH07XG5cbiAgYmFzZTogQmFzZSA9IEJhc2UuSW5pdGlhbDtcbiAgY3JvbkNvbmZpZzogQ3JvbkNvbmZpZztcblxuICBkYXlzT2ZXZWVrUG9zaXg6IGFueVtdO1xuICBkYXlzT2ZNb250aDogYW55W107XG4gIG1vbnRoczogYW55W107XG4gIGhvdXJzOiBhbnlbXTtcbiAgbWludXRlczogYW55W107XG4gIGludGVydmFsczogYW55W107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjcm9uU2VydmljZTogQ3JvblNlcnZpY2UpIHtcbiAgICAvL1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kYXlzT2ZXZWVrUG9zaXggPSB0aGlzLmNyb25TZXJ2aWNlLmRheXNPZldlZWtQb3NpeDtcbiAgICB0aGlzLmRheXNPZk1vbnRoID0gdGhpcy5jcm9uU2VydmljZS5kYXlzT2ZNb250aDtcbiAgICB0aGlzLm1vbnRocyA9IHRoaXMuY3JvblNlcnZpY2UubW9udGhzO1xuICAgIHRoaXMuaG91cnMgPSB0aGlzLmNyb25TZXJ2aWNlLmhvdXJzO1xuICAgIHRoaXMubWludXRlcyA9IHRoaXMuY3JvblNlcnZpY2UubWludXRlcztcbiAgICB0aGlzLmludGVydmFscyA9IHRoaXMuY3JvblNlcnZpY2UuaW50ZXJ2YWxzO1xuXG4gICAgdGhpcy5jcm9uQ29uZmlnID0gdGhpcy5jcm9uU2VydmljZS5nZW5lcmF0ZUNyb25Db25maWcodGhpcy5jcm9uSW4pO1xuICAgIHRoaXMuYmFzZSA9IHRoaXMuY3JvblNlcnZpY2UuZ2V0QmFzZSh0aGlzLmNyb25Db25maWcpO1xuICB9XG5cbiAgb25DaGFuZ2VTZWxlY3QoKSB7XG4gICAgdGhpcy5jcm9uU2VydmljZS5jbGVhck5leHRNb2RlbHModGhpcy5iYXNlLCB0aGlzLmNyb25Db25maWcpO1xuICAgIHRoaXMuZW1pdHRlZENyb24udmFsaWQgPSB0aGlzLmNyb25TZXJ2aWNlLnZhbGlkYXRlTW9kZWxzKHRoaXMuYmFzZSwgdGhpcy5jcm9uQ29uZmlnKTtcbiAgICB0aGlzLmVtaXR0ZWRDcm9uLmNyb24gPSB0aGlzLmNyb25TZXJ2aWNlLmdlbmVyYXRlQ3Jvbih0aGlzLmNyb25Db25maWcpO1xuICAgIHRoaXMuZW1pdHRlci5lbWl0KHRoaXMuZW1pdHRlZENyb24pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3Jvbi13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHNtYXJ0LWNyb24tam9iLWV2ZXJ5XCI+XG4gICAgPGxhYmVsIGZvcj1cInNtYXJ0LWNyb24tam9iLWV2ZXJ5XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPkludGVydmFsPC9sYWJlbD5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJjcm9uLXNlbGVjdCBmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgIGlkPVwic21hcnQtY3Jvbi1qb2ItZXZlcnlcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiYmFzZVwiXG4gICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlU2VsZWN0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImJhc2UgPT09IDFcIiB2YWx1ZT1cIjFcIiB0cmFuc2xhdGU+U2VsZWN04oCmPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYmFzZUludGVydmFsIG9mIGludGVydmFsc1wiIFtuZ1ZhbHVlXT1cImJhc2VJbnRlcnZhbC52YWx1ZVwiPlxuICAgICAgICAgICAge3sgYmFzZUludGVydmFsLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBzbWFydC1jcm9uLWpvYi1vbiBjb2wtbWQtNlwiICpuZ0lmPVwiYmFzZSA9PSA0XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgZm9yPVwic21hcnQtY3Jvbi1qb2Itb25cIiB0cmFuc2xhdGU+RGF5PC9sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJjcm9uLXNlbGVjdCBmb3JtLWNvbnRyb2wgZGF5LXZhbHVlXCJcbiAgICAgICAgICBpZD1cInNtYXJ0LWNyb24tam9iLW9uXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNyb25Db25maWcud2Vla2RheVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZVNlbGVjdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRheU9mV2VlayBvZiBkYXlzT2ZXZWVrUG9zaXhcIiBbbmdWYWx1ZV09XCJkYXlPZldlZWsudmFsdWVcIj5cbiAgICAgICAgICAgIHt7IGRheU9mV2Vlay5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBzbWFydC1jcm9uLWpvYi1vZiBjb2wtbWQtNlwiICpuZ0lmPVwiYmFzZSA9PSA2XCI+XG4gICAgICA8bGFiZWwgZm9yPVwic21hcnQtY3Jvbi1qb2Itb2ZcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiB0cmFuc2xhdGU+TW9udGg8L2xhYmVsPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGlkPVwic21hcnQtY3Jvbi1qb2Itb2ZcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcm9uLXNlbGVjdCBmb3JtLWNvbnRyb2wgbW9udGgtdmFsdWVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjcm9uQ29uZmlnLm1vbnRoXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VTZWxlY3QoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzXCIgW25nVmFsdWVdPVwibW9udGgudmFsdWVcIj5cbiAgICAgICAgICAgICAge3sgbW9udGgubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHNtYXJ0LWNyb24tam9iLW9uLXRoZSBjb2wtbWQtNlwiICpuZ0lmPVwiYmFzZSA+PSA1XCI+XG4gICAgICA8bGFiZWwgZm9yPVwic21hcnQtY3Jvbi1qb2Itb24tdGhlXCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPkRheTwvbGFiZWw+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgaWQ9XCJzbWFydC1jcm9uLWpvYi1vbi10aGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcm9uLXNlbGVjdCBmb3JtLWNvbnRyb2wgZGF5LW9mLW1vbnRoLXZhbHVlXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3JvbkNvbmZpZy5kYXlcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZVNlbGVjdCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkYXlPZk1vbnRoIG9mIGRheXNPZk1vbnRoXCIgW25nVmFsdWVdPVwiZGF5T2ZNb250aC52YWx1ZVwiPlxuICAgICAgICAgICAgICB7eyBkYXlPZk1vbnRoLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHNtYXJ0LWNyb24tam9iLWF0XCIgKm5nSWY9XCJiYXNlID49IDJcIj5cbiAgICA8bGFiZWwgZm9yPVwic21hcnQtY3Jvbi1qb2ItYXQtaG91clwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJiYXNlID49IDNcIiB0cmFuc2xhdGU+VGltZTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYmFzZSA8IDNcIiB0cmFuc2xhdGU+TWludXRlczwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiICpuZ0lmPVwiYmFzZSA+PSAzXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgaWQ9XCJzbWFydC1jcm9uLWpvYi1hdC1ob3VyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Jvbi1zZWxlY3QgZm9ybS1jb250cm9sIGhvdXItdmFsdWVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjcm9uQ29uZmlnLmhvdXJcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZVNlbGVjdCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzXCIgW25nVmFsdWVdPVwiaG91ci52YWx1ZVwiPlxuICAgICAgICAgICAgICB7eyBob3VyLnZhbHVlIHwgbnVtYmVyOiAnMi4wLTAnIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiAqbmdJZj1cImJhc2UgPj0gM1wiPjo8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImNyb24tc2VsZWN0IGZvcm0tY29udHJvbCBtaW51dGUtdmFsdWVcIlxuICAgICAgICAgICAgaWQ9XCJzbWFydC1jcm9uLWpvYi1hdC1taW51dGVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjcm9uQ29uZmlnLm1pbnV0ZVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlU2VsZWN0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBtaW51dGVzXCIgW25nVmFsdWVdPVwibWludXRlLnZhbHVlXCI+XG4gICAgICAgICAgICAgIHt7IG1pbnV0ZS52YWx1ZSB8IG51bWJlcjogJzIuMC0wJyB9fVxuICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19