UNPKG

angular-mydatepicker

Version:
896 lines 87.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, ElementRef, ViewContainerRef, Renderer2, ChangeDetectorRef, ComponentFactoryResolver, forwardRef, EventEmitter, Output, HostListener } from "@angular/core"; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from "@angular/forms"; import { CalendarComponent } from "./components/calendar/calendar.component"; import { LocaleService } from "./services/angular-mydatepicker.locale.service"; import { UtilService } from "./services/angular-mydatepicker.util.service"; import { DefaultConfigService } from "./services/angular-mydatepicker.config.service"; import { CalToggle } from "./enums/cal-toggle.enum"; import { Year } from "./enums/year.enum"; import { KeyCode } from "./enums/key-code.enum"; import { CalAnimation } from "./enums/cal-animation.enum"; import { KEYUP, BLUR, EMPTY_STR, DISABLED, CLICK, BODY, VALUE, PREVENT_CLOSE_TIMEOUT, OPTIONS, DEFAULT_MONTH, LOCALE, OBJECT, PX, INNER_HTML, ANIMATION_END, ANIMATION_TIMEOUT } from "./constants/constants"; /** @type {?} */ const NGX_DP_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => AngularMyDatePickerDirective)), multi: true }; /** @type {?} */ const NGX_DP_VALIDATORS = { provide: NG_VALIDATORS, useExisting: forwardRef((/** * @return {?} */ () => AngularMyDatePickerDirective)), multi: true }; export class AngularMyDatePickerDirective { /** * @param {?} localeService * @param {?} utilService * @param {?} vcRef * @param {?} cfr * @param {?} renderer * @param {?} cdr * @param {?} elem * @param {?} config */ constructor(localeService, utilService, vcRef, cfr, renderer, cdr, elem, config) { this.localeService = localeService; this.utilService = utilService; this.vcRef = vcRef; this.cfr = cfr; this.renderer = renderer; this.cdr = cdr; this.elem = elem; this.config = config; this.defaultMonth = { defMonth: EMPTY_STR, overrideSelection: false }; this.dateChanged = new EventEmitter(); this.inputFieldChanged = new EventEmitter(); this.calendarViewChanged = new EventEmitter(); this.calendarToggle = new EventEmitter(); this.rangeDateSelection = new EventEmitter(); this.viewActivated = new EventEmitter(); this.cRef = null; this.hostText = EMPTY_STR; this.preventClose = false; this.disabled = false; this.selectedValue = null; this.onChangeCb = (/** * @return {?} */ () => { }); this.onTouchedCb = (/** * @return {?} */ () => { }); this.onClickWrapper = (/** * @param {?} event * @return {?} */ (event) => this.onClick(event)); this.onAnimateWrapper = (/** * @param {?} reason * @return {?} */ (reason) => this.animationEnd(reason)); this.opts = this.config.getDefaultConfig(); this.parseOptions(this.opts); } /** * @param {?} event * @return {?} */ onKeyUp(event) { /** @type {?} */ const keyCode = this.utilService.getKeyCodeFromEvent(event); if (this.ignoreKeyPress(keyCode)) { return; } if (keyCode === KeyCode.esc) { this.closeSelector(CalToggle.CloseByEsc); } else { const { dateRange, dateFormat, monthLabels, dateRangeDatesDelimiter } = this.opts; /** @type {?} */ const value = this.getHostValue(); /** @type {?} */ let dateModel = null; /** @type {?} */ let valid = false; /** @type {?} */ let validateOpts = null; if (!dateRange) { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) }; /** @type {?} */ const date = this.utilService.isDateValid(value, this.opts, validateOpts); valid = this.utilService.isInitializedDate(date); if (valid) { dateModel = this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter); } } else { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) }; /** @type {?} */ const range = this.utilService.isDateValidDateRange(value, this.opts, validateOpts); const { begin, end } = range; valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end); if (valid) { dateModel = this.utilService.getDateModel(null, range, dateFormat, monthLabels, dateRangeDatesDelimiter); } } this.onChangeCb(dateModel); this.emitInputFieldChanged(value, valid); } } /** * @return {?} */ onBlur() { const { inputFieldValidation, dateRange, dateFormat, monthLabels, dateRangeDatesDelimiter, closeSelectorOnDateSelect } = this.opts; if (inputFieldValidation) { /** @type {?} */ const value = this.getHostValue(); /** @type {?} */ let valid = false; /** @type {?} */ let validateOpts = null; if (!dateRange) { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) }; /** @type {?} */ const date = this.utilService.isDateValid(value, this.opts, validateOpts); valid = this.utilService.isInitializedDate(date); if (valid && this.hostText !== value) { // Valid date /** @type {?} */ const dateModel = this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter); this.emitDateChanged(dateModel); this.updateModel(dateModel); if (closeSelectorOnDateSelect) { this.closeSelector(CalToggle.CloseByDateSel); } } } else { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) }; /** @type {?} */ const dateRange = this.utilService.isDateValidDateRange(value, this.opts, validateOpts); const { begin, end } = dateRange; valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end); if (valid && this.hostText !== value) { // Valid date range /** @type {?} */ const dateModel = this.utilService.getDateModel(null, dateRange, dateFormat, monthLabels, dateRangeDatesDelimiter); this.emitDateChanged(dateModel); this.updateModel(dateModel); if (closeSelectorOnDateSelect) { this.closeSelector(CalToggle.CloseByDateSel); } } } if (!valid && this.hostText !== value) { if (value === EMPTY_STR) { this.clearDate(); } else { this.onChangeCb(null); } } this.hostText = value; } this.onTouchedCb(); } /** * @private * @param {?} event * @return {?} */ onClick(event) { if (this.opts.closeSelectorOnDocumentClick && !this.preventClose && event.target && this.cRef && this.elem.nativeElement !== event.target && !this.cRef.location.nativeElement.contains(event.target) && !this.disabled) { this.closeSelector(CalToggle.CloseByOutClick); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.hasOwnProperty(LOCALE)) { this.setLocaleOptions(); } if (changes.hasOwnProperty(DEFAULT_MONTH)) { /** @type {?} */ let dm = changes[DEFAULT_MONTH].currentValue; if (typeof dm === OBJECT) { if (!dm.overrideSelection) { dm.overrideSelection = false; } } else { dm = { defMonth: dm, overrideSelection: false }; } this.defaultMonth = dm; } if (changes.hasOwnProperty(OPTIONS)) { this.parseOptions(changes[OPTIONS].currentValue); } if (this.cRef) { this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue()); } } /** * @return {?} */ ngOnDestroy() { this.closeCalendar(); } /** * @return {?} */ setLocaleOptions() { /** @type {?} */ const opts = this.localeService.getLocaleOptions(this.locale); Object.keys(opts).forEach((/** * @param {?} k * @return {?} */ (k) => { ((/** @type {?} */ (this.opts)))[k] = opts[k]; })); } /** * @param {?} opts * @return {?} */ parseOptions(opts) { if (opts) { Object.keys(opts).forEach((/** * @param {?} k * @return {?} */ (k) => { ((/** @type {?} */ (this.opts)))[k] = opts[k]; })); } const { minYear, maxYear, openSelectorTopOfInput, inline } = this.opts; if (minYear < Year.min) { this.opts.minYear = Year.min; } if (maxYear > Year.max) { this.opts.maxYear = Year.max; } if (openSelectorTopOfInput || inline) { this.opts.showSelectorArrow = false; } if (inline) { this.openCalendar(); } } /** * @param {?} value * @return {?} */ writeValue(value) { if (this.disabled) { return; } /** @type {?} */ let validateOpts = null; const { dateFormat, monthLabels, dateRangeDatesDelimiter, inline } = this.opts; if (!value) { this.setHostValue(EMPTY_STR); this.emitInputFieldChanged(EMPTY_STR, false); if (this.cRef) { this.cRef.instance.resetDateValue(); } } else if (!value.isRange && value.singleDate) { // single date let { date, jsDate } = value.singleDate; if (!date) { date = this.utilService.jsDateToMyDate(jsDate); } /** @type {?} */ const formatted = this.utilService.formatDate(date, dateFormat, monthLabels); validateOpts = { validateDisabledDates: false, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) }; /** @type {?} */ const valid = this.utilService.isInitializedDate(this.utilService.isDateValid(formatted, this.opts, validateOpts)); if (valid) { this.setHostValue(formatted); this.emitInputFieldChanged(formatted, valid); this.setSelectedValue(this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter)); if (this.cRef) { this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue()); } } } else if (value.isRange && value.dateRange) { // date range let { beginDate, beginJsDate, endDate, endJsDate } = value.dateRange; if (!beginDate || !endDate) { beginDate = this.utilService.jsDateToMyDate(beginJsDate); endDate = this.utilService.jsDateToMyDate(endJsDate); } /** @type {?} */ const formatted = this.utilService.formatDate(beginDate, dateFormat, monthLabels) + dateRangeDatesDelimiter + this.utilService.formatDate(endDate, dateFormat, monthLabels); validateOpts = { validateDisabledDates: false, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) }; const { begin, end } = this.utilService.isDateValidDateRange(formatted, this.opts, validateOpts); /** @type {?} */ const valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end); if (valid) { this.setHostValue(formatted); this.emitInputFieldChanged(formatted, valid); /** @type {?} */ const dateRange = { begin: beginDate, end: endDate }; this.setSelectedValue(this.utilService.getDateModel(null, dateRange, dateFormat, monthLabels, dateRangeDatesDelimiter)); if (this.cRef) { this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue()); } } } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChangeCb = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouchedCb = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; this.renderer.setProperty(this.elem.nativeElement, DISABLED, isDisabled); if (isDisabled) { this.closeCalendar(); } } /** * @param {?} c * @return {?} */ validate(c) { /** @type {?} */ const value = this.getHostValue(); if (value === null || value === EMPTY_STR) { return null; } /** @type {?} */ let validateOpts = null; if (!this.opts.dateRange) { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) }; /** @type {?} */ const date = this.utilService.isDateValid(value, this.opts, validateOpts); if (!this.utilService.isInitializedDate(date)) { return { invalidDateFormat: true }; } } else { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) }; const { begin, end } = this.utilService.isDateValidDateRange(value, this.opts, validateOpts); if (!this.utilService.isInitializedDate(begin) || !this.utilService.isInitializedDate(end)) { return { invalidDateFormat: true }; } } return null; } /** * @return {?} */ openCalendar() { if (this.disabled) { return; } this.preventClose = true; this.cdr.detectChanges(); if (this.cRef === null) { this.cRef = this.vcRef.createComponent(this.cfr.resolveComponentFactory(CalendarComponent)); this.appendSelector(this.cRef.location.nativeElement); this.cRef.instance.initializeComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue(), this.getSelectorPosition(this.elem.nativeElement), (/** * @param {?} dm * @param {?} close * @return {?} */ (dm, close) => { this.focusToInput(); this.emitDateChanged(dm); this.emitInputFieldChanged(this.utilService.getFormattedDate(dm), true); this.updateModel(dm); if (close) { this.closeSelector(CalToggle.CloseByDateSel); } }), (/** * @param {?} cvc * @return {?} */ (cvc) => { this.emitCalendarChanged(cvc); }), (/** * @param {?} rds * @return {?} */ (rds) => { this.emitRangeDateSelection(rds); }), (/** * @param {?} va * @return {?} */ (va) => { this.emitViewActivated(va); }), (/** * @return {?} */ () => { this.closeSelector(CalToggle.CloseByEsc); })); this.emitCalendarToggle(CalToggle.Open); if (!this.opts.inline) { document.addEventListener(CLICK, this.onClickWrapper); } } setTimeout((/** * @return {?} */ () => { this.preventClose = false; }), PREVENT_CLOSE_TIMEOUT); } /** * @return {?} */ closeCalendar() { this.closeSelector(CalToggle.CloseByCalBtn); } /** * @return {?} */ toggleCalendar() { if (this.disabled) { return; } /** @type {?} */ const isOpen = this.cRef === null; if (isOpen) { this.openCalendar(); } else { this.closeSelector(CalToggle.CloseByCalBtn); } return isOpen; } /** * @return {?} */ clearDate() { if (this.disabled) { return; } const { inline } = this.opts; this.setHostValue(EMPTY_STR); this.emitDateChanged({ isRange: this.opts.dateRange, singleDate: { date: this.utilService.resetDate(), jsDate: null, formatted: EMPTY_STR, epoc: 0 }, dateRange: { beginDate: this.utilService.resetDate(), beginJsDate: null, beginEpoc: 0, endDate: this.utilService.resetDate(), endJsDate: null, endEpoc: 0, formatted: EMPTY_STR } }); this.onChangeCb(null); this.onTouchedCb(); if (this.cRef) { this.cRef.instance.clearDate(); } if (!inline) { this.closeSelector(CalToggle.CloseByCalBtn); } } /** * @return {?} */ isDateValid() { /** @type {?} */ const value = this.getHostValue(); if (value === null || value === EMPTY_STR) { return false; } /** @type {?} */ let validateOpts = null; if (!this.opts.dateRange) { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) }; /** @type {?} */ const date = this.utilService.isDateValid(value, this.opts, validateOpts); if (this.utilService.isInitializedDate(date)) { this.emitInputFieldChanged(value, true); return true; } } else { validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) }; const { begin, end } = this.utilService.isDateValidDateRange(value, this.opts, validateOpts); if (this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end)) { this.emitInputFieldChanged(value, true); return true; } } this.emitInputFieldChanged(value, false); return false; } /** * @param {?} headerAction * @return {?} */ headerAction(headerAction) { if (this.cRef) { this.cRef.instance.headerAction(headerAction); } } /** * @param {?} value * @return {?} */ setHostValue(value) { const { divHostElement } = this.opts; this.hostText = value; /** @type {?} */ const valueType = !divHostElement.enabled ? VALUE : INNER_HTML; value = valueType === INNER_HTML && value === EMPTY_STR ? divHostElement.placeholder : value; this.renderer.setProperty(this.elem.nativeElement, valueType, value); } /** * @private * @param {?} keyCode * @return {?} */ ignoreKeyPress(keyCode) { return keyCode === KeyCode.leftArrow || keyCode === KeyCode.rightArrow || keyCode === KeyCode.upArrow || keyCode === KeyCode.downArrow || keyCode === KeyCode.tab || keyCode === KeyCode.shift; } /** * @private * @param {?} reason * @return {?} */ animationEnd(reason) { if (this.cRef) { this.cRef.instance.selectorEl.nativeElement.removeEventListener(ANIMATION_END, this.onAnimateWrapper); this.removeComponent(); this.emitCalendarToggle(reason); } } /** * @private * @param {?} reason * @return {?} */ closeSelector(reason) { const { inline, calendarAnimation } = this.opts; if (this.cRef && !inline) { if (calendarAnimation.out !== CalAnimation.None) { const { instance } = this.cRef; instance.selectorEl.nativeElement.addEventListener(ANIMATION_END, this.onAnimateWrapper.bind(this, reason)); instance.setCalendarAnimation(calendarAnimation, false); // In case the animationend event is not fired setTimeout(this.onAnimateWrapper.bind(this, reason), ANIMATION_TIMEOUT); } else { this.removeComponent(); this.emitCalendarToggle(reason); } document.removeEventListener(CLICK, this.onClickWrapper); } } /** * @private * @return {?} */ removeComponent() { if (this.vcRef !== null) { this.vcRef.remove(this.vcRef.indexOf(this.cRef.hostView)); this.cRef = null; } } /** * @private * @param {?} model * @return {?} */ updateModel(model) { this.setHostValue(this.utilService.getFormattedDate(model)); this.onChangeCb(model); this.onTouchedCb(); } /** * @private * @return {?} */ getHostValue() { const { value, innerHTML } = this.elem.nativeElement; return !this.opts.divHostElement.enabled ? value : innerHTML; } /** * @private * @return {?} */ focusToInput() { const { focusInputOnDateSelect, divHostElement } = this.opts; if (focusInputOnDateSelect && !divHostElement.enabled) { setTimeout((/** * @return {?} */ () => { this.elem.nativeElement.focus(); })); } } /** * @private * @param {?} dateModel * @return {?} */ emitDateChanged(dateModel) { this.dateChanged.emit(dateModel); this.setSelectedValue(dateModel); } /** * @private * @param {?} dateModel * @return {?} */ setSelectedValue(dateModel) { const { isRange, dateRange, singleDate } = dateModel; this.selectedValue = isRange ? dateRange : singleDate; } /** * @private * @param {?} value * @param {?} valid * @return {?} */ emitInputFieldChanged(value, valid) { this.inputFieldChanged.emit({ value, dateFormat: this.opts.dateFormat, valid }); } /** * @private * @param {?} cvc * @return {?} */ emitCalendarChanged(cvc) { this.calendarViewChanged.emit(cvc); } /** * @private * @param {?} rds * @return {?} */ emitRangeDateSelection(rds) { this.rangeDateSelection.emit(rds); } /** * @private * @param {?} va * @return {?} */ emitViewActivated(va) { this.viewActivated.emit(va); } /** * @private * @param {?} reason * @return {?} */ emitCalendarToggle(reason) { this.calendarToggle.emit(reason); } /** * @private * @param {?} elem * @return {?} */ appendSelector(elem) { if (this.opts.appendSelectorToBody) { document.querySelector(BODY).appendChild(elem); } } /** * @private * @param {?} elem * @return {?} */ getSelectorPosition(elem) { /** @type {?} */ let top = 0; /** @type {?} */ let left = 0; const { appendSelectorToBody, openSelectorTopOfInput, selectorHeight, selectorWidth, showSelectorArrow, alignSelectorRight } = this.opts; if (appendSelectorToBody) { /** @type {?} */ const b = document.body.getBoundingClientRect(); /** @type {?} */ const e = elem.getBoundingClientRect(); top = e.top - b.top; left = e.left - b.left; } if (openSelectorTopOfInput) { top = top - this.getSelectorDimension(selectorHeight) - 2; } else { top = top + elem.offsetHeight + (showSelectorArrow ? 12 : 2); } if (alignSelectorRight) { left = left + elem.offsetWidth - this.getSelectorDimension(selectorWidth); } return { top: top + PX, left: left + PX }; } /** * @private * @param {?} value * @return {?} */ getSelectorDimension(value) { return Number(value.replace(PX, EMPTY_STR)); } } AngularMyDatePickerDirective.decorators = [ { type: Directive, args: [{ selector: "[angular-mydatepicker]", exportAs: "angular-mydatepicker", providers: [UtilService, LocaleService, DefaultConfigService, NGX_DP_VALUE_ACCESSOR, NGX_DP_VALIDATORS] },] } ]; /** @nocollapse */ AngularMyDatePickerDirective.ctorParameters = () => [ { type: LocaleService }, { type: UtilService }, { type: ViewContainerRef }, { type: ComponentFactoryResolver }, { type: Renderer2 }, { type: ChangeDetectorRef }, { type: ElementRef }, { type: DefaultConfigService } ]; AngularMyDatePickerDirective.propDecorators = { options: [{ type: Input }], locale: [{ type: Input }], defaultMonth: [{ type: Input }], dateChanged: [{ type: Output }], inputFieldChanged: [{ type: Output }], calendarViewChanged: [{ type: Output }], calendarToggle: [{ type: Output }], rangeDateSelection: [{ type: Output }], viewActivated: [{ type: Output }], onKeyUp: [{ type: HostListener, args: [KEYUP, ["$event"],] }], onBlur: [{ type: HostListener, args: [BLUR,] }] }; if (false) { /** @type {?} */ AngularMyDatePickerDirective.prototype.options; /** @type {?} */ AngularMyDatePickerDirective.prototype.locale; /** @type {?} */ AngularMyDatePickerDirective.prototype.defaultMonth; /** @type {?} */ AngularMyDatePickerDirective.prototype.dateChanged; /** @type {?} */ AngularMyDatePickerDirective.prototype.inputFieldChanged; /** @type {?} */ AngularMyDatePickerDirective.prototype.calendarViewChanged; /** @type {?} */ AngularMyDatePickerDirective.prototype.calendarToggle; /** @type {?} */ AngularMyDatePickerDirective.prototype.rangeDateSelection; /** @type {?} */ AngularMyDatePickerDirective.prototype.viewActivated; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.cRef; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.hostText; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.preventClose; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.disabled; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.selectedValue; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.opts; /** @type {?} */ AngularMyDatePickerDirective.prototype.onChangeCb; /** @type {?} */ AngularMyDatePickerDirective.prototype.onTouchedCb; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.onClickWrapper; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.onAnimateWrapper; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.localeService; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.utilService; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.vcRef; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.cfr; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.renderer; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.cdr; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.elem; /** * @type {?} * @private */ AngularMyDatePickerDirective.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1teWRhdGVwaWNrZXIuaW5wdXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW15ZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLW15ZGF0ZXBpY2tlci5pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQWdCLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQ2hHLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUE0QixZQUFZLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDdEksT0FBTyxFQUF3QyxhQUFhLEVBQUUsaUJBQWlCLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQVczRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDN0UsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCxPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQ3pHLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVB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