UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

578 lines 47.1 kB
import { __decorate, __metadata, __param } from "tslib"; /** * This file contains all the directives used by the @link IgxTimePickerComponent. * You should generally not use them directly. * @preferred */ import { Directive, ElementRef, HostBinding, HostListener, Inject, Input, TemplateRef } from '@angular/core'; import { IGX_TIME_PICKER_COMPONENT } from './time-picker.common'; import { InteractionMode } from '../core/enums'; /** @hidden */ let IgxItemListDirective = class IgxItemListDirective { constructor(timePicker, elementRef) { this.timePicker = timePicker; this.elementRef = elementRef; this.tabindex = 0; } get defaultCSS() { return true; } get hourCSS() { return this.type === 'hourList'; } get minuteCSS() { return this.type === 'minuteList'; } get secondsCSS() { return this.type === 'secondsList'; } get ampmCSS() { return this.type === 'ampmList'; } onFocus() { this.isActive = true; } onBlur() { this.isActive = false; } nextItem() { switch (this.type) { case 'hourList': { this.timePicker.nextHour(); break; } case 'minuteList': { this.timePicker.nextMinute(); break; } case 'secondsList': { this.timePicker.nextSeconds(); break; } case 'ampmList': { this.timePicker.nextAmPm(); break; } } } prevItem() { switch (this.type) { case 'hourList': { this.timePicker.prevHour(); break; } case 'minuteList': { this.timePicker.prevMinute(); break; } case 'secondsList': { this.timePicker.prevSeconds(); break; } case 'ampmList': { this.timePicker.prevAmPm(); break; } } } /** * @hidden */ onKeydownArrowDown(event) { event.preventDefault(); this.nextItem(); } /** * @hidden */ onKeydownArrowUp(event) { event.preventDefault(); this.prevItem(); } /** * @hidden */ onKeydownArrowRight(event) { event.preventDefault(); const listName = event.target.className; if (listName.indexOf('hourList') !== -1 && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1) && this.timePicker.secondsList) { this.timePicker.secondsList.nativeElement.focus(); } else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1 || listName.indexOf('secondsList') !== -1) && this.timePicker.ampmList) { this.timePicker.ampmList.nativeElement.focus(); } } /** * @hidden */ onKeydownArrowLeft(event) { event.preventDefault(); const listName = event.target.className; if (listName.indexOf('ampmList') !== -1 && this.timePicker.secondsList) { this.timePicker.secondsList.nativeElement.focus(); } else if (listName.indexOf('secondsList') !== -1 && this.timePicker.secondsList && listName.indexOf('minutesList') && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if (listName.indexOf('ampmList') !== -1 && this.timePicker.minuteList) { this.timePicker.minuteList.nativeElement.focus(); } else if ((listName.indexOf('ampmList') !== -1 || listName.indexOf('secondsList') !== -1 || listName.indexOf('minuteList') !== -1) && this.timePicker.hourList) { this.timePicker.hourList.nativeElement.focus(); } } /** * @hidden */ onKeydownEnter(event) { event.preventDefault(); if (this.timePicker.mode === InteractionMode.DropDown) { this.timePicker.close(); return; } this.timePicker.okButtonClick(); } /** * @hidden */ onKeydownEscape(event) { event.preventDefault(); this.timePicker.cancelButtonClick(); } /** * @hidden */ onHover() { this.elementRef.nativeElement.focus(); } /** * @hidden */ onScroll(event) { event.preventDefault(); event.stopPropagation(); if (event.deltaY > 0) { this.nextItem(); } else if (event.deltaY < 0) { this.prevItem(); } } /** * @hidden */ onPanMove(event) { if (event.deltaY < 0) { this.nextItem(); } else if (event.deltaY > 0) { this.prevItem(); } } }; IgxItemListDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: ElementRef } ]; __decorate([ Input('igxItemList'), __metadata("design:type", String) ], IgxItemListDirective.prototype, "type", void 0); __decorate([ HostBinding('attr.tabindex'), __metadata("design:type", Object) ], IgxItemListDirective.prototype, "tabindex", void 0); __decorate([ HostBinding('class.igx-time-picker__column'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__hourList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "hourCSS", null); __decorate([ HostBinding('class.igx-time-picker__minuteList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "minuteCSS", null); __decorate([ HostBinding('class.igx-time-picker__secondsList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "secondsCSS", null); __decorate([ HostBinding('class.igx-time-picker__ampmList'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxItemListDirective.prototype, "ampmCSS", null); __decorate([ HostListener('focus'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onFocus", null); __decorate([ HostListener('blur'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onBlur", null); __decorate([ HostListener('keydown.arrowdown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowDown", null); __decorate([ HostListener('keydown.arrowup', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowUp", null); __decorate([ HostListener('keydown.arrowright', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowRight", null); __decorate([ HostListener('keydown.arrowleft', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownArrowLeft", null); __decorate([ HostListener('keydown.enter', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownEnter", null); __decorate([ HostListener('keydown.escape', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onKeydownEscape", null); __decorate([ HostListener('mouseover'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onHover", null); __decorate([ HostListener('wheel', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onScroll", null); __decorate([ HostListener('panmove', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxItemListDirective.prototype, "onPanMove", null); IgxItemListDirective = __decorate([ Directive({ selector: '[igxItemList]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, ElementRef]) ], IgxItemListDirective); export { IgxItemListDirective }; /** * @hidden */ let IgxHourItemDirective = class IgxHourItemDirective { constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } get defaultCSS() { return true; } get selectedCSS() { return this.isSelectedHour; } get activeCSS() { return this.isSelectedHour && this.itemList.isActive; } get isSelectedHour() { return this.timePicker.selectedHour === this.value; } onClick(item) { if (item !== '') { this.timePicker.scrollHourIntoView(item); } } }; IgxHourItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; __decorate([ Input('igxHourItem'), __metadata("design:type", String) ], IgxHourItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxHourItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxHourItemDirective.prototype, "onClick", null); IgxHourItemDirective = __decorate([ Directive({ selector: '[igxHourItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxHourItemDirective); export { IgxHourItemDirective }; /** * @hidden */ let IgxMinuteItemDirective = class IgxMinuteItemDirective { constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } get defaultCSS() { return true; } get selectedCSS() { return this.isSelectedMinute; } get activeCSS() { return this.isSelectedMinute && this.itemList.isActive; } get isSelectedMinute() { return this.timePicker.selectedMinute === this.value; } onClick(item) { if (item !== '') { this.timePicker.scrollMinuteIntoView(item); } } }; IgxMinuteItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; __decorate([ Input('igxMinuteItem'), __metadata("design:type", String) ], IgxMinuteItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxMinuteItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxMinuteItemDirective.prototype, "onClick", null); IgxMinuteItemDirective = __decorate([ Directive({ selector: '[igxMinuteItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxMinuteItemDirective); export { IgxMinuteItemDirective }; /** * @hidden */ let IgxSecondsItemDirective = class IgxSecondsItemDirective { constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } get defaultCSS() { return true; } get selectedCSS() { return this.isSelectedSeconds; } get activeCSS() { return this.isSelectedSeconds && this.itemList.isActive; } get isSelectedSeconds() { return this.timePicker.selectedSeconds === this.value; } onClick(item) { if (item !== '') { this.timePicker.scrollSecondsIntoView(item); } } }; IgxSecondsItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; __decorate([ Input('igxSecondsItem'), __metadata("design:type", String) ], IgxSecondsItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxSecondsItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxSecondsItemDirective.prototype, "onClick", null); IgxSecondsItemDirective = __decorate([ Directive({ selector: '[igxSecondsItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxSecondsItemDirective); export { IgxSecondsItemDirective }; /** * @hidden */ let IgxAmPmItemDirective = class IgxAmPmItemDirective { constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } get defaultCSS() { return true; } get selectedCSS() { return this.isSelectedAmPm; } get activeCSS() { return this.isSelectedAmPm && this.itemList.isActive; } get isSelectedAmPm() { return this.timePicker.selectedAmPm === this.value; } onClick(item) { if (item !== '') { this.timePicker.scrollAmPmIntoView(item); } } }; IgxAmPmItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; __decorate([ Input('igxAmPmItem'), __metadata("design:type", String) ], IgxAmPmItemDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-time-picker__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "defaultCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "selectedCSS", null); __decorate([ HostBinding('class.igx-time-picker__item--active'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxAmPmItemDirective.prototype, "activeCSS", null); __decorate([ HostListener('click', ['value']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxAmPmItemDirective.prototype, "onClick", null); IgxAmPmItemDirective = __decorate([ Directive({ selector: '[igxAmPmItem]' }), __param(0, Inject(IGX_TIME_PICKER_COMPONENT)), __metadata("design:paramtypes", [Object, IgxItemListDirective]) ], IgxAmPmItemDirective); export { IgxAmPmItemDirective }; /** * This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group. */ let IgxTimePickerTemplateDirective = class IgxTimePickerTemplateDirective { constructor(template) { this.template = template; } }; IgxTimePickerTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; IgxTimePickerTemplateDirective = __decorate([ Directive({ selector: '[igxTimePickerTemplate]' }), __metadata("design:paramtypes", [TemplateRef]) ], IgxTimePickerTemplateDirective); export { IgxTimePickerTemplateDirective }; /** * This directive can be used to add custom action buttons to the dropdownb/dialog. */ let IgxTimePickerActionsDirective = class IgxTimePickerActionsDirective { constructor(template) { this.template = template; } }; IgxTimePickerActionsDirective.ctorParameters = () => [ { type: TemplateRef } ]; IgxTimePickerActionsDirective = __decorate([ Directive({ selector: '[igxTimePickerActions]' }), __metadata("design:paramtypes", [TemplateRef]) ], IgxTimePickerActionsDirective); export { IgxTimePickerActionsDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsY0FBYztBQUlkLElBQWEsb0JBQW9CLEdBQWpDLE1BQWEsb0JBQW9CO0lBTzdCLFlBQzhDLFVBQTZCLEVBQy9ELFVBQXNCO1FBRFksZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDL0QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUkzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGhCLENBQUM7SUFNTCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBR0QsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBR0QsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBR0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBR0QsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBR00sT0FBTztRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFH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QUFRLEVBQUUsd0JBQXdCO0tBQ3JDLENBQUM7cUNBRStCLFdBQVc7R0FEL0IsNkJBQTZCLENBRXpDO1NBRlksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBkaXJlY3RpdmVzIHVzZWQgYnkgdGhlIEBsaW5rIElneFRpbWVQaWNrZXJDb21wb25lbnQuXG4gKiBZb3Ugc2hvdWxkIGdlbmVyYWxseSBub3QgdXNlIHRoZW0gZGlyZWN0bHkuXG4gKiBAcHJlZmVycmVkXG4gKi9cbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQsIElneFRpbWVQaWNrZXJCYXNlIH0gZnJvbSAnLi90aW1lLXBpY2tlci5jb21tb24nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25Nb2RlIH0gZnJvbSAnLi4vY29yZS9lbnVtcyc7XG5cbi8qKiBAaGlkZGVuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hJdGVtTGlzdF0nXG59KVxuZXhwb3J0IGNsYXNzIElneEl0ZW1MaXN0RGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4SXRlbUxpc3QnKVxuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgaXNBY3RpdmU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChJR1hfVElNRV9QSUNLRVJfQ09NUE9ORU5UKSBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICAgICkgeyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fY29sdW1uJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2hvdXJMaXN0JylcbiAgICBnZXQgaG91ckNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2hvdXJMaXN0JztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fbWludXRlTGlzdCcpXG4gICAgZ2V0IG1pbnV0ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ21pbnV0ZUxpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19zZWNvbmRzTGlzdCcpXG4gICAgZ2V0IHNlY29uZHNDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdzZWNvbmRzTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2FtcG1MaXN0JylcbiAgICBnZXQgYW1wbUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2FtcG1MaXN0JztcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5leHRJdGVtKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaG91ckxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRIb3VyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtaW51dGVMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0TWludXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdzZWNvbmRzTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dFNlY29uZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2FtcG1MaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0QW1QbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmV2SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXJMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2SG91cigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldk1pbnV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kc0xpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3VwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3JpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dSaWdodChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3ROYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSB8fCBsaXN0TmFtZS5pbmRleE9mKCdtaW51dGVMaXN0JykgIT09IC0xKSAmJiB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5zZWNvbmRzTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGxpc3ROYW1lLmluZGV4T2YoJ2hvdXJMaXN0JykgIT09IC0xIHx8IGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIGxpc3ROYW1lLmluZGV4T2YoJ3NlY29uZHNMaXN0JykgIT09IC0xKSAmJiB0aGlzLnRpbWVQaWNrZXIuYW1wbUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5hbXBtTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgbGlzdE5hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ2FtcG1MaXN0JykgIT09IC0xICYmIHRoaXMudGltZVBpY2tlci5zZWNvbmRzTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNlY29uZHNMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaXN0TmFtZS5pbmRleE9mKCdzZWNvbmRzTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3RcbiAgICAgICAgICAgICYmIGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZXNMaXN0JykgJiYgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSB8fCBsaXN0TmFtZS5pbmRleE9mKCdzZWNvbmRzTGlzdCcpICE9PSAtMSB8fFxuICAgICAgICAgICAgbGlzdE5hbWUuaW5kZXhPZignbWludXRlTGlzdCcpICE9PSAtMSkgJiYgdGhpcy50aW1lUGlja2VyLmhvdXJMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuaG91ckxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIubW9kZSA9PT0gSW50ZXJhY3Rpb25Nb2RlLkRyb3BEb3duKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIub2tCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVzY2FwZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMudGltZVBpY2tlci5jYW5jZWxCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZW92ZXInKVxuICAgIHB1YmxpYyBvbkhvdmVyKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aGVlbCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uU2Nyb2xsKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhbm1vdmUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbk1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZJdGVtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hIb3VySXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEhvdXJJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4SG91ckl0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXI7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXIgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZEhvdXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRIb3VyID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsSG91ckludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4TWludXRlSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneE1pbnV0ZUl0ZW1EaXJlY3RpdmUge1xuXG4gICAgQElucHV0KCdpZ3hNaW51dGVJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZE1pbnV0ZSAmJiB0aGlzLml0ZW1MaXN0LmlzQWN0aXZlO1xuICAgIH1cblxuICAgIGdldCBpc1NlbGVjdGVkTWludXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkTWludXRlID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsTWludXRlSW50b1ZpZXcoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hTZWNvbmRzSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneFNlY29uZHNJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4U2Vjb25kc0l0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZFNlY29uZHM7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZFNlY29uZHMgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZFNlY29uZHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRTZWNvbmRzID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsU2Vjb25kc0ludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4QW1QbUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hBbVBtSXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEFtUG1JdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbVBtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkQW1QbSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEFtUG1JbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCB0byBtYXJrIHdoaWNoIG5nLXRlbXBsYXRlIHdpbGwgYmUgdXNlZCBmcm9tIElneFRpbWVQaWNrZXIgd2hlbiByZS10ZW1wbGF0aW5nIGl0cyBpbnB1dCBncm91cC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGltZVBpY2tlclRlbXBsYXRlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxufVxuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGFkZCBjdXN0b20gYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGRyb3Bkb3duYi9kaWFsb2cuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneFRpbWVQaWNrZXJBY3Rpb25zXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlckFjdGlvbnNEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XG59XG4iXX0=