ng-devui
Version:
DevUI components based on Angular
458 lines • 62 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { animate, AnimationBuilder, style } from '@angular/animations';
import { DOCUMENT } from '@angular/common';
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Injector, Input, Output, Renderer2, TemplateRef, ViewContainerRef, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { addClassToOrigin, AnimationCurves, AnimationDuration, DefaultDateConverter, DevConfigService, removeClassFromOrigin, WithConfig, } from 'ng-devui/utils';
import { fromEvent } from 'rxjs';
import { debounceTime, filter, map } from 'rxjs/operators';
import { SelectDateChangeReason } from './date-change-event-args.model';
import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service';
import { DatepickerComponent } from './datepicker.component';
import * as i0 from "@angular/core";
import * as i1 from "./date-picker.config.service";
import * as i2 from "ng-devui/i18n";
import * as i3 from "@angular/animations";
import * as i4 from "ng-devui/utils";
export class DatepickerDirective {
set isOpen(val) {
this._isOpen = val;
if (val) {
addClassToOrigin(this.elementRef);
setTimeout(() => {
this.document.addEventListener('click', this.onDocumentClick);
});
}
else {
removeClassFromOrigin(this.elementRef);
this.document.removeEventListener('click', this.onDocumentClick);
}
}
get isOpen() {
return this._isOpen;
}
set showTime(showTime) {
this._showTime = showTime;
}
get showTime() {
return typeof this._showTime === 'boolean' ? this._showTime : this.dateConfig.timePicker;
}
set dateConfig(dateConfig) {
if (this.checkDateConfig(dateConfig)) {
this._dateConfig = dateConfig;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
this._dateFormat = this.showTime ? this._dateConfig.format.time : this._dateConfig.format.date;
}
get dateConfig() {
return this._dateConfig;
}
set dateFormat(dateFormat) {
if (dateFormat && this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
this.writeModelValue({ selectedDate: this.selectedDate, reason: SelectDateChangeReason.format });
}
}
get dateFormat() {
return this._dateFormat || this.datePickerConfig.defaultFormat;
}
set maxDate(date) {
const parseDate = this.dateConverter.parse(date, this.dateFormat);
if (parseDate) {
this._maxDate = parseDate;
}
}
get maxDate() {
return this._maxDate;
}
set minDate(date) {
const parseDate = this.dateConverter.parse(date, this.dateFormat);
if (parseDate) {
this._minDate = parseDate;
}
}
get minDate() {
return this._minDate;
}
constructor(elementRef, viewContainerRef, componentFactoryResolver, renderer2, injector, datePickerConfig, i18n, builder, cdr, devConfigService, doc) {
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.componentFactoryResolver = componentFactoryResolver;
this.renderer2 = renderer2;
this.injector = injector;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.builder = builder;
this.cdr = cdr;
this.devConfigService = devConfigService;
this.doc = doc;
this.mode = 'date';
this.yearNumber = 12;
this.direction = 'down';
this.autoOpen = false;
this.showAnimation = false;
this.selectedDateChange = new EventEmitter();
this._isOpen = false;
this.onChange = (_) => null;
this.onTouched = () => null;
this.onDocumentClick = ($event) => {
if (this.elementRef.nativeElement !== $event.target) {
this.hide();
this.cdr.markForCheck();
}
};
this._dateConfig = datePickerConfig.dateConfig;
this.dateConverter = datePickerConfig.dateConfig.dateConverter || new DefaultDateConverter();
this.selectedDate = null;
const factory = this.componentFactoryResolver.resolveComponentFactory(DatepickerComponent);
this.cmpRef = this.viewContainerRef.createComponent(factory, this.viewContainerRef.length, this.injector);
this.setI18nText();
this.document = this.doc;
}
onBlur($event) {
this.onTouched();
const value = this.elementRef.nativeElement.value;
if (!this.validateDate(value)) {
this.resetValue();
}
}
checkDateConfig(dateConfig) {
if (!dateConfig) {
return false;
}
if (typeof dateConfig.timePicker !== 'boolean' || !dateConfig.max || !dateConfig.min || !dateConfig.format) {
return false;
}
return true;
}
ngOnInit() {
this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0);
this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59);
const target = this.cmpRef.location.nativeElement;
this.applyPopupStyling(target);
const component = this.cmpRef.instance;
component.dateFormat = this.dateFormat;
this.renderer2.setStyle(target, 'display', 'none');
component.writeValue(this.selectedDate);
this.fillPopupData();
component.ngOnInit();
component.registerOnChange((selectedDateObj) => {
this.writeValue(selectedDateObj);
this.onChange(selectedDateObj.selectedDate);
});
component.selectedDateChange.subscribe((arg) => {
if ((arg.reason === SelectDateChangeReason.date && !this.showTime) || arg.reason === SelectDateChangeReason.button) {
this.hide();
}
});
if (this.autoOpen) {
this.show();
}
this.valueChanges = this.registerInputEvent();
this.userInputSubscription = this.valueChanges.subscribe((source) => this.transUserInputToDatepicker(source));
}
writeValue(obj) {
let curDate;
if (obj && typeof obj === 'object' && Object.prototype.hasOwnProperty.call(obj, 'selectedDate')) {
curDate = obj.selectedDate;
}
else {
curDate = obj;
}
this.selectedDate = curDate ? this.dateConverter.parse(curDate, this.dateFormat) : null;
this.writeModelValue(obj);
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
registerInputEvent() {
return fromEvent(this.elementRef.nativeElement, 'keyup').pipe(map((e) => e.target.value), filter(() => !this.disabled), debounceTime(300));
}
setI18nText() {
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nLocale = data.locale;
});
}
applyPopupStyling(nativeElement) {
this.renderer2.addClass(nativeElement, 'devui-dropdown-menu');
this.renderer2.setStyle(nativeElement, 'padding', '0px');
this.renderer2.setStyle(nativeElement, 'left', '-1px');
this.renderer2.setStyle(nativeElement, 'top', 'calc(100% + 1px)');
if (this.direction === 'up') {
this.renderer2.setStyle(nativeElement, 'top', 'auto');
this.renderer2.setStyle(nativeElement, 'bottom', 'calc(100% + 1px)');
}
}
hide() {
const playAnimation = this.isOpen !== false;
this.isOpen = false;
if (playAnimation) {
this.playAnimation();
}
}
writeModelValue(selectDateObj) {
let selectDate;
let dateReason = SelectDateChangeReason.time;
if (selectDateObj && typeof selectDateObj === 'object' && Object.prototype.hasOwnProperty.call(selectDateObj, 'selectedDate')) {
selectDate = selectDateObj.selectedDate;
dateReason = selectDateObj.reason;
}
else {
selectDate = selectDateObj;
}
if (selectDate) {
selectDate = new Date(selectDate);
}
else {
selectDate = null;
}
const value = selectDate ? this.dateConverter.format(selectDate, this.dateFormat, this.locale || this.i18nLocale) : '';
this.renderer2.setProperty(this.elementRef.nativeElement, 'value', value);
if (this.isOpen) {
this.cmpRef.instance.writeValue(this.selectedDate);
}
if (selectDateObj && typeof selectDateObj === 'object' && Object.prototype.hasOwnProperty.call(selectDateObj, 'selectedDate')) {
this.selectedDateChange.emit({
reason: dateReason,
selectedDate: this.selectedDate,
});
this.onTouched();
}
}
show() {
const component = this.cmpRef.instance;
component.writeValue(this.selectedDate);
this.fillPopupData();
const playAnimation = this.isOpen !== true;
this.isOpen = true;
if (playAnimation) {
setTimeout(() => {
this.playAnimation();
});
}
}
toggle(clickShow) {
if (clickShow === undefined) {
if (this.isOpen) {
this.hide();
}
else {
this.show();
}
}
else {
if (clickShow) {
this.show();
}
else {
this.hide();
}
}
}
fillPopupData() {
[
'showTime',
'maxDate',
'minDate',
'cssClass',
'disabled',
'dateConverter',
'locale',
'dateFormat',
'yearNumber',
'dateConfig',
'mode',
'customViewTemplate',
].forEach((key) => {
if (this[key] !== undefined) {
this.cmpRef.instance[key] = this[key];
}
});
}
clearAll(reason) {
if (this.disabled) {
return;
}
this.onTouched();
this.cmpRef.instance.clearAll(reason);
}
popIn(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%', display: 'block' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_OUT}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%', display: 'block' })),
];
case 'bottom':
default:
return [
style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%', display: 'block' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_OUT}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%', display: 'block' })),
];
}
}
popOut(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%', display: 'block' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%', display: 'block' })),
];
case 'bottom':
default:
return [
style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%', display: 'block' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%', display: 'block' })),
];
}
}
playAnimation() {
if (this.player) {
this.player.destroy();
}
let direction = '';
switch (this.direction) {
case 'down':
direction = 'bottom';
break;
case 'up':
direction = 'top';
break;
default:
direction = 'bottom';
}
if (this.showAnimation) {
const metadata = this.isOpen ? this.popIn(direction) : this.popOut(direction);
const factory = this.builder.build(metadata);
this.player = factory.create(this.cmpRef.location.nativeElement);
this.renderer2.setStyle(this.cmpRef.location.nativeElement, 'display', 'block');
this.player.onDone(() => {
if (!this.isOpen) {
const targetElement = this.cmpRef.location.nativeElement;
this.renderer2.setStyle(targetElement, 'display', 'none');
}
});
this.player.play();
}
else {
this.renderer2.setStyle(this.cmpRef.location.nativeElement, 'display', this.isOpen ? 'block' : 'none');
}
}
transUserInputToDatepicker(value) {
if (!value && !this.selectedDate) {
return;
}
if (!value) {
this.clearAll();
return;
}
const valueDate = new Date(value);
const valueFormat = valueDate instanceof Date &&
!isNaN(valueDate.getTime()) &&
this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale);
if (new Date(valueFormat).getTime() === new Date(this.selectedDate).getTime() || !this.validateDate(value)) {
return;
}
if (this.showTime || this.disabled) {
this.resetValue();
}
else {
this.cmpRef.instance.chooseDate(value);
}
}
validateDate(value) {
const valueDate = new Date(value);
const valueFormat = valueDate && !isNaN(valueDate.getTime()) && this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale);
if (!valueDate ||
value !== valueFormat ||
(value === valueFormat && (valueDate.getTime() < this.minDate.getTime() || valueDate.getTime() > this.maxDate.getTime()))) {
return false;
}
else {
return true;
}
}
resetValue() {
const resDate = this.selectedDate ? this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale) : '';
this.elementRef.nativeElement.value = resDate;
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
if (this.userInputSubscription) {
this.userInputSubscription.unsubscribe();
}
this.document.removeEventListener('click', this.onDocumentClick);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerDirective, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i0.Renderer2 }, { token: i0.Injector }, { token: i1.DatePickerConfigService }, { token: i2.I18nService }, { token: i3.AnimationBuilder }, { token: i0.ChangeDetectorRef }, { token: i4.DevConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DatepickerDirective, selector: "[dDatepicker]:not([appendToBody])", inputs: { locale: "locale", cssClass: "cssClass", disabled: "disabled", mode: "mode", dateConverter: "dateConverter", direction: "direction", customViewTemplate: "customViewTemplate", autoOpen: "autoOpen", showAnimation: "showAnimation", showTime: "showTime", dateConfig: "dateConfig", dateFormat: "dateFormat", maxDate: "maxDate", minDate: "minDate" }, outputs: { selectedDateChange: "selectedDateChange" }, host: { listeners: { "blur": "onBlur($event)" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DatepickerDirective),
multi: true,
},
], exportAs: ["datepicker"], ngImport: i0 }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], DatepickerDirective.prototype, "showAnimation", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerDirective, decorators: [{
type: Directive,
args: [{
selector: '[dDatepicker]:not([appendToBody])',
exportAs: 'datepicker',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DatepickerDirective),
multi: true,
},
],
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i0.Renderer2 }, { type: i0.Injector }, { type: i1.DatePickerConfigService }, { type: i2.I18nService }, { type: i3.AnimationBuilder }, { type: i0.ChangeDetectorRef }, { type: i4.DevConfigService }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { locale: [{
type: Input
}], cssClass: [{
type: Input
}], disabled: [{
type: Input
}], mode: [{
type: Input
}], dateConverter: [{
type: Input
}], direction: [{
type: Input
}], customViewTemplate: [{
type: Input
}], autoOpen: [{
type: Input
}], showAnimation: [{
type: Input
}], selectedDateChange: [{
type: Output
}], showTime: [{
type: Input
}], dateConfig: [{
type: Input
}], dateFormat: [{
type: Input
}], maxDate: [{
type: Input
}], minDate: [{
type: Input
}], onBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyL2RhdGVwaWNrZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFzQyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQix3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGlCQUFpQixFQUVqQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsU0FBUyxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQTZCLHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7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QUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDaUIsYUFBYTtzQkFBbkMsS0FBSztnQkFDSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBbUNNLFFBQVE7c0JBQXBCLEtBQUs7Z0JBUU8sVUFBVTtzQkFBdEIsS0FBSztnQkFhTyxVQUFVO3NCQUF0QixLQUFLO2dCQVdPLE9BQU87c0JBQW5CLEtBQUs7Z0JBV08sT0FBTztzQkFBbkIsS0FBSztnQkFrQ04sTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIEFuaW1hdGlvbkJ1aWxkZXIsIEFuaW1hdGlvbk1ldGFkYXRhLCBBbmltYXRpb25QbGF5ZXIsIHN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHtcclxuICBhZGRDbGFzc1RvT3JpZ2luLFxyXG4gIEFuaW1hdGlvbkN1cnZlcyxcclxuICBBbmltYXRpb25EdXJhdGlvbixcclxuICBEYXRlQ29udmVydGVyLFxyXG4gIERlZmF1bHREYXRlQ29udmVydGVyLFxyXG4gIERldkNvbmZpZ1NlcnZpY2UsXHJcbiAgcmVtb3ZlQ2xhc3NGcm9tT3JpZ2luLFxyXG4gIFdpdGhDb25maWcsXHJcbn0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZWxlY3REYXRlQ2hhbmdlRXZlbnRBcmdzLCBTZWxlY3REYXRlQ2hhbmdlUmVhc29uIH0gZnJvbSAnLi9kYXRlLWNoYW5nZS1ldmVudC1hcmdzLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckNvbmZpZ1NlcnZpY2UgYXMgRGF0ZVBpY2tlckNvbmZpZyB9IGZyb20gJy4vZGF0ZS1waWNrZXIuY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRGF0ZXBpY2tlcl06bm90KFthcHBlbmRUb0JvZHldKScsXHJcbiAgZXhwb3J0QXM6ICdkYXRlcGlja2VyJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJEaXJlY3RpdmUpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgbW9kZTogJ3llYXInIHwgJ21vbnRoJyB8ICdkYXRlJyA9ICdkYXRlJztcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIHllYXJOdW1iZXIgPSAxMjtcclxuICBASW5wdXQoKSBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicgPSAnZG93bic7XHJcbiAgQElucHV0KCkgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGF1dG9PcGVuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBzaG93QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBzZWxlY3RlZERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XHJcbiAgX2RhdGVDb25maWc6IGFueTtcclxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgX3Nob3dUaW1lOiBib29sZWFuO1xyXG4gIHByaXZhdGUgY21wUmVmOiBDb21wb25lbnRSZWY8RGF0ZXBpY2tlckNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBwbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlczogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHByaXZhdGUgdXNlcklucHV0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuICBkb2N1bWVudDogRG9jdW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiBudWxsO1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4gbnVsbDtcclxuXHJcbiAgc2V0IGlzT3Blbih2YWwpIHtcclxuICAgIHRoaXMuX2lzT3BlbiA9IHZhbDtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgYWRkQ2xhc3NUb09yaWdpbih0aGlzLmVsZW1lbnRSZWYpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlbW92ZUNsYXNzRnJvbU9yaWdpbih0aGlzLmVsZW1lbnRSZWYpO1xyXG4gICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgaXNPcGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBzaG93VGltZShzaG93VGltZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd1RpbWUgPSBzaG93VGltZTtcclxuICB9XHJcblxyXG4gIGdldCBzaG93VGltZSgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdGhpcy5fc2hvd1RpbWUgPT09ICdib29sZWFuJyA/IHRoaXMuX3Nob3dUaW1lIDogdGhpcy5kYXRlQ29uZmlnLnRpbWVQaWNrZXI7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUNvbmZpZyhkYXRlQ29uZmlnOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrRGF0ZUNvbmZpZyhkYXRlQ29uZmlnKSkge1xyXG4gICAgICB0aGlzLl9kYXRlQ29uZmlnID0gZGF0ZUNvbmZpZztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSB0aGlzLmRhdGVQaWNrZXJDb25maWcuZGF0ZUNvbmZpZztcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGVGb3JtYXQgPSB0aGlzLnNob3dUaW1lID8gdGhpcy5fZGF0ZUNvbmZpZy5mb3JtYXQudGltZSA6IHRoaXMuX2RhdGVDb25maWcuZm9ybWF0LmRhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUNvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGVGb3JtYXQoZGF0ZUZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZGF0ZUZvcm1hdCAmJiB0aGlzLl9kYXRlRm9ybWF0ICE9PSBkYXRlRm9ybWF0KSB7XHJcbiAgICAgIHRoaXMuX2RhdGVGb3JtYXQgPSBkYXRlRm9ybWF0O1xyXG4gICAgICB0aGlzLndyaXRlTW9kZWxWYWx1ZSh7IHNlbGVjdGVkRGF0ZTogdGhpcy5zZWxlY3RlZERhdGUsIHJlYXNvbjogU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5mb3JtYXQgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0IHx8IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kZWZhdWx0Rm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCk7XHJcbiAgICBpZiAocGFyc2VEYXRlKSB7XHJcbiAgICAgIHRoaXMuX21heERhdGUgPSBwYXJzZURhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4RGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1pbkRhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCk7XHJcbiAgICBpZiAocGFyc2VEYXRlKSB7XHJcbiAgICAgIHRoaXMuX21pbkRhdGUgPSBwYXJzZURhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbWluRGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBEYXRlUGlja2VyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZGV2Q29uZmlnU2VydmljZTogRGV2Q29uZmlnU2VydmljZSxcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnlcclxuICApIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWc7XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWcuZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEYXRlcGlja2VyQ29tcG9uZW50KTtcclxuICAgIHRoaXMuY21wUmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB0aGlzLnZpZXdDb250YWluZXJSZWYubGVuZ3RoLCB0aGlzLmluamVjdG9yKTtcclxuICAgIHRoaXMuc2V0STE4blRleHQoKTtcclxuICAgIHRoaXMuZG9jdW1lbnQgPSB0aGlzLmRvYztcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxyXG4gIG9uQmx1cigkZXZlbnQpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0ZSh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5yZXNldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0RhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAoIWRhdGVDb25maWcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBkYXRlQ29uZmlnLnRpbWVQaWNrZXIgIT09ICdib29sZWFuJyB8fCAhZGF0ZUNvbmZpZy5tYXggfHwgIWRhdGVDb25maWcubWluIHx8ICFkYXRlQ29uZmlnLmZvcm1hdCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMubWluRGF0ZSA/IG5ldyBEYXRlKHRoaXMubWluRGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLmRhdGVDb25maWcubWluLCAwLCAxLCAwLCAwLCAwKTtcclxuICAgIHRoaXMuX21heERhdGUgPSB0aGlzLm1heERhdGUgPyBuZXcgRGF0ZSh0aGlzLm1heERhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1heCwgMTEsIDMxLCAyMywgNTksIDU5KTtcclxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmFwcGx5UG9wdXBTdHlsaW5nKHRhcmdldCk7XHJcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNtcFJlZi5pbnN0YW5jZTtcclxuICAgIGNvbXBvbmVudC5kYXRlRm9ybWF0ID0gdGhpcy5kYXRlRm9ybWF0O1xyXG4gICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUodGFyZ2V0LCAnZGlzcGxheScsICdub25lJyk7XHJcbiAgICBjb21wb25lbnQud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLmZpbGxQb3B1cERhdGEoKTtcclxuICAgIGNvbXBvbmVudC5uZ09uSW5pdCgpO1xyXG5cclxuICAgIGNvbXBvbmVudC5yZWdpc3Rlck9uQ2hhbmdlKChzZWxlY3RlZERhdGVPYmopID0+IHtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHNlbGVjdGVkRGF0ZU9iaik7XHJcbiAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWREYXRlT2JqLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb21wb25lbnQuc2VsZWN0ZWREYXRlQ2hhbmdlLnN1YnNjcmliZSgoYXJnOiBTZWxlY3REYXRlQ2hhbmdlRXZlbnRBcmdzKSA9PiB7XHJcbiAgICAgIGlmICgoYXJnLnJlYXNvbiA9PT0gU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5kYXRlICYmICF0aGlzLnNob3dUaW1lKSB8fCBhcmcucmVhc29uID09PSBTZWxlY3REYXRlQ2hhbmdlUmVhc29uLmJ1dHRvbikge1xyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvT3Blbikge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICAgIHRoaXMudmFsdWVDaGFuZ2VzID0gdGhpcy5yZWdpc3RlcklucHV0RXZlbnQoKTtcclxuICAgIHRoaXMudXNlcklucHV0U3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChzb3VyY2UpID0+IHRoaXMudHJhbnNVc2VySW5wdXRUb0RhdGVwaWNrZXIoc291cmNlKSk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgY3VyRGF0ZTtcclxuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb