UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

149 lines 24.2 kB
import { __decorate, __metadata } from "tslib"; import { Component, Input, ViewChild, } from '@angular/core'; import { IonModal } from '@ionic/angular'; import { CurrentDeviceService, PendingCallManager, TapValueEditorContainerComponent, } from '@iotize/ionic'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { MonitoringAppGenComponent, } from '../../metadata/decorators'; import * as i0 from "@angular/core"; import * as i1 from "@iotize/ionic"; import * as i2 from "@angular/common"; import * as i3 from "@ionic/angular"; let TapVariableDateTimePickerComponent = class TapVariableDateTimePickerComponent { ctx; dateTimeModal; pendingCallManager; pendingSubmitValue; destroyed = new Subject(); error; // loaded = false; set fieldError(err) { this.error = err; } get pending() { return this.pendingCallManager.pendingCall !== undefined; } format = 'medium'; showCalendarPickerTitle = true; editable = true; color = 'primary'; showCalendarIcon = true; iconCalendarColor = 'primary'; set encodingType(type) { if (type in DATE_TIME_PICKER_ENCODING) { const converter = DATE_TIME_PICKER_ENCODING[type]; this.formatDataRead = converter.decode.bind(converter); this.formatDataWrite = converter.encode.bind(converter); } else { this.formatDataRead = undefined; this.formatDataWrite = undefined; } } formatDataRead; formatDataWrite; _variable; set variable(variable) { this._variable = variable; } dateTimeValue = '2023-01-01T00:00:00'; constructor(tapService) { this.pendingCallManager = PendingCallManager.create(tapService); } ngOnDestroy() { this.destroyed.next(); this.pendingCallManager.destroy(); } ngAfterViewInit() { this.ctx?.valueToDisplay ?.pipe(takeUntil(this.destroyed)) .subscribe((newValue) => { this.dateTimeValue = this.formatDataRead ? this.formatDataRead(newValue) : newValue; }); } async onPendingChange(event) { const value = event.detail.value; const timeStamp = this.formatDataWrite ? this.formatDataWrite(value) : value; await this.ctx.notifyValueChange(timeStamp); } onValueClick() { if (this.editable) { this.pendingSubmitValue = this.dateTimeValue; this.dateTimeModal.present(); } } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableDateTimePickerComponent, deps: [{ token: i1.CurrentDeviceService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TapVariableDateTimePickerComponent, selector: "tap-variable-date-time-picker", inputs: { fieldError: "fieldError", format: "format", showCalendarPickerTitle: "showCalendarPickerTitle", editable: "editable", color: "color", showCalendarIcon: "showCalendarIcon", iconCalendarColor: "iconCalendarColor", encodingType: "encodingType", formatDataRead: "formatDataRead", formatDataWrite: "formatDataWrite", variable: "variable" }, viewQueries: [{ propertyName: "ctx", first: true, predicate: ["ctx"], descendants: true }, { propertyName: "dateTimeModal", first: true, predicate: ["dateTimeModal"], descendants: true }], ngImport: i0, template: "<tap-value-editor-container\n #ctx\n [button]=\"editable\"\n [variable]=\"_variable\"\n (click)=\"onValueClick()\"\n>\n <!-- <ion-spinner *ngIf=\"!loaded\" name=\"crescent\" color=\"primary\"></ion-spinner> -->\n\n <ion-modal #dateTimeModal>\n <ng-template>\n <ion-content>\n <ion-datetime\n #ionDateTime\n [showDefaultTitle]=\"showCalendarPickerTitle\"\n [showDefaultButtons]=\"true\"\n [color]=\"color\"\n size=\"cover\"\n [value]=\"pendingSubmitValue\"\n (ionChange)=\"onPendingChange($event)\"\n >\n <!-- <ion-buttons slot=\"buttons\">\n <ion-button\n fill=\"clear\"\n [color]=\"color\"\n (click)=\"ionDateTime.confirm(); onConfirm()\"\n >Confirm</ion-button\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"ionDateTime.cancel(); dateTimeModal.dismiss()\"\n >Cancel</ion-button\n >\n </ion-buttons> -->\n </ion-datetime>\n </ion-content>\n </ng-template>\n </ion-modal>\n <ion-icon\n [color]=\"iconCalendarColor\"\n slot=\"start\"\n name=\"calendar\"\n *ngIf=\"showCalendarIcon\"\n ></ion-icon>\n <ion-label>\n {{ dateTimeValue | date: (format ? format : 'MMM d, y, h:mm:ss a') }}\n </ion-label>\n <!--\n <ion-datetime\n *ngIf=\"loaded\"\n \n [displayFormat]=\"format\"\n [value]=\"dateTimeValue\"\n (ionChange)=\n ></ion-datetime>\n -->\n</tap-value-editor-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "formatOptions", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showAdjacentDays", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonModal, selector: "ion-modal" }, { kind: "directive", type: i3.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i1.TapValueEditorContainerComponent, selector: "tap-value-editor-container", inputs: ["button", "variable", "inputOptions", "showRefreshButton", "showSubmitButton", "showEditButton", "error", "lines", "modalEdition", "value"], outputs: ["submit", "refresh"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] }); }; TapVariableDateTimePickerComponent = __decorate([ MonitoringAppGenComponent({ constraints: { isArray: 'NO', }, }), __metadata("design:paramtypes", [CurrentDeviceService]) ], TapVariableDateTimePickerComponent); export { TapVariableDateTimePickerComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableDateTimePickerComponent, decorators: [{ type: Component, args: [{ selector: 'tap-variable-date-time-picker', template: "<tap-value-editor-container\n #ctx\n [button]=\"editable\"\n [variable]=\"_variable\"\n (click)=\"onValueClick()\"\n>\n <!-- <ion-spinner *ngIf=\"!loaded\" name=\"crescent\" color=\"primary\"></ion-spinner> -->\n\n <ion-modal #dateTimeModal>\n <ng-template>\n <ion-content>\n <ion-datetime\n #ionDateTime\n [showDefaultTitle]=\"showCalendarPickerTitle\"\n [showDefaultButtons]=\"true\"\n [color]=\"color\"\n size=\"cover\"\n [value]=\"pendingSubmitValue\"\n (ionChange)=\"onPendingChange($event)\"\n >\n <!-- <ion-buttons slot=\"buttons\">\n <ion-button\n fill=\"clear\"\n [color]=\"color\"\n (click)=\"ionDateTime.confirm(); onConfirm()\"\n >Confirm</ion-button\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"ionDateTime.cancel(); dateTimeModal.dismiss()\"\n >Cancel</ion-button\n >\n </ion-buttons> -->\n </ion-datetime>\n </ion-content>\n </ng-template>\n </ion-modal>\n <ion-icon\n [color]=\"iconCalendarColor\"\n slot=\"start\"\n name=\"calendar\"\n *ngIf=\"showCalendarIcon\"\n ></ion-icon>\n <ion-label>\n {{ dateTimeValue | date: (format ? format : 'MMM d, y, h:mm:ss a') }}\n </ion-label>\n <!--\n <ion-datetime\n *ngIf=\"loaded\"\n \n [displayFormat]=\"format\"\n [value]=\"dateTimeValue\"\n (ionChange)=\n ></ion-datetime>\n -->\n</tap-value-editor-container>\n" }] }], ctorParameters: () => [{ type: i1.CurrentDeviceService }], propDecorators: { ctx: [{ type: ViewChild, args: ['ctx'] }], dateTimeModal: [{ type: ViewChild, args: ['dateTimeModal'] }], fieldError: [{ type: Input }], format: [{ type: Input }], showCalendarPickerTitle: [{ type: Input }], editable: [{ type: Input }], color: [{ type: Input }], showCalendarIcon: [{ type: Input }], iconCalendarColor: [{ type: Input }], encodingType: [{ type: Input }], formatDataRead: [{ type: Input }], formatDataWrite: [{ type: Input }], variable: [{ type: Input }] } }); const DATE_TIME_PICKER_ENCODING = { timestamp_ms: createTimestampEncoder(1), timestamp_s: createTimestampEncoder(1000), }; function createTimestampEncoder(multiplier = 1) { return { decode: (timestampInSeconds) => { timestampInSeconds = typeof timestampInSeconds === 'string' ? parseInt(timestampInSeconds) : timestampInSeconds; if (timestampInSeconds === undefined || isNaN(timestampInSeconds)) { timestampInSeconds = 0; } const date = new Date(timestampInSeconds * multiplier); return date.toISOString().slice(0, -1); }, encode: (value) => { if (!value) { return 0; } const date = Date.parse(value); return new Date(date).getTime() / multiplier; }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL21vbml0b3Jpbmcvc3JjL2xpYi91aS1jb21wb25lbnRzL3RhcC12YXJpYWJsZS1kYXRlLXRpbWUtcGlja2VyL3RhcC12YXJpYWJsZS1kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxLQUFLLEVBRUwsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixnQ0FBZ0MsR0FDakMsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUVMLHlCQUF5QixHQUMxQixNQUFNLDJCQUEyQixDQUFDOzs7OztBQWlCNUIsSUFBTSxrQ0FBa0MsR0FBeEMsTUFBTSxrQ0FBa0M7SUFHM0IsR0FBRyxDQUFvQztJQUM3QixhQUFhLENBQVk7SUFFckQsa0JBQWtCLENBQXFCO0lBQ3ZDLGtCQUFrQixDQUFNO0lBQ2hCLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpDLEtBQUssQ0FBUztJQUVyQixr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a0IsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQy9DLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbk1vZGFsIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRW5jb2RlckRlY29kZXIgfSBmcm9tICdAaW90aXplL2NvbW1vbi9jb252ZXJ0ZXIvYXBpJztcbmltcG9ydCB7XG4gIEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICBQZW5kaW5nQ2FsbE1hbmFnZXIsXG4gIFRhcFZhbHVlRWRpdG9yQ29udGFpbmVyQ29tcG9uZW50LFxufSBmcm9tICdAaW90aXplL2lvbmljJztcbmltcG9ydCB7IEFic3RyYWN0VmFyaWFibGUgfSBmcm9tICdAaW90aXplL3RhcC9kYXRhJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEFwcEdlbkZpZWxkLFxuICBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50LFxufSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEVESVRBQkxFX1NDSEVNQSxcbiAgSU9OSUNfQ09MT1JfU0NIRU1BLFxuICBUQVBfVkFSSUFCTEVfU0NIRU1BLFxufSBmcm9tICcuLi9zaGFyZWQtc2NoZW1hJztcblxuQE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQoe1xuICBjb25zdHJhaW50czoge1xuICAgIGlzQXJyYXk6ICdOTycsXG4gIH0sXG59KVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBWYXJpYWJsZURhdGVUaW1lUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBWaWV3Q2hpbGQoJ2N0eCcpIGN0eCE6IFRhcFZhbHVlRWRpdG9yQ29udGFpbmVyQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdkYXRlVGltZU1vZGFsJykgZGF0ZVRpbWVNb2RhbCE6IElvbk1vZGFsO1xuXG4gIHBlbmRpbmdDYWxsTWFuYWdlcjogUGVuZGluZ0NhbGxNYW5hZ2VyO1xuICBwZW5kaW5nU3VibWl0VmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyBlcnJvcj86IEVycm9yO1xuXG4gIC8vIGxvYWRlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBmaWVsZEVycm9yKGVycjogRXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyO1xuICB9XG5cbiAgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0NhbGxNYW5hZ2VyLnBlbmRpbmdDYWxsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBmb3JtYXQ6IHN0cmluZyA9ICdtZWRpdW0nO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dDYWxlbmRhclBpY2tlclRpdGxlOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgY29sb3IgPSAncHJpbWFyeSc7XG5cbiAgQElucHV0KClcbiAgc2hvd0NhbGVuZGFySWNvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgaWNvbkNhbGVuZGFyQ29sb3IgPSAncHJpbWFyeSc7XG5cbiAgQElucHV0KCkgc2V0IGVuY29kaW5nVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZSBpbiBEQVRFX1RJTUVfUElDS0VSX0VOQ09ESU5HKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICBEQVRFX1RJTUVfUElDS0VSX0VOQ09ESU5HW1xuICAgICAgICAgIHR5cGUgYXMga2V5b2YgdHlwZW9mIERBVEVfVElNRV9QSUNLRVJfRU5DT0RJTkdcbiAgICAgICAgXTtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVJlYWQgPSBjb252ZXJ0ZXIuZGVjb2RlLmJpbmQoY29udmVydGVyKTtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVdyaXRlID0gY29udmVydGVyLmVuY29kZS5iaW5kKGNvbnZlcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVJlYWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvcm1hdERhdGFXcml0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBmb3JtYXREYXRhUmVhZDogKChkYXRlOiBudW1iZXIpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgZm9ybWF0RGF0YVdyaXRlOiAoKGRhdGU6IHN0cmluZykgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZDtcblxuICBfdmFyaWFibGU/OiBBYnN0cmFjdFZhcmlhYmxlPGFueT47XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKHZhcmlhYmxlOiBBYnN0cmFjdFZhcmlhYmxlPGFueT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YXJpYWJsZSA9IHZhcmlhYmxlO1xuICB9XG5cbiAgZGF0ZVRpbWVWYWx1ZTogc3RyaW5nID0gJzIwMjMtMDEtMDFUMDA6MDA6MDAnO1xuXG4gIGNvbnN0cnVjdG9yKHRhcFNlcnZpY2U6IEN1cnJlbnREZXZpY2VTZXJ2aWNlKSB7XG4gICAgdGhpcy5wZW5kaW5nQ2FsbE1hbmFnZXIgPSBQZW5kaW5nQ2FsbE1hbmFnZXIuY3JlYXRlKHRhcFNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMucGVuZGluZ0NhbGxNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmN0eD8udmFsdWVUb0Rpc3BsYXlcbiAgICAgID8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5kYXRlVGltZVZhbHVlID0gdGhpcy5mb3JtYXREYXRhUmVhZFxuICAgICAgICAgID8gdGhpcy5mb3JtYXREYXRhUmVhZChuZXdWYWx1ZSlcbiAgICAgICAgICA6IG5ld1ZhbHVlO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBvblBlbmRpbmdDaGFuZ2UoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgdmFsdWU6IHN0cmluZyB9Pikge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIGNvbnN0IHRpbWVTdGFtcCA9IHRoaXMuZm9ybWF0RGF0YVdyaXRlXG4gICAgICA/IHRoaXMuZm9ybWF0RGF0YVdyaXRlKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcbiAgICBhd2FpdCB0aGlzLmN0eC5ub3RpZnlWYWx1ZUNoYW5nZSh0aW1lU3RhbXApO1xuICB9XG5cbiAgb25WYWx1ZUNsaWNrKCkge1xuICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICB0aGlzLnBlbmRpbmdTdWJtaXRWYWx1ZSA9IHRoaXMuZGF0ZVRpbWVWYWx1ZTtcbiAgICAgIHRoaXMuZGF0ZVRpbWVNb2RhbC5wcmVzZW50KCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IERBVEVfVElNRV9QSUNLRVJfRU5DT0RJTkcgPSB7XG4gIHRpbWVzdGFtcF9tczogY3JlYXRlVGltZXN0YW1wRW5jb2RlcigxKSxcbiAgdGltZXN0YW1wX3M6IGNyZWF0ZVRpbWVzdGFtcEVuY29kZXIoMTAwMCksXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUaW1lc3RhbXBFbmNvZGVyKFxuICBtdWx0aXBsaWVyID0gMVxuKTogRW5jb2RlckRlY29kZXI8c3RyaW5nLCBudW1iZXI+IHtcbiAgcmV0dXJuIHtcbiAgICBkZWNvZGU6ICh0aW1lc3RhbXBJblNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICB0aW1lc3RhbXBJblNlY29uZHMgPVxuICAgICAgICB0eXBlb2YgdGltZXN0YW1wSW5TZWNvbmRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcGFyc2VJbnQodGltZXN0YW1wSW5TZWNvbmRzKVxuICAgICAgICAgIDogdGltZXN0YW1wSW5TZWNvbmRzO1xuICAgICAgaWYgKHRpbWVzdGFtcEluU2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKHRpbWVzdGFtcEluU2Vjb25kcykpIHtcbiAgICAgICAgdGltZXN0YW1wSW5TZWNvbmRzID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXBJblNlY29uZHMgKiBtdWx0aXBsaWVyKTtcbiAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgLTEpO1xuICAgIH0sXG4gICAgZW5jb2RlOiAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0ZSA9IERhdGUucGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpLmdldFRpbWUoKSAvIG11bHRpcGxpZXI7XG4gICAgfSxcbiAgfTtcbn1cbiIsIjx0YXAtdmFsdWUtZWRpdG9yLWNvbnRhaW5lclxuICAjY3R4XG4gIFtidXR0b25dPVwiZWRpdGFibGVcIlxuICBbdmFyaWFibGVdPVwiX3ZhcmlhYmxlXCJcbiAgKGNsaWNrKT1cIm9uVmFsdWVDbGljaygpXCJcbj5cbiAgPCEtLSA8aW9uLXNwaW5uZXIgKm5nSWY9XCIhbG9hZGVkXCIgbmFtZT1cImNyZXNjZW50XCIgY29sb3I9XCJwcmltYXJ5XCI+PC9pb24tc3Bpbm5lcj4gLS0+XG5cbiAgPGlvbi1tb2RhbCAjZGF0ZVRpbWVNb2RhbD5cbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICA8aW9uLWNvbnRlbnQ+XG4gICAgICAgIDxpb24tZGF0ZXRpbWVcbiAgICAgICAgICAjaW9uRGF0ZVRpbWVcbiAgICAgICAgICBbc2hvd0RlZmF1bHRUaXRsZV09XCJzaG93Q2FsZW5kYXJQaWNrZXJUaXRsZVwiXG4gICAgICAgICAgW3Nob3dEZWZhdWx0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgIHNpemU9XCJjb3ZlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cInBlbmRpbmdTdWJtaXRWYWx1ZVwiXG4gICAgICAgICAgKGlvbkNoYW5nZSk9XCJvblBlbmRpbmdDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIDxpb24tYnV0dG9ucyBzbG90PVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlvbkRhdGVUaW1lLmNvbmZpcm0oKTsgb25Db25maXJtKClcIlxuICAgICAgICAgICAgICA+Q29uZmlybTwvaW9uLWJ1dHRvblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlvbkRhdGVUaW1lLmNhbmNlbCgpOyBkYXRlVGltZU1vZGFsLmRpc21pc3MoKVwiXG4gICAgICAgICAgICAgID5DYW5jZWw8L2lvbi1idXR0b25cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2lvbi1idXR0b25zPiAtLT5cbiAgICAgICAgPC9pb24tZGF0ZXRpbWU+XG4gICAgICA8L2lvbi1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaW9uLW1vZGFsPlxuICA8aW9uLWljb25cbiAgICBbY29sb3JdPVwiaWNvbkNhbGVuZGFyQ29sb3JcIlxuICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAqbmdJZj1cInNob3dDYWxlbmRhckljb25cIlxuICA+PC9pb24taWNvbj5cbiAgPGlvbi1sYWJlbD5cbiAgICB7eyBkYXRlVGltZVZhbHVlIHwgZGF0ZTogKGZvcm1hdCA/IGZvcm1hdCA6ICdNTU0gZCwgeSwgaDptbTpzcyBhJykgfX1cbiAgPC9pb24tbGFiZWw+XG4gIDwhLS1cbiAgICA8aW9uLWRhdGV0aW1lXG4gICAgICAqbmdJZj1cImxvYWRlZFwiXG4gICAgIFxuICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgIFt2YWx1ZV09XCJkYXRlVGltZVZhbHVlXCJcbiAgICAgIChpb25DaGFuZ2UpPVxuICAgID48L2lvbi1kYXRldGltZT5cbiAgLS0+XG48L3RhcC12YWx1ZS1lZGl0b3ItY29udGFpbmVyPlxuIl19