UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

89 lines 18.6 kB
import { CommonModule, DatePipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, createComponent, } from '@angular/core'; import { DokuDatePicker } from '../../date-picker'; import { DokuDatePickerBase } from '../../date-picker/base/date-picker-base.component'; import { DOKU_DATE_PICKER_STRICT_TIME } from '../../date-picker/base/date-picker.token'; import { DOKU_FORM_FIELD_ACCESSOR } from '../../form-field'; import { DokuTimePickerCommon } from '../common/time-picker/time-picker.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class DokuDateTimePicker extends DokuDatePicker { constructor() { super(...arguments); /** * Placeholder of the date picker input. * * @default 'dd/mm/yyyy hh:mm' */ this.placeholder = 'dd/mm/yyyy hh:mm'; /** * Date format that will be used for formatting displayed value in the input field. * It follows Angular DatePipe's format options. * * @default 'dd/MM/yyyy HH:mm' */ this.dateFormat = 'dd/MM/yyyy HH:mm'; this.closeOnDateClick = false; } createComponentRef(props) { const timeRef = this.createComponentTimeRef(props.elementInjector); const ref = createComponent(DokuDatePickerBase, { environmentInjector: this.envInjector, elementInjector: props.elementInjector, projectableNodes: [[timeRef.location.nativeElement]], }); ref.setInput('value', this.value); ref.setInput('minDate', this.minDate); ref.setInput('maxDate', this.maxDate); const timeValueChangeListener = timeRef.instance.timeChange.subscribe((value) => { ref.setInput('value', value); }); const valueChangeListener = ref.instance.valueChange.subscribe((value) => { timeRef.setInput('value', value.start); timeRef.setInput('minTime', this.minDate); timeRef.setInput('maxTime', this.maxDate); }); timeRef.onDestroy(() => { timeValueChangeListener.unsubscribe(); }); ref.onDestroy(() => { valueChangeListener.unsubscribe(); timeRef.destroy(); }); return ref; } createComponentTimeRef(elementInjector) { const timeRef = createComponent(DokuTimePickerCommon, { environmentInjector: this.envInjector, elementInjector: elementInjector, }); timeRef.setInput('value', this.value); timeRef.setInput('minTime', this.minDate); timeRef.setInput('maxTime', this.maxDate); timeRef.setInput('disabled', this.disabled); timeRef.setInput('labelSelectTime', this.labelSelectTime); this.appRef.attachView(timeRef.hostView); return timeRef; } } DokuDateTimePicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuDateTimePicker, deps: null, target: i0.ɵɵFactoryTarget.Component }); DokuDateTimePicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuDateTimePicker, isStandalone: true, selector: "doku-date-time-picker", inputs: { labelSelectTime: "labelSelectTime", placeholder: "placeholder", dateFormat: "dateFormat" }, providers: [ DatePipe, { provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuDateTimePicker }, { provide: DOKU_DATE_PICKER_STRICT_TIME, useValue: true }, ], exportAs: ["dokuDateTimePicker"], usesInheritance: true, ngImport: i0, template: "<span *ngIf=\"!formattedValue\" class=\"d-date-picker-placeholder\">\n {{ placeholder }}\n</span>\n\n<span *ngIf=\"formattedValue\" class=\"d-date-picker-value\">\n {{ formattedValue }}\n</span>\n\n<span class=\"icon-calendar\">\n <ng-container *ngTemplateOutlet=\"iconCalendar\"></ng-container>\n</span>\n\n<ng-template #iconCalendar>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 5H5C4.44772 5 4 5.44772 4 6V17C4 17.5523 4.44772 18 5 18H19C19.5523 18 20 17.5523 20 17V6C20 5.44772 19.5523 5 19 5Z\"\n stroke=\"currentColor\"\n />\n <path d=\"M4 7.94336H20\" stroke=\"currentColor\" />\n <ellipse cx=\"7.69213\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"7.69213\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"10.6462\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"10.6462\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"13.5998\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"13.5998\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"16.554\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"16.554\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n </svg>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuDateTimePicker, decorators: [{ type: Component, args: [{ selector: 'doku-date-time-picker', exportAs: 'dokuDateTimePicker', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ DatePipe, { provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuDateTimePicker }, { provide: DOKU_DATE_PICKER_STRICT_TIME, useValue: true }, ], template: "<span *ngIf=\"!formattedValue\" class=\"d-date-picker-placeholder\">\n {{ placeholder }}\n</span>\n\n<span *ngIf=\"formattedValue\" class=\"d-date-picker-value\">\n {{ formattedValue }}\n</span>\n\n<span class=\"icon-calendar\">\n <ng-container *ngTemplateOutlet=\"iconCalendar\"></ng-container>\n</span>\n\n<ng-template #iconCalendar>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 5H5C4.44772 5 4 5.44772 4 6V17C4 17.5523 4.44772 18 5 18H19C19.5523 18 20 17.5523 20 17V6C20 5.44772 19.5523 5 19 5Z\"\n stroke=\"currentColor\"\n />\n <path d=\"M4 7.94336H20\" stroke=\"currentColor\" />\n <ellipse cx=\"7.69213\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"7.69213\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"10.6462\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"10.6462\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"13.5998\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"13.5998\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"16.554\" cy=\"11.3774\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n <ellipse cx=\"16.554\" cy=\"14.3207\" rx=\"0.984615\" ry=\"0.981132\" fill=\"currentColor\" />\n </svg>\n</ng-template>\n" }] }], propDecorators: { labelSelectTime: [{ type: Input }], placeholder: [{ type: Input }], dateFormat: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1mbG9hdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLWZsb2F0L2RhdGUtdGltZS1waWNrZXItZmxvYXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLWZsb2F0L2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7O0FBZ0JuRixNQUFNLE9BQU8sa0JBQW1CLFNBQVEsY0FBYztJQWR0RDs7UUFpQkU7Ozs7V0FJRztRQUNlLGdCQUFXLEdBQUcsa0JBQWtCLENBQUM7UUFFbkQ7Ozs7O1dBS0c7UUFDZSxlQUFVLEdBQUcsa0JBQWtCLENBQUM7UUFFekMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0tBb0RuQztJQWxEb0Isa0JBQWtCLENBQUMsS0FFckM7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QUU7S0FDMUQsbUZDNUJILHEvQ0E2QkEsMkNEVFksWUFBWTsyRkFVWCxrQkFBa0I7a0JBZDlCLFNBQVM7K0JBQ0UsdUJBQXVCLFlBQ3ZCLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsaUJBRVIsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVCxRQUFRO3dCQUNSLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFdBQVcsb0JBQW9CLEVBQUU7d0JBQ3RFLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7cUJBQzFEOzhCQUdRLGVBQWU7c0JBQXZCLEtBQUs7Z0JBT1ksV0FBVztzQkFBNUIsS0FBSztnQkFRWSxVQUFVO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNyZWF0ZUNvbXBvbmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb2t1RGF0ZVBpY2tlciB9IGZyb20gJy4uLy4uL2RhdGUtcGlja2VyJztcbmltcG9ydCB7IERva3VEYXRlUGlja2VyQmFzZSB9IGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2Jhc2UvZGF0ZS1waWNrZXItYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRE9LVV9EQVRFX1BJQ0tFUl9TVFJJQ1RfVElNRSB9IGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2Jhc2UvZGF0ZS1waWNrZXIudG9rZW4nO1xuaW1wb3J0IHsgRE9LVV9GT1JNX0ZJRUxEX0FDQ0VTU09SIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEb2t1VGltZVBpY2tlckNvbW1vbiB9IGZyb20gJy4uL2NvbW1vbi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkb2t1LWRhdGUtdGltZS1waWNrZXInLFxuICBleHBvcnRBczogJ2Rva3VEYXRlVGltZVBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4uLy4uL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLWZsb2F0L2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIERhdGVQaXBlLFxuICAgIHsgcHJvdmlkZTogRE9LVV9GT1JNX0ZJRUxEX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogRG9rdURhdGVUaW1lUGlja2VyIH0sXG4gICAgeyBwcm92aWRlOiBET0tVX0RBVEVfUElDS0VSX1NUUklDVF9USU1FLCB1c2VWYWx1ZTogdHJ1ZSB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1RGF0ZVRpbWVQaWNrZXIgZXh0ZW5kcyBEb2t1RGF0ZVBpY2tlciB7XG4gIEBJbnB1dCgpIGxhYmVsU2VsZWN0VGltZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGxhY2Vob2xkZXIgb2YgdGhlIGRhdGUgcGlja2VyIGlucHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnZGQvbW0veXl5eSBoaDptbSdcbiAgICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHBsYWNlaG9sZGVyID0gJ2RkL21tL3l5eXkgaGg6bW0nO1xuXG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZm9ybWF0dGluZyBkaXNwbGF5ZWQgdmFsdWUgaW4gdGhlIGlucHV0IGZpZWxkLlxuICAgKiBJdCBmb2xsb3dzIEFuZ3VsYXIgRGF0ZVBpcGUncyBmb3JtYXQgb3B0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2RkL01NL3l5eXkgSEg6bW0nXG4gICAqL1xuICBASW5wdXQoKSBvdmVycmlkZSBkYXRlRm9ybWF0ID0gJ2RkL01NL3l5eXkgSEg6bW0nO1xuXG4gIG92ZXJyaWRlIGNsb3NlT25EYXRlQ2xpY2sgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlQ29tcG9uZW50UmVmKHByb3BzOiB7XG4gICAgZWxlbWVudEluamVjdG9yOiBJbmplY3RvcjtcbiAgfSk6IENvbXBvbmVudFJlZjxEb2t1RGF0ZVBpY2tlckJhc2U+IHtcbiAgICBjb25zdCB0aW1lUmVmID0gdGhpcy5jcmVhdGVDb21wb25lbnRUaW1lUmVmKHByb3BzLmVsZW1lbnRJbmplY3Rvcik7XG5cbiAgICBjb25zdCByZWYgPSBjcmVhdGVDb21wb25lbnQoRG9rdURhdGVQaWNrZXJCYXNlLCB7XG4gICAgICBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudkluamVjdG9yLFxuICAgICAgZWxlbWVudEluamVjdG9yOiBwcm9wcy5lbGVtZW50SW5qZWN0b3IsXG4gICAgICBwcm9qZWN0YWJsZU5vZGVzOiBbW3RpbWVSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudF1dLFxuICAgIH0pO1xuICAgIHJlZi5zZXRJbnB1dCgndmFsdWUnLCB0aGlzLnZhbHVlKTtcbiAgICByZWYuc2V0SW5wdXQoJ21pbkRhdGUnLCB0aGlzLm1pbkRhdGUpO1xuICAgIHJlZi5zZXRJbnB1dCgnbWF4RGF0ZScsIHRoaXMubWF4RGF0ZSk7XG5cbiAgICBjb25zdCB0aW1lVmFsdWVDaGFuZ2VMaXN0ZW5lciA9IHRpbWVSZWYuaW5zdGFuY2UudGltZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICByZWYuc2V0SW5wdXQoJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsdWVDaGFuZ2VMaXN0ZW5lciA9IHJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICB0aW1lUmVmLnNldElucHV0KCd2YWx1ZScsIHZhbHVlLnN0YXJ0KTtcbiAgICAgIHRpbWVSZWYuc2V0SW5wdXQoJ21pblRpbWUnLCB0aGlzLm1pbkRhdGUpO1xuICAgICAgdGltZVJlZi5zZXRJbnB1dCgnbWF4VGltZScsIHRoaXMubWF4RGF0ZSk7XG4gICAgfSk7XG5cbiAgICB0aW1lUmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aW1lVmFsdWVDaGFuZ2VMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgcmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB2YWx1ZUNoYW5nZUxpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aW1lUmVmLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZWY7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudFRpbWVSZWYoZWxlbWVudEluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIGNvbnN0IHRpbWVSZWYgPSBjcmVhdGVDb21wb25lbnQoRG9rdVRpbWVQaWNrZXJDb21tb24sIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBlbGVtZW50SW5qZWN0b3I6IGVsZW1lbnRJbmplY3RvcixcbiAgICB9KTtcbiAgICB0aW1lUmVmLnNldElucHV0KCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuICAgIHRpbWVSZWYuc2V0SW5wdXQoJ21pblRpbWUnLCB0aGlzLm1pbkRhdGUpO1xuICAgIHRpbWVSZWYuc2V0SW5wdXQoJ21heFRpbWUnLCB0aGlzLm1heERhdGUpO1xuICAgIHRpbWVSZWYuc2V0SW5wdXQoJ2Rpc2FibGVkJywgdGhpcy5kaXNhYmxlZCk7XG4gICAgdGltZVJlZi5zZXRJbnB1dCgnbGFiZWxTZWxlY3RUaW1lJywgdGhpcy5sYWJlbFNlbGVjdFRpbWUpO1xuXG4gICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh0aW1lUmVmLmhvc3RWaWV3KTtcbiAgICByZXR1cm4gdGltZVJlZjtcbiAgfVxufVxuIiwiPHNwYW4gKm5nSWY9XCIhZm9ybWF0dGVkVmFsdWVcIiBjbGFzcz1cImQtZGF0ZS1waWNrZXItcGxhY2Vob2xkZXJcIj5cbiAge3sgcGxhY2Vob2xkZXIgfX1cbjwvc3Bhbj5cblxuPHNwYW4gKm5nSWY9XCJmb3JtYXR0ZWRWYWx1ZVwiIGNsYXNzPVwiZC1kYXRlLXBpY2tlci12YWx1ZVwiPlxuICB7eyBmb3JtYXR0ZWRWYWx1ZSB9fVxuPC9zcGFuPlxuXG48c3BhbiBjbGFzcz1cImljb24tY2FsZW5kYXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25DYWxlbmRhclwiPjwvbmctY29udGFpbmVyPlxuPC9zcGFuPlxuXG48bmctdGVtcGxhdGUgI2ljb25DYWxlbmRhcj5cbiAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgPHBhdGhcbiAgICAgIGQ9XCJNMTkgNUg1QzQuNDQ3NzIgNSA0IDUuNDQ3NzIgNCA2VjE3QzQgMTcuNTUyMyA0LjQ0NzcyIDE4IDUgMThIMTlDMTkuNTUyMyAxOCAyMCAxNy41NTIzIDIwIDE3VjZDMjAgNS40NDc3MiAxOS41NTIzIDUgMTkgNVpcIlxuICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAvPlxuICAgIDxwYXRoIGQ9XCJNNCA3Ljk0MzM2SDIwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICA8ZWxsaXBzZSBjeD1cIjcuNjkyMTNcIiBjeT1cIjExLjM3NzRcIiByeD1cIjAuOTg0NjE1XCIgcnk9XCIwLjk4MTEzMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgIDxlbGxpcHNlIGN4PVwiNy42OTIxM1wiIGN5PVwiMTQuMzIwN1wiIHJ4PVwiMC45ODQ2MTVcIiByeT1cIjAuOTgxMTMyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgPGVsbGlwc2UgY3g9XCIxMC42NDYyXCIgY3k9XCIxMS4zNzc0XCIgcng9XCIwLjk4NDYxNVwiIHJ5PVwiMC45ODExMzJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICA8ZWxsaXBzZSBjeD1cIjEwLjY0NjJcIiBjeT1cIjE0LjMyMDdcIiByeD1cIjAuOTg0NjE1XCIgcnk9XCIwLjk4MTEzMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgIDxlbGxpcHNlIGN4PVwiMTMuNTk5OFwiIGN5PVwiMTEuMzc3NFwiIHJ4PVwiMC45ODQ2MTVcIiByeT1cIjAuOTgxMTMyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgPGVsbGlwc2UgY3g9XCIxMy41OTk4XCIgY3k9XCIxNC4zMjA3XCIgcng9XCIwLjk4NDYxNVwiIHJ5PVwiMC45ODExMzJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICA8ZWxsaXBzZSBjeD1cIjE2LjU1NFwiIGN5PVwiMTEuMzc3NFwiIHJ4PVwiMC45ODQ2MTVcIiByeT1cIjAuOTgxMTMyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgPGVsbGlwc2UgY3g9XCIxNi41NTRcIiBjeT1cIjE0LjMyMDdcIiByeD1cIjAuOTg0NjE1XCIgcnk9XCIwLjk4MTEzMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=