@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
175 lines • 25.4 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../i18n/c8y-translate.pipe";
export class TimePickerComponent {
constructor(cdRef) {
this.cdRef = cdRef;
this.lastValidHours = '00';
this.lastValidMinutes = '00';
this.dayForward = new EventEmitter();
this.dayBackward = new EventEmitter();
this.disabled = false;
this.date = new Date();
this.touched = false;
this.destroy$ = new Subject();
this.simulatedWheelUpEvent = { wheelDeltaY: 1, preventDefault: () => null };
this.simulatedWheelDownEvent = { wheelDeltaY: -1, preventDefault: () => null };
}
parseValue(target, lastValid, limit) {
this.cdRef.detectChanges();
if (this[target].length > 0 && !/^\d+$/.test(this[target])) {
this[target] = this[lastValid];
return;
}
if (this[target].length <= 1) {
this[target] = this[target].padStart(2, '0');
}
if (this[target].length > 2 && this[target].startsWith('0')) {
this[target] = this[target].slice(1, 3);
}
if (this[target].length > 2) {
this[target] = this[lastValid];
return;
}
if (Number(this[target]) > limit) {
this[target] = limit;
}
this[lastValid] = this[target];
}
initializeMinutes() {
if (!this.hasValue(this.minutes)) {
this.minutes = '00';
}
}
initializeHours() {
if (!this.hasValue(this.hours)) {
this.hours = '00';
}
}
handleHourScroll(ev) {
// up
ev.preventDefault();
if (ev.wheelDeltaY > 0) {
if (Number(this.hours) === 23) {
this.writeValue({ hour: 0, minute: Number(this.minutes) });
this.dayForward.emit();
}
else {
this.writeValue({ hour: Number(this.hours) + 1, minute: Number(this.minutes) });
}
this.emitValue();
}
// down
if (ev.wheelDeltaY < 0) {
if (Number(this.hours) === 0) {
this.writeValue({ hour: 23, minute: Number(this.minutes) });
this.dayBackward.emit();
}
else {
this.writeValue({ hour: Number(this.hours) - 1, minute: Number(this.minutes) });
}
this.emitValue();
}
}
handleMinuteScroll(ev) {
// up
ev.preventDefault();
if (ev.wheelDeltaY > 0) {
if (Number(this.minutes) === 59) {
this.writeValue({ hour: Number(this.hours), minute: 0 });
this.handleHourScroll(this.simulatedWheelUpEvent);
}
else {
this.writeValue({ hour: Number(this.hours), minute: Number(this.minutes) + 1 });
}
}
// down
if (ev.wheelDeltaY < 0) {
if (Number(this.minutes) === 0) {
this.writeValue({ hour: Number(this.hours), minute: 59 });
this.handleHourScroll(this.simulatedWheelDownEvent);
}
else {
this.writeValue({ hour: Number(this.hours), minute: Number(this.minutes) - 1 });
}
}
this.emitValue();
}
emitValue() {
if (this.hasValue(this.hours) && this.hasValue(this.minutes)) {
this.onChange({
hour: Number(this.hours),
minute: Number(this.minutes)
});
}
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
/**
* Control Value Accessor - If form value changes by external factor, update date property and internal form with new value.
*/
writeValue(value) {
if (this.hasValue(value?.hour) && this.hasValue(value?.minute)) {
this.hours = value.hour.toString();
this.minutes = value.minute.toString();
this.parseValue('hours', 'lastValidHours', 23);
this.parseValue('minutes', 'lastValidMinutes', 59);
}
else {
this.hours = undefined;
this.minutes = undefined;
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(onTouched) {
this.onTouched = onTouched;
}
markAsTouched() {
if (!this.touched) {
this.onTouched();
this.touched = true;
}
}
setDisabledState(disabled) {
this.disabled = disabled;
}
hasValue(value) {
return typeof value !== 'undefined';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimePickerComponent, selector: "c8y-time-picker", inputs: { minDate: "minDate", maxDate: "maxDate", placeholder: "placeholder" }, outputs: { dayForward: "dayForward", dayBackward: "dayBackward" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TimePickerComponent),
multi: true
}
], ngImport: i0, template: "<table>\n <tbody>\n <tr>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'HH`HOURS`' | translate\"\n [(ngModel)]=\"hours\"\n (input)=\"parseValue('hours', 'lastValidHours', 23); initializeMinutes()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleHourScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n <td> : </td>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'MM`MINUTES`' | translate\"\n [(ngModel)]=\"minutes\"\n (input)=\"parseValue('minutes', 'lastValidMinutes', 59); initializeHours()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleMinuteScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-time-picker', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TimePickerComponent),
multi: true
}
], template: "<table>\n <tbody>\n <tr>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'HH`HOURS`' | translate\"\n [(ngModel)]=\"hours\"\n (input)=\"parseValue('hours', 'lastValidHours', 23); initializeMinutes()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleHourScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n <td> : </td>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'MM`MINUTES`' | translate\"\n [(ngModel)]=\"minutes\"\n (input)=\"parseValue('minutes', 'lastValidMinutes', 59); initializeHours()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleMinuteScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n </tr>\n </tbody>\n</table>\n" }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { minDate: [{
type: Input
}], maxDate: [{
type: Input
}], placeholder: [{
type: Input
}], dayForward: [{
type: Output
}], dayBackward: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWEvQixNQUFNLE9BQU8sbUJBQW1CO0lBaUM5QixZQUFvQixLQUF3QjtRQUF4QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQTdCNUMsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBWXhCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVqQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBSWhCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXhDLDBCQUFxQixHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkUsNEJBQXVCLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRW5DLENBQUM7SUFFaEQsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENB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TyxRQUFRLENBQUMsS0FBVTtRQUN6QixPQUFPLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztJQUN0QyxDQUFDOytHQWhMVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2TEFSbkI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2dCQUNsRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDckJILHFrQ0FpQ0E7OzRGRFZhLG1CQUFtQjtrQkFYL0IsU0FBUzsrQkFDRSxpQkFBaUIsYUFFaEI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO3NGQVVELE9BQU87c0JBRE4sS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgaG91cnM6IHN0cmluZztcbiAgbWludXRlczogc3RyaW5nO1xuXG4gIGxhc3RWYWxpZEhvdXJzID0gJzAwJztcbiAgbGFzdFZhbGlkTWludXRlcyA9ICcwMCc7XG5cbiAgQElucHV0KClcbiAgbWluRGF0ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG1heERhdGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKVxuICBkYXlGb3J3YXJkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBkYXlCYWNrd2FyZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBkYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiB7IGhvdXI6IG51bWJlcjsgbWludXRlOiBudW1iZXIgfSkgPT4gdm9pZDtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBzaW11bGF0ZWRXaGVlbFVwRXZlbnQgPSB7IHdoZWVsRGVsdGFZOiAxLCBwcmV2ZW50RGVmYXVsdDogKCkgPT4gbnVsbCB9O1xuICBwcml2YXRlIHNpbXVsYXRlZFdoZWVsRG93bkV2ZW50ID0geyB3aGVlbERlbHRhWTogLTEsIHByZXZlbnREZWZhdWx0OiAoKSA9PiBudWxsIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcGFyc2VWYWx1ZSh0YXJnZXQsIGxhc3RWYWxpZCwgbGltaXQpIHtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzW3RhcmdldF0ubGVuZ3RoID4gMCAmJiAhL15cXGQrJC8udGVzdCh0aGlzW3RhcmdldF0pKSB7XG4gICAgICB0aGlzW3RhcmdldF0gPSB0aGlzW2xhc3RWYWxpZF07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbdGFyZ2V0XS5sZW5ndGggPD0gMSkge1xuICAgICAgdGhpc1t0YXJnZXRdID0gdGhpc1t0YXJnZXRdLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbdGFyZ2V0XS5sZW5ndGggPiAyICYmIHRoaXNbdGFyZ2V0XS5zdGFydHNXaXRoKCcwJykpIHtcbiAgICAgIHRoaXNbdGFyZ2V0XSA9IHRoaXNbdGFyZ2V0XS5zbGljZSgxLCAzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpc1t0YXJnZXRdLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXNbdGFyZ2V0XSA9IHRoaXNbbGFzdFZhbGlkXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHRoaXNbdGFyZ2V0XSkgPiBsaW1pdCkge1xuICAgICAgdGhpc1t0YXJnZXRdID0gbGltaXQ7XG4gICAgfVxuXG4gICAgdGhpc1tsYXN0VmFsaWRdID0gdGhpc1t0YXJnZXRdO1xuICB9XG5cbiAgaW5pdGlhbGl6ZU1pbnV0ZXMoKSB7XG4gICAgaWYgKCF0aGlzLmhhc1ZhbHVlKHRoaXMubWludXRlcykpIHtcbiAgICAgIHRoaXMubWludXRlcyA9ICcwMCc7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUhvdXJzKCkge1xuICAgIGlmICghdGhpcy5oYXNWYWx1ZSh0aGlzLmhvdXJzKSkge1xuICAgICAgdGhpcy5ob3VycyA9ICcwMCc7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSG91clNjcm9sbChldikge1xuICAgIC8vIHVwXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXYud2hlZWxEZWx0YVkgPiAwKSB7XG4gICAgICBpZiAoTnVtYmVyKHRoaXMuaG91cnMpID09PSAyMykge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiAwLCBtaW51dGU6IE51bWJlcih0aGlzLm1pbnV0ZXMpIH0pO1xuICAgICAgICB0aGlzLmRheUZvcndhcmQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpICsgMSwgbWludXRlOiBOdW1iZXIodGhpcy5taW51dGVzKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gZG93blxuICAgIGlmIChldi53aGVlbERlbHRhWSA8IDApIHtcbiAgICAgIGlmIChOdW1iZXIodGhpcy5ob3VycykgPT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogMjMsIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgfSk7XG4gICAgICAgIHRoaXMuZGF5QmFja3dhcmQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpIC0gMSwgbWludXRlOiBOdW1iZXIodGhpcy5taW51dGVzKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTWludXRlU2Nyb2xsKGV2KSB7XG4gICAgLy8gdXBcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldi53aGVlbERlbHRhWSA+IDApIHtcbiAgICAgIGlmIChOdW1iZXIodGhpcy5taW51dGVzKSA9PT0gNTkpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLCBtaW51dGU6IDAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlSG91clNjcm9sbCh0aGlzLnNpbXVsYXRlZFdoZWVsVXBFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiBOdW1iZXIodGhpcy5ob3VycyksIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgKyAxIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRvd25cbiAgICBpZiAoZXYud2hlZWxEZWx0YVkgPCAwKSB7XG4gICAgICBpZiAoTnVtYmVyKHRoaXMubWludXRlcykgPT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLCBtaW51dGU6IDU5IH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUhvdXJTY3JvbGwodGhpcy5zaW11bGF0ZWRXaGVlbERvd25FdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiBOdW1iZXIodGhpcy5ob3VycyksIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgLSAxIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBlbWl0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaGFzVmFsdWUodGhpcy5ob3VycykgJiYgdGhpcy5oYXNWYWx1ZSh0aGlzLm1pbnV0ZXMpKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHtcbiAgICAgICAgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLFxuICAgICAgICBtaW51dGU6IE51bWJlcih0aGlzLm1pbnV0ZXMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbCBWYWx1ZSBBY2Nlc3NvciAtIElmIGZvcm0gdmFsdWUgY2hhbmdlcyBieSBleHRlcm5hbCBmYWN0b3IsIHVwZGF0ZSBkYXRlIHByb3BlcnR5IGFuZCBpbnRlcm5hbCBmb3JtIHdpdGggbmV3IHZhbHVlLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogeyBob3VyOiBudW1iZXI7IG1pbnV0ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNWYWx1ZSh2YWx1ZT8uaG91cikgJiYgdGhpcy5oYXNWYWx1ZSh2YWx1ZT8ubWludXRlKSkge1xuICAgICAgdGhpcy5ob3VycyA9IHZhbHVlLmhvdXIudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMubWludXRlcyA9IHZhbHVlLm1pbnV0ZS50b1N0cmluZygpO1xuXG4gICAgICB0aGlzLnBhcnNlVmFsdWUoJ2hvdXJzJywgJ2xhc3RWYWxpZEhvdXJzJywgMjMpO1xuICAgICAgdGhpcy5wYXJzZVZhbHVlKCdtaW51dGVzJywgJ2xhc3RWYWxpZE1pbnV0ZXMnLCA1OSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG91cnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm1pbnV0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQoKSB7XG4gICAgaWYgKCF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgfVxufVxuIiwiPHRhYmxlPlxuICA8dGJvZHk+XG4gICAgPHRyPlxuICAgICAgPHRkIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgYnMtdGltZXBpY2tlci1maWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0hIYEhPVVJTYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiaG91cnNcIlxuICAgICAgICAgIChpbnB1dCk9XCJwYXJzZVZhbHVlKCdob3VycycsICdsYXN0VmFsaWRIb3VycycsIDIzKTsgaW5pdGlhbGl6ZU1pbnV0ZXMoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJlbWl0VmFsdWUoKVwiXG4gICAgICAgICAgKHdoZWVsKT1cImhhbmRsZUhvdXJTY3JvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgKGZvY3VzKT1cIm1hcmtBc1RvdWNoZWQoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L3RkPlxuICAgICAgPHRkPiZuYnNwOzombmJzcDs8L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgYnMtdGltZXBpY2tlci1maWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ01NYE1JTlVURVNgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJtaW51dGVzXCJcbiAgICAgICAgICAoaW5wdXQpPVwicGFyc2VWYWx1ZSgnbWludXRlcycsICdsYXN0VmFsaWRNaW51dGVzJywgNTkpOyBpbml0aWFsaXplSG91cnMoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJlbWl0VmFsdWUoKVwiXG4gICAgICAgICAgKHdoZWVsKT1cImhhbmRsZU1pbnV0ZVNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICAoZm9jdXMpPVwibWFya0FzVG91Y2hlZCgpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4iXX0=