angular-mydatepicker
Version:
Angular datepicker and date range picker
823 lines • 84.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from "@angular/core";
import { KeyCode } from "../enums/key-code.enum";
import { KeyName } from "../enums/key-name.enum";
import { D, DD, M, MM, MMM, YYYY, ORDINAL, ST, ND, RD, SU, MO, TU, WE, TH, FR, SA, ZERO_STR, EMPTY_STR, PIPE } from "../constants/constants";
export class UtilService {
constructor() {
this.weekDays = [SU, MO, TU, WE, TH, FR, SA];
}
/**
* @param {?} dateStr
* @param {?} options
* @param {?} validateOpts
* @return {?}
*/
isDateValid(dateStr, options, validateOpts) {
const { dateFormat, minYear, maxYear, monthLabels } = options;
/** @type {?} */
const returnDate = this.resetDate();
/** @type {?} */
const datesInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
/** @type {?} */
const isMonthStr = dateFormat.indexOf(MMM) !== -1;
/** @type {?} */
const delimeters = dateFormat.match(/[^(d#my)]{1,}/g);
if (!dateStr || dateStr === EMPTY_STR) {
return returnDate;
}
/** @type {?} */
const dateValues = this.getDateValue(dateStr, dateFormat, delimeters);
/** @type {?} */
let year = 0;
/** @type {?} */
let month = 0;
/** @type {?} */
let day = 0;
for (let dv of dateValues) {
if (dv.format.indexOf(ORDINAL) != -1) {
/** @type {?} */
const dayNumber = parseInt(dv.value.replace(/\D/g, ''));
/** @type {?} */
const ordinalStr = dv.value.replace(/[0-9]/g, '');
/** @type {?} */
const ordinal = this.getOrdinal(dayNumber);
if (ordinal !== ordinalStr) {
return returnDate;
}
dv.value = dv.value.replace(ST, EMPTY_STR).replace(ND, EMPTY_STR).replace(RD, EMPTY_STR).replace(TH, EMPTY_STR);
dv.format = dv.format.replace(ORDINAL, EMPTY_STR);
}
const { value, format } = dv;
if (value && /^\d+$/.test(value) && Number(value) === 0) {
return returnDate;
}
if (format.indexOf(YYYY) !== -1) {
year = this.getNumberByValue(dv);
}
else if (format.indexOf(M) !== -1) {
month = isMonthStr ? this.getMonthNumberByMonthName(dv, monthLabels) : this.getNumberByValue(dv);
}
else if (format.indexOf(D) !== -1) {
day = this.getNumberByValue(dv);
}
}
const { validateDisabledDates, selectedValue } = validateOpts;
year = year === 0 && selectedValue ? selectedValue.year : year;
month = month === 0 && selectedValue ? selectedValue.month : month;
day = day === 0 && selectedValue ? selectedValue.day : day;
/** @type {?} */
const today = this.getToday();
if (year === 0 && (month !== 0 || day !== 0)) {
year = today.year;
}
if (month === 0 && (year !== 0 || day !== 0)) {
month = today.month;
}
if (day === 0 && (year !== 0 || month !== 0)) {
day = today.day;
}
if (month !== -1 && day !== -1 && year !== -1) {
if (year < minYear || year > maxYear || month < 1 || month > 12) {
return returnDate;
}
/** @type {?} */
const date = { year, month, day };
if (validateDisabledDates && this.isDisabledDate(date, options).disabled) {
return returnDate;
}
if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {
datesInMonth[1] = 29;
}
if (day < 1 || day > datesInMonth[month - 1]) {
return returnDate;
}
// Valid date
return date;
}
return returnDate;
}
/**
* @param {?} dateRangeStr
* @param {?} options
* @param {?} validateOpts
* @return {?}
*/
isDateValidDateRange(dateRangeStr, options, validateOpts) {
/** @type {?} */
let dateRange = { begin: this.resetDate(), end: this.resetDate() };
if (dateRangeStr && dateRangeStr.length) {
/** @type {?} */
const dates = dateRangeStr.split(options.dateRangeDatesDelimiter);
if (dates && dates.length === 2) {
const [beginDate, endDate] = dates;
let { selectedValue } = validateOpts;
if (selectedValue) {
validateOpts.selectedValue = selectedValue.begin;
}
/** @type {?} */
const begin = this.isDateValid(beginDate, options, validateOpts);
if (this.isInitializedDate(begin)) {
if (selectedValue) {
validateOpts.selectedValue = selectedValue.end;
}
/** @type {?} */
const end = this.isDateValid(endDate, options, validateOpts);
if (this.isInitializedDate(end) && this.isDateSameOrEarlier(begin, end)) {
dateRange = { begin, end };
}
}
}
}
return dateRange;
}
/**
* @param {?} dateStr
* @param {?} dateFormat
* @param {?} delimeters
* @return {?}
*/
getDateValue(dateStr, dateFormat, delimeters) {
/** @type {?} */
let del = EMPTY_STR;
if (delimeters) {
for (const d of delimeters) {
if (del.indexOf(d) === -1) {
del += d;
}
}
}
/** @type {?} */
const re = new RegExp("[" + del + "]");
/** @type {?} */
const ds = dateStr.split(re);
/** @type {?} */
const df = dateFormat.split(re);
/** @type {?} */
const da = [];
for (let i = 0; i < df.length; i++) {
if (df[i].indexOf(YYYY) !== -1) {
da.push({ value: ds[i], format: df[i] });
}
if (df[i].indexOf(M) !== -1) {
da.push({ value: ds[i], format: df[i] });
}
if (df[i].indexOf(D) !== -1) {
da.push({ value: ds[i], format: df[i] });
}
}
return da;
}
/**
* @param {?} df
* @param {?} monthLabels
* @return {?}
*/
getMonthNumberByMonthName(df, monthLabels) {
if (df.value) {
for (let key = 1; key <= 12; key++) {
if (df.value.toLowerCase() === monthLabels[key].toLowerCase()) {
return key;
}
}
}
return -1;
}
/**
* @param {?} df
* @return {?}
*/
getNumberByValue(df) {
if (!/^\d+$/.test(df.value)) {
return -1;
}
/** @type {?} */
let nbr = Number(df.value);
if (df.format.length === 1 && df.value.length !== 1 && nbr < 10 || df.format.length === 1 && df.value.length !== 2 && nbr >= 10) {
nbr = -1;
}
else if (df.format.length === 2 && df.value.length > 2) {
nbr = -1;
}
return nbr;
}
/**
* @param {?} monthString
* @return {?}
*/
parseDefaultMonth(monthString) {
/** @type {?} */
const month = { monthTxt: EMPTY_STR, monthNbr: 0, year: 0 };
if (monthString !== EMPTY_STR) {
/** @type {?} */
const split = monthString.split(monthString.match(/[^0-9]/)[0]);
month.monthNbr = split[0].length === 2 ? Number(split[0]) : Number(split[1]);
month.year = split[0].length === 2 ? Number(split[1]) : Number(split[0]);
}
return month;
}
/**
* @param {?} date
* @param {?} options
* @return {?}
*/
isDisabledDate(date, options) {
const { minYear, maxYear, disableUntil, disableSince, disableWeekends, disableDates, disableDateRanges, disableWeekdays, enableDates } = options;
if (this.dateMatchToDates(date, enableDates)) {
return this.getDisabledValue(false, EMPTY_STR);
}
if (date.year < minYear && date.month === 12 || date.year > maxYear && date.month === 1) {
return this.getDisabledValue(true, EMPTY_STR);
}
/** @type {?} */
const inputDates = (/** @type {?} */ (disableDates));
/** @type {?} */
const result = inputDates.find((/**
* @param {?} d
* @return {?}
*/
(d) => {
return d.dates;
}));
if (!result) {
if (this.dateMatchToDates(date, inputDates)) {
return this.getDisabledValue(true, EMPTY_STR);
}
}
else {
for (const dd of inputDates) {
if (this.dateMatchToDates(date, dd.dates)) {
return this.getDisabledValue(true, dd.styleClass);
}
}
}
if (this.isDisabledByDisableUntil(date, disableUntil)) {
return this.getDisabledValue(true, EMPTY_STR);
}
if (this.isDisabledByDisableSince(date, disableSince)) {
return this.getDisabledValue(true, EMPTY_STR);
}
if (disableWeekends) {
/** @type {?} */
const dayNbr = this.getDayNumber(date);
if (dayNbr === 0 || dayNbr === 6) {
return this.getDisabledValue(true, EMPTY_STR);
}
}
/** @type {?} */
const dn = this.getDayNumber(date);
if (disableWeekdays.length > 0) {
for (const wd of disableWeekdays) {
if (dn === this.getWeekdayIndex(wd)) {
return this.getDisabledValue(true, EMPTY_STR);
}
}
}
if (this.isDisabledByDisableDateRange(date, date, disableDateRanges)) {
return this.getDisabledValue(true, EMPTY_STR);
}
return this.getDisabledValue(false, EMPTY_STR);
}
/**
* @param {?} disabled
* @param {?} styleClass
* @return {?}
*/
getDisabledValue(disabled, styleClass) {
return { disabled, styleClass };
}
/**
* @param {?} date
* @param {?} dates
* @return {?}
*/
dateMatchToDates(date, dates) {
for (const d of dates) {
if ((d.year === 0 || d.year === date.year) && (d.month === 0 || d.month === date.month) && d.day === date.day) {
return true;
}
}
return false;
}
/**
* @param {?} year
* @param {?} month
* @param {?} options
* @return {?}
*/
isDisabledMonth(year, month, options) {
const { disableUntil, disableSince, disableDateRanges, enableDates } = options;
/** @type {?} */
const dateEnd = { year, month, day: this.datesInMonth(month, year) };
/** @type {?} */
const dateBegin = { year, month, day: 1 };
if (this.isDatesEnabled(dateBegin, dateEnd, enableDates)) {
return false;
}
if (this.isDisabledByDisableUntil(dateEnd, disableUntil)) {
return true;
}
if (this.isDisabledByDisableSince(dateBegin, disableSince)) {
return true;
}
if (this.isDisabledByDisableDateRange(dateBegin, dateEnd, disableDateRanges)) {
return true;
}
return false;
}
/**
* @param {?} year
* @param {?} options
* @return {?}
*/
isDisabledYear(year, options) {
const { disableUntil, disableSince, disableDateRanges, enableDates, minYear, maxYear } = options;
/** @type {?} */
const dateEnd = { year, month: 12, day: 31 };
/** @type {?} */
const dateBegin = { year, month: 1, day: 1 };
if (this.isDatesEnabled(dateBegin, dateEnd, enableDates)) {
return false;
}
if (this.isDisabledByDisableUntil(dateEnd, disableUntil)) {
return true;
}
if (this.isDisabledByDisableSince(dateBegin, disableSince)) {
return true;
}
if (this.isDisabledByDisableDateRange(dateBegin, dateEnd, disableDateRanges)) {
return true;
}
if (year < minYear || year > maxYear) {
return true;
}
return false;
}
/**
* @param {?} date
* @param {?} disableUntil
* @return {?}
*/
isDisabledByDisableUntil(date, disableUntil) {
return this.isInitializedDate(disableUntil) && this.getTimeInMilliseconds(date) <= this.getTimeInMilliseconds(disableUntil);
}
/**
* @param {?} date
* @param {?} disableSince
* @return {?}
*/
isDisabledByDisableSince(date, disableSince) {
return this.isInitializedDate(disableSince) && this.getTimeInMilliseconds(date) >= this.getTimeInMilliseconds(disableSince);
}
/**
* @param {?} date
* @param {?} enableDates
* @return {?}
*/
isPastDatesEnabled(date, enableDates) {
for (const d of enableDates) {
if (this.getTimeInMilliseconds(d) <= this.getTimeInMilliseconds(date)) {
return true;
}
}
return false;
}
/**
* @param {?} date
* @param {?} enableDates
* @return {?}
*/
isFutureDatesEnabled(date, enableDates) {
for (const d of enableDates) {
if (this.getTimeInMilliseconds(d) >= this.getTimeInMilliseconds(date)) {
return true;
}
}
return false;
}
/**
* @param {?} dateBegin
* @param {?} dateEnd
* @param {?} enableDates
* @return {?}
*/
isDatesEnabled(dateBegin, dateEnd, enableDates) {
for (const d of enableDates) {
if (this.getTimeInMilliseconds(d) >= this.getTimeInMilliseconds(dateBegin)
&& this.getTimeInMilliseconds(d) <= this.getTimeInMilliseconds(dateEnd)) {
return true;
}
}
return false;
}
/**
* @param {?} dateBegin
* @param {?} dateEnd
* @param {?} disableDateRanges
* @return {?}
*/
isDisabledByDisableDateRange(dateBegin, dateEnd, disableDateRanges) {
/** @type {?} */
const dateMsBegin = this.getTimeInMilliseconds(dateBegin);
/** @type {?} */
const dateMsEnd = this.getTimeInMilliseconds(dateEnd);
for (const d of disableDateRanges) {
if (this.isInitializedDate(d.begin) && this.isInitializedDate(d.end)
&& dateMsBegin >= this.getTimeInMilliseconds(d.begin) && dateMsEnd <= this.getTimeInMilliseconds(d.end)) {
return true;
}
}
return false;
}
/**
* @param {?} date
* @param {?} options
* @return {?}
*/
isMarkedDate(date, options) {
const { markDates, markWeekends } = options;
for (const md of markDates) {
if (this.dateMatchToDates(date, md.dates)) {
return this.getMarkedValue(true, md.color, md.styleClass);
}
}
if (markWeekends && markWeekends.marked) {
/** @type {?} */
const dayNbr = this.getDayNumber(date);
if (dayNbr === 0 || dayNbr === 6) {
return this.getMarkedValue(true, markWeekends.color, EMPTY_STR);
}
}
return this.getMarkedValue(false, EMPTY_STR, EMPTY_STR);
}
/**
* @param {?} marked
* @param {?} color
* @param {?} styleClass
* @return {?}
*/
getMarkedValue(marked, color, styleClass) {
return { marked, color: color ? color : EMPTY_STR, styleClass: styleClass ? styleClass : EMPTY_STR };
}
/**
* @param {?} date
* @param {?} options
* @return {?}
*/
isHighlightedDate(date, options) {
const { sunHighlight, satHighlight, highlightDates } = options;
/** @type {?} */
const dayNbr = this.getDayNumber(date);
if (sunHighlight && dayNbr === 0 || satHighlight && dayNbr === 6) {
return true;
}
if (this.dateMatchToDates(date, highlightDates)) {
return true;
}
return false;
}
/**
* @param {?} date
* @return {?}
*/
getWeekNumber(date) {
/** @type {?} */
const d = new Date(date.year, date.month - 1, date.day, 0, 0, 0, 0);
d.setDate(d.getDate() + (d.getDay() === 0 ? -3 : 4 - d.getDay()));
return Math.round(((d.getTime() - new Date(d.getFullYear(), 0, 4).getTime()) / 86400000) / 7) + 1;
}
/**
* @param {?} date
* @param {?} dateRange
* @param {?} dateFormat
* @param {?} monthLabels
* @param {?} rangeDelimiter
* @param {?=} dateStr
* @return {?}
*/
getDateModel(date, dateRange, dateFormat, monthLabels, rangeDelimiter, dateStr = EMPTY_STR) {
/** @type {?} */
let singleDateModel = null;
/** @type {?} */
let dateRangeModel = null;
if (date) {
singleDateModel = {
date,
jsDate: this.myDateToJsDate(date),
formatted: dateStr.length ? dateStr : this.formatDate(date, dateFormat, monthLabels),
epoc: this.getEpocTime(date)
};
}
else {
dateRangeModel = {
beginDate: dateRange.begin,
beginJsDate: this.myDateToJsDate(dateRange.begin),
beginEpoc: this.getEpocTime(dateRange.begin),
endDate: dateRange.end,
endJsDate: this.myDateToJsDate(dateRange.end),
endEpoc: this.getEpocTime(dateRange.end),
formatted: this.formatDate(dateRange.begin, dateFormat, monthLabels) + rangeDelimiter + this.formatDate(dateRange.end, dateFormat, monthLabels)
};
}
return {
isRange: date === null,
singleDate: singleDateModel,
dateRange: dateRangeModel
};
}
/**
* @param {?} date
* @param {?} dateFormat
* @param {?} monthLabels
* @return {?}
*/
formatDate(date, dateFormat, monthLabels) {
/** @type {?} */
let formatted = dateFormat.replace(YYYY, String(date.year));
if (dateFormat.indexOf(MMM) !== -1) {
formatted = formatted.replace(MMM, monthLabels[date.month]);
}
else if (dateFormat.indexOf(MM) !== -1) {
formatted = formatted.replace(MM, this.preZero(date.month));
}
else {
formatted = formatted.replace(M, String(date.month));
}
if (dateFormat.indexOf(DD) !== -1) {
formatted = formatted.replace(DD, this.preZero(date.day));
}
else {
formatted = formatted.replace(D, String(date.day));
}
if (dateFormat.indexOf(ORDINAL) !== -1) {
formatted = formatted.replace(ORDINAL, this.getOrdinal(date.day));
}
return formatted;
}
/**
* @param {?} date
* @return {?}
*/
getOrdinal(date) {
if (date > 3 && date < 21) {
return TH;
}
switch (date % 10) {
case 1:
return ST;
case 2:
return ND;
case 3:
return RD;
default:
return TH;
}
}
/**
* @param {?} model
* @return {?}
*/
getFormattedDate(model) {
return !model.isRange ? model.singleDate.formatted : model.dateRange.formatted;
}
/**
* @param {?} val
* @return {?}
*/
preZero(val) {
return val < 10 ? ZERO_STR + val : String(val);
}
/**
* @param {?} date
* @return {?}
*/
isInitializedDate(date) {
return date.year !== 0 && date.month !== 0 && date.day !== 0;
}
/**
* @param {?} firstDate
* @param {?} secondDate
* @return {?}
*/
isDateEarlier(firstDate, secondDate) {
return this.getTimeInMilliseconds(firstDate) < this.getTimeInMilliseconds(secondDate);
}
/**
* @param {?} firstDate
* @param {?} secondDate
* @return {?}
*/
isDateSameOrEarlier(firstDate, secondDate) {
return this.getTimeInMilliseconds(firstDate) <= this.getTimeInMilliseconds(secondDate);
}
/**
* @param {?} firstDate
* @param {?} secondDate
* @return {?}
*/
isDateSame(firstDate, secondDate) {
return this.getTimeInMilliseconds(firstDate) === this.getTimeInMilliseconds(secondDate);
}
/**
* @param {?} dateRange
* @param {?} date
* @return {?}
*/
isDateRangeBeginOrEndSame(dateRange, date) {
/** @type {?} */
const dateMs = this.getTimeInMilliseconds(date);
return this.getTimeInMilliseconds(dateRange.begin) === dateMs || this.getTimeInMilliseconds(dateRange.end) === dateMs;
}
/**
* @param {?} dateRange
* @param {?} date
* @return {?}
*/
isDateRangeBegin(dateRange, date) {
/** @type {?} */
const dateMs = this.getTimeInMilliseconds(date);
return this.getTimeInMilliseconds(dateRange.begin) === dateMs;
}
/**
* @param {?} dateRange
* @param {?} date
* @return {?}
*/
isDateRangeEnd(dateRange, date) {
/** @type {?} */
const dateMs = this.getTimeInMilliseconds(date);
return this.getTimeInMilliseconds(dateRange.end) === dateMs;
}
/**
* @param {?} date
* @param {?} dateRange
* @return {?}
*/
isDateInRange(date, dateRange) {
if (!this.isInitializedDate(dateRange.begin) || !this.isInitializedDate(dateRange.end)) {
return false;
}
return this.isDateSameOrEarlier(dateRange.begin, date) && this.isDateSameOrEarlier(date, dateRange.end);
}
/**
* @return {?}
*/
resetDate() {
return { year: 0, month: 0, day: 0 };
}
/**
* @param {?} date
* @return {?}
*/
getTimeInMilliseconds(date) {
return this.myDateToJsDate(date).getTime();
}
/**
* @return {?}
*/
getToday() {
/** @type {?} */
const date = new Date();
return { year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate() };
}
/**
* @param {?} date
* @return {?}
*/
getDayNumber(date) {
return new Date(date.year, date.month - 1, date.day, 0, 0, 0, 0).getDay();
}
/**
* @param {?} wd
* @return {?}
*/
getWeekdayIndex(wd) {
return this.weekDays.indexOf(wd);
}
/**
* @param {?} date
* @return {?}
*/
getEpocTime(date) {
return Math.round(this.getTimeInMilliseconds(date) / 1000.0);
}
/**
* @param {?} date
* @return {?}
*/
jsDateToMyDate(date) {
return { year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate() };
}
/**
* @param {?} date
* @return {?}
*/
myDateToJsDate(date) {
const { year, month, day } = date;
return new Date(year, month - 1, day, 0, 0, 0, 0);
}
/**
* @param {?} m
* @param {?} y
* @return {?}
*/
datesInMonth(m, y) {
return new Date(y, m, 0).getDate();
}
/**
* @param {?} m
* @param {?} y
* @return {?}
*/
datesInPrevMonth(m, y) {
/** @type {?} */
const d = this.getJsDate(y, m, 1);
d.setMonth(d.getMonth() - 1);
return this.datesInMonth(d.getMonth() + 1, d.getFullYear());
}
/**
* @param {?} year
* @param {?} month
* @param {?} day
* @return {?}
*/
getJsDate(year, month, day) {
return new Date(year, month - 1, day, 0, 0, 0, 0);
}
/**
* @param {?} selectedValue
* @param {?} dateRange
* @return {?}
*/
getSelectedValue(selectedValue, dateRange) {
if (!selectedValue) {
return null;
}
if (!dateRange) {
return selectedValue.date;
}
else {
const { beginDate, endDate } = selectedValue;
return { begin: beginDate, end: endDate };
}
}
/**
* @param {?} event
* @return {?}
*/
getKeyCodeFromEvent(event) {
/** @type {?} */
let key = event.key || event.keyCode || event.which;
if (this.checkKeyName(key, KeyName.enter) || key === KeyCode.enter) {
return KeyCode.enter;
}
else if (this.checkKeyName(key, KeyName.esc) || key === KeyCode.esc) {
return KeyCode.esc;
}
else if (this.checkKeyName(key, KeyName.space) || key === KeyCode.space) {
return KeyCode.space;
}
else if (this.checkKeyName(key, KeyName.leftArrow) || key === KeyCode.leftArrow) {
return KeyCode.leftArrow;
}
else if (this.checkKeyName(key, KeyName.upArrow) || key === KeyCode.upArrow) {
return KeyCode.upArrow;
}
else if (this.checkKeyName(key, KeyName.rightArrow) || key === KeyCode.rightArrow) {
return KeyCode.rightArrow;
}
else if (this.checkKeyName(key, KeyName.downArrow) || key === KeyCode.downArrow) {
return KeyCode.downArrow;
}
else if (this.checkKeyName(key, KeyName.tab) || key === KeyCode.tab) {
return KeyCode.tab;
}
else if (this.checkKeyName(key, KeyName.shift) || key === KeyCode.shift) {
return KeyCode.shift;
}
else {
return null;
}
}
/**
* @param {?} key
* @param {?} keyName
* @return {?}
*/
checkKeyName(key, keyName) {
/** @type {?} */
const arr = keyName.split(PIPE);
return arr.indexOf(key) !== -1;
}
}
UtilService.decorators = [
{ type: Injectable }
];
if (false) {
/** @type {?} */
UtilService.prototype.weekDays;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1teWRhdGVwaWNrZXIudXRpbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1teWRhdGVwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvYW5ndWxhci1teWRhdGVwaWNrZXIudXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBYXpDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUczSSxNQUFNLE9BQU8sV0FBVztJQUR4QjtRQUVFLGFBQVEsR0FBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQXVuQnpELENBQUM7Ozs7Ozs7SUFybkJDLFdBQVcsQ0FBQyxPQUFlLEVBQUUsT0FBbUIsRUFBRSxZQUFnQztjQUMxRSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBQyxHQUFHLE9BQU87O2NBRXJELFVBQVUsR0FBWSxJQUFJLENBQUMsU0FBUyxFQUFFOztjQUN0QyxZQUFZLEdBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVB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