UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

260 lines 32.4 kB
import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DateTimePickerMode } from '../../enums/date-time-picker.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../icon/icon.component"; export class DatetimerPickerComponent { ngZone; label = 'Data e Hora'; mode = DateTimePickerMode.DateTime; rangeSelection = false; minDate = null; maxDate = null; disabled = false; dateTimeChange = new EventEmitter(); pickerRoot; static idCounter = 0; uniqueId = ++DatetimerPickerComponent.idCounter; inputId = `datetimepicker-input-${this.uniqueId}`; buttonId = `${this.inputId}-btn`; innerValue = null; instance; loadInterval; loadTimeout; onChange = () => { }; onTouched = () => { }; get dataMode() { return this.rangeSelection ? 'range' : 'single'; } get dataType() { switch (this.mode) { case DateTimePickerMode.Time: return 'time'; case DateTimePickerMode.DateTime: return 'datetime-local'; default: return 'text'; } } get inputType() { return this.dataType; } get iconName() { return this.mode === DateTimePickerMode.Time ? 'clock' : 'calendar-alt'; } get ariaLabel() { return this.mode === DateTimePickerMode.Time ? 'Abrir Timepicker' : 'Abrir Datepicker'; } get placeholder() { if (this.mode === DateTimePickerMode.Date) { return this.rangeSelection ? 'exemplo: 02/02/2024 até 03/02/2025' : 'exemplo: 02/02/2024'; } if (this.mode === DateTimePickerMode.Time) { return 'exemplo: 02:40'; } return 'exemplo: 02/02/2024 02:02'; } constructor(ngZone) { this.ngZone = ngZone; } ngAfterViewInit() { this.ensureCoreLoaded(); } ngOnChanges(changes) { if (this.pickerRoot && (changes['mode'] || changes['rangeSelection'] || changes['minDate'] || changes['maxDate'])) { this.initPicker(); } } ngOnDestroy() { this.clearLoadTimer(); this.destroyPicker(); } clearLoadTimer() { if (this.loadInterval) { window.clearInterval(this.loadInterval); this.loadInterval = undefined; } if (this.loadTimeout) { window.clearTimeout(this.loadTimeout); this.loadTimeout = undefined; } } writeValue(value) { this.innerValue = value || null; if (this.instance) { this.setPickerValue(this.innerValue, false); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; if (this.instance && this.instance.calendar) { this.instance.calendar.set('allowInput', !isDisabled); } } ensureCoreLoaded() { if (typeof window === 'undefined') { return; } if (this.getCore()) { this.initPicker(); return; } this.loadInterval = window.setInterval(() => { if (this.getCore()) { this.clearLoadTimer(); this.initPicker(); } }, 100); this.loadTimeout = window.setTimeout(() => this.clearLoadTimer(), 10000); } getCore() { return window.core; } initPicker() { const core = this.getCore(); if (!core || !core.BRDateTimePicker || !this.pickerRoot) { return; } const root = this.pickerRoot.nativeElement; const existingFlatpickr = root._flatpickr; if (existingFlatpickr && typeof existingFlatpickr.destroy === 'function') { existingFlatpickr.destroy(); } this.destroyPicker(); const config = { onChange: (selectedDates) => { this.handleSelection(selectedDates); }, }; if (this.minDate) { config.minDate = this.minDate; } if (this.maxDate) { config.maxDate = this.maxDate; } if (this.innerValue) { config.defaultDate = this.buildDefaultDate(this.innerValue); } try { this.instance = new core.BRDateTimePicker('br-datetimepicker', root, config); if (this.disabled) { this.instance.calendar.set('allowInput', false); } } catch (error) { console.error('Erro ao inicializar BRDateTimePicker', error); } } buildDefaultDate(value) { if (!value) { return undefined; } if (this.rangeSelection && this.isDateTimeRange(value)) { if (value.start && value.end) { return [value.start, value.end]; } if (value.start) { return [value.start]; } return undefined; } if (value instanceof Date) { return value; } return undefined; } setPickerValue(value, triggerChange = true) { if (!this.instance || !this.instance.calendar) { return; } const date = this.buildDefaultDate(value); if (date) { this.instance.calendar.setDate(date, triggerChange); } else { this.instance.calendar.setDate([], false); } } handleSelection(selectedDates) { this.ngZone.run(() => { let value = null; if (this.rangeSelection) { if (selectedDates.length > 0) { value = { start: selectedDates[0], end: selectedDates[1] || null, }; } } else { value = selectedDates[0] || null; } this.innerValue = value; this.onChange(value); this.onTouched(); this.dateTimeChange.emit(value); }); } destroyPicker() { if (this.instance && this.instance.calendar && typeof this.instance.calendar.destroy === 'function') { this.instance.calendar.destroy(); this.instance = null; } } isDateTimeRange(value) { return value && 'start' in value; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatetimerPickerComponent, selector: "cfc-datetimer-picker", inputs: { label: "label", mode: "mode", rangeSelection: "rangeSelection", minDate: "minDate", maxDate: "maxDate", disabled: "disabled" }, outputs: { dateTimeChange: "dateTimeChange" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatetimerPickerComponent, multi: true, }, ], viewQueries: [{ propertyName: "pickerRoot", first: true, predicate: ["pickerRoot"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"br-datetimepicker\"\r\n [attr.data-mode]=\"dataMode\"\r\n [attr.data-type]=\"dataType\"\r\n #pickerRoot>\r\n <div class=\"br-input has-icon\">\r\n <label *ngIf=\"label\" [for]=\"inputId\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n [type]=\"inputType\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n data-input=\"data-input\"\r\n />\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.id]=\"buttonId\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n data-toggle=\"data-toggle\"\r\n [disabled]=\"disabled\">\r\n <cfc-icon [iconName]=\"iconName\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-datetimepicker{position:relative}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-datetimer-picker', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatetimerPickerComponent, multi: true, }, ], template: "<div class=\"br-datetimepicker\"\r\n [attr.data-mode]=\"dataMode\"\r\n [attr.data-type]=\"dataType\"\r\n #pickerRoot>\r\n <div class=\"br-input has-icon\">\r\n <label *ngIf=\"label\" [for]=\"inputId\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n [type]=\"inputType\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n data-input=\"data-input\"\r\n />\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.id]=\"buttonId\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n data-toggle=\"data-toggle\"\r\n [disabled]=\"disabled\">\r\n <cfc-icon [iconName]=\"iconName\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-datetimepicker{position:relative}\n"] }] }], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { label: [{ type: Input }], mode: [{ type: Input }], rangeSelection: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], disabled: [{ type: Input }], dateTimeChange: [{ type: Output }], pickerRoot: [{ type: ViewChild, args: ['pickerRoot', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsR0FPVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7QUFldkUsTUFBTSxPQUFPLHdCQUF3QjtJQXFFZjtJQWxFWCxLQUFLLEdBQVcsYUFBYSxDQUFDO0lBQzlCLElBQUksR0FBdUIsa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ3ZELGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsT0FBTyxHQUFnQixJQUFJLENBQUM7SUFDNUIsT0FBTyxHQUFnQixJQUFJLENBQUM7SUFDNUIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUV6QixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7SUFHM0UsVUFBVSxDQUEyQjtJQUU3QixNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNaLFFBQVEsR0FBRyxFQUFFLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztJQUVqRSxPQUFPLEdBQUcsd0JBQXdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsRCxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxN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cHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgTmdab25lLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL2RhdGUtdGltZS1waWNrZXIuZW51bSc7XHJcbmltcG9ydCB7IERhdGVUaW1lUmFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS10aW1lLXJhbmdlLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2ZjLWRhdGV0aW1lci1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRldGltZXItcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuc2NzcycsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogRGF0ZXRpbWVyUGlja2VyQ29tcG9uZW50LFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGV0aW1lclBpY2tlckNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXHJcbntcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ0RhdGEgZSBIb3JhJztcclxuICBASW5wdXQoKSBtb2RlOiBEYXRlVGltZVBpY2tlck1vZGUgPSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZVRpbWU7XHJcbiAgQElucHV0KCkgcmFuZ2VTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBkYXRlVGltZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdwaWNrZXJSb290JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwaWNrZXJSb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1bmlxdWVJZCA9ICsrRGF0ZXRpbWVyUGlja2VyQ29tcG9uZW50LmlkQ291bnRlcjtcclxuXHJcbiAgaW5wdXRJZCA9IGBkYXRldGltZXBpY2tlci1pbnB1dC0ke3RoaXMudW5pcXVlSWR9YDtcclxuICBidXR0b25JZCA9IGAke3RoaXMuaW5wdXRJZH0tYnRuYDtcclxuXHJcbiAgcHJpdmF0ZSBpbm5lclZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5zdGFuY2U6IGFueTtcclxuICBwcml2YXRlIGxvYWRJbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbG9hZFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGUgfCBEYXRlVGltZVJhbmdlIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIGdldCBkYXRhTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmFuZ2VTZWxlY3Rpb24gPyAncmFuZ2UnIDogJ3NpbmdsZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XHJcbiAgICAgIGNhc2UgRGF0ZVRpbWVQaWNrZXJNb2RlLlRpbWU6XHJcbiAgICAgICAgcmV0dXJuICd0aW1lJztcclxuICAgICAgY2FzZSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZVRpbWU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRldGltZS1sb2NhbCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGljb25OYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuVGltZSA/ICdjbG9jaycgOiAnY2FsZW5kYXItYWx0JztcclxuICB9XHJcblxyXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IERhdGVUaW1lUGlja2VyTW9kZS5UaW1lXHJcbiAgICAgID8gJ0FicmlyIFRpbWVwaWNrZXInXHJcbiAgICAgIDogJ0FicmlyIERhdGVwaWNrZXInO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yYW5nZVNlbGVjdGlvblxyXG4gICAgICAgID8gJ2V4ZW1wbG86IDAyLzAyLzIwMjQgYXTDqSAwMy8wMi8yMDI1J1xyXG4gICAgICAgIDogJ2V4ZW1wbG86IDAyLzAyLzIwMjQnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gRGF0ZVRpbWVQaWNrZXJNb2RlLlRpbWUpIHtcclxuICAgICAgcmV0dXJuICdleGVtcGxvOiAwMjo0MCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2V4ZW1wbG86IDAyLzAyLzIwMjQgMDI6MDInO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lbnN1cmVDb3JlTG9hZGVkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucGlja2VyUm9vdCAmJlxyXG4gICAgICAoY2hhbmdlc1snbW9kZSddIHx8XHJcbiAgICAgICAgY2hhbmdlc1sncmFuZ2VTZWxlY3Rpb24nXSB8fFxyXG4gICAgICAgIGNoYW5nZXNbJ21pbkRhdGUnXSB8fFxyXG4gICAgICAgIGNoYW5nZXNbJ21heERhdGUnXSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmluaXRQaWNrZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckxvYWRUaW1lcigpO1xyXG4gICAgdGhpcy5kZXN0cm95UGlja2VyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyTG9hZFRpbWVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZEludGVydmFsKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMubG9hZEludGVydmFsKTtcclxuICAgICAgdGhpcy5sb2FkSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sb2FkVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubG9hZFRpbWVvdXQpO1xyXG4gICAgICB0aGlzLmxvYWRUaW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5zZXRQaWNrZXJWYWx1ZSh0aGlzLmlubmVyVmFsdWUsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmNhbGVuZGFyKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuc2V0KCdhbGxvd0lucHV0JywgIWlzRGlzYWJsZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVDb3JlTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdldENvcmUoKSkge1xyXG4gICAgICB0aGlzLmluaXRQaWNrZXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5nZXRDb3JlKCkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyTG9hZFRpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0UGlja2VyKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgICB0aGlzLmxvYWRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbGVhckxvYWRUaW1lcigpLCAxMDAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvcmUoKTogYW55IHtcclxuICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY29yZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFBpY2tlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvcmUgPSB0aGlzLmdldENvcmUoKTtcclxuICAgIGlmICghY29yZSB8fCAhY29yZS5CUkRhdGVUaW1lUGlja2VyIHx8ICF0aGlzLnBpY2tlclJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnBpY2tlclJvb3QubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGV4aXN0aW5nRmxhdHBpY2tyID0gKHJvb3QgYXMgYW55KS5fZmxhdHBpY2tyO1xyXG4gICAgaWYgKGV4aXN0aW5nRmxhdHBpY2tyICYmIHR5cGVvZiBleGlzdGluZ0ZsYXRwaWNrci5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGV4aXN0aW5nRmxhdHBpY2tyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRlc3Ryb3lQaWNrZXIoKTtcclxuXHJcbiAgICBjb25zdCBjb25maWc6IGFueSA9IHtcclxuICAgICAgb25DaGFuZ2U6IChzZWxlY3RlZERhdGVzOiBEYXRlW10pID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbihzZWxlY3RlZERhdGVzKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICBjb25maWcubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcclxuICAgICAgY29uZmlnLm1heERhdGUgPSB0aGlzLm1heERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaW5uZXJWYWx1ZSkge1xyXG4gICAgICBjb25maWcuZGVmYXVsdERhdGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERhdGUodGhpcy5pbm5lclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmluc3RhbmNlID0gbmV3IGNvcmUuQlJEYXRlVGltZVBpY2tlcihcclxuICAgICAgICAnYnItZGF0ZXRpbWVwaWNrZXInLFxyXG4gICAgICAgIHJvb3QsXHJcbiAgICAgICAgY29uZmlnXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXQoJ2FsbG93SW5wdXQnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gaW5pY2lhbGl6YXIgQlJEYXRlVGltZVBpY2tlcicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0RGF0ZShcclxuICAgIHZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGxcclxuICApOiBEYXRlIHwgRGF0ZVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJhbmdlU2VsZWN0aW9uICYmIHRoaXMuaXNEYXRlVGltZVJhbmdlKHZhbHVlKSkge1xyXG4gICAgICBpZiAodmFsdWUuc3RhcnQgJiYgdmFsdWUuZW5kKSB7XHJcbiAgICAgICAgcmV0dXJuIFt2YWx1ZS5zdGFydCwgdmFsdWUuZW5kXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUuc3RhcnQpIHtcclxuICAgICAgICByZXR1cm4gW3ZhbHVlLnN0YXJ0XTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQaWNrZXJWYWx1ZShcclxuICAgIHZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGwsXHJcbiAgICB0cmlnZ2VyQ2hhbmdlID0gdHJ1ZVxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmluc3RhbmNlIHx8ICF0aGlzLmluc3RhbmNlLmNhbGVuZGFyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERhdGUodmFsdWUpO1xyXG4gICAgaWYgKGRhdGUpIHtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXREYXRlKGRhdGUsIHRyaWdnZXJDaGFuZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXREYXRlKFtdLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbihzZWxlY3RlZERhdGVzOiBEYXRlW10pOiB2b2lkIHtcclxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIGxldCB2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMucmFuZ2VTZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHtcclxuICAgICAgICAgICAgc3RhcnQ6IHNlbGVjdGVkRGF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGVuZDogc2VsZWN0ZWREYXRlc1sxXSB8fCBudWxsLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZERhdGVzWzBdIHx8IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICAgICAgdGhpcy5kYXRlVGltZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95UGlja2VyKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmluc3RhbmNlICYmXHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIgJiZcclxuICAgICAgdHlwZW9mIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJ1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlVGltZVJhbmdlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBEYXRlVGltZVJhbmdlIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiAnc3RhcnQnIGluIHZhbHVlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYnItZGF0ZXRpbWVwaWNrZXJcIlxyXG4gICAgIFthdHRyLmRhdGEtbW9kZV09XCJkYXRhTW9kZVwiXHJcbiAgICAgW2F0dHIuZGF0YS10eXBlXT1cImRhdGFUeXBlXCJcclxuICAgICAjcGlja2VyUm9vdD5cclxuICA8ZGl2IGNsYXNzPVwiYnItaW5wdXQgaGFzLWljb25cIj5cclxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpbnB1dElkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcclxuICAgICAgW3R5cGVdPVwiaW5wdXRUeXBlXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgZGF0YS1pbnB1dD1cImRhdGEtaW5wdXRcIlxyXG4gICAgLz5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJici1idXR0b24gY2lyY2xlIHNtYWxsXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcclxuICAgICAgW2F0dHIuaWRdPVwiYnV0dG9uSWRcIlxyXG4gICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgZGF0YS10b2dnbGU9XCJkYXRhLXRvZ2dsZVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICA8Y2ZjLWljb24gW2ljb25OYW1lXT1cImljb25OYW1lXCIgW2ZhbWlseU5hbWVdPVwiJ2ZhcydcIiBbc2l6ZV09XCInMTRweCdcIj48L2NmYy1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=