ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
414 lines (413 loc) • 43 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Models } from '../date/DataTypes';
import { formatDate } from '../util';
import defaultLocale from '../locale/zh_CN';
/**
* @record
*/
export function StateType() { }
/** @type {?} */
StateType.prototype.months;
var DatePicker = /** @class */ (function () {
function DatePicker() {
var _this = this;
this.props = /** @type {?} */ ({
prefixCls: 'rmc-calendar',
infinite: false,
infiniteOpt: false,
defaultDate: new Date(),
initalMonths: 6,
locale: defaultLocale
});
this.state = {
months: []
};
this.visibleMonth = [];
this.getDateWithoutTime = function (date) {
if (!date)
return 0;
return +new Date(date.getFullYear(), date.getMonth(), date.getDate());
};
this.genWeekData = function (firstDate) {
/** @type {?} */
var minDateTime = _this.getDateWithoutTime(_this.props.minDate);
/** @type {?} */
var maxDateTime = _this.getDateWithoutTime(_this.props.maxDate) || Number.POSITIVE_INFINITY;
/** @type {?} */
var weeks = [];
/** @type {?} */
var nextMonth = _this.getMonthDate(firstDate, 1).firstDate;
/** @type {?} */
var currentDay = firstDate;
/** @type {?} */
var currentWeek = [];
weeks.push(currentWeek);
/** @type {?} */
var startWeekday = currentDay.getDay();
if (startWeekday > 0) {
for (var i = 0; i < startWeekday; i++) {
currentWeek.push(/** @type {?} */ ({}));
}
}
while (currentDay < nextMonth) {
if (currentWeek.length === 7) {
currentWeek = [];
weeks.push(currentWeek);
}
/** @type {?} */
var dayOfMonth = currentDay.getDate();
/** @type {?} */
var tick = +currentDay;
currentWeek.push({
tick: tick,
dayOfMonth: dayOfMonth,
selected: Models.SelectType.None,
isFirstOfMonth: dayOfMonth === 1,
isLastOfMonth: false,
outOfDate: tick < minDateTime || tick > maxDateTime
});
currentDay = new Date(currentDay.getTime() + 3600 * 24 * 1000);
}
currentWeek[currentWeek.length - 1].isLastOfMonth = true;
return weeks;
};
this.selectDateRange = function (startDate, endDate, clear) {
if (clear === void 0) { clear = false; }
var _a = _this.props, getDateExtra = _a.getDateExtra, type = _a.type, onSelectHasDisableDate = _a.onSelectHasDisableDate;
if (type === 'one') {
endDate = undefined;
}
/** @type {?} */
var time1 = _this.getDateWithoutTime(startDate);
/** @type {?} */
var time2 = _this.getDateWithoutTime(endDate);
/** @type {?} */
var startDateTick = !time2 || time1 < time2 ? time1 : time2;
/** @type {?} */
var endDateTick = time2 && time1 > time2 ? time1 : time2;
/** @type {?} */
var startMonthDate = _this.getMonthDate(new Date(startDateTick)).firstDate;
/** @type {?} */
var endMonthDate = endDateTick ? new Date(endDateTick) : _this.getMonthDate(new Date(startDateTick)).lastDate;
/** @type {?} */
var unuseable = [];
/** @type {?} */
var needUpdate = false;
_this.state.months
.filter(function (m) {
return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate;
})
.forEach(function (m) {
m.weeks.forEach(function (w) {
return w
.filter(function (d) {
if (!endDateTick) {
return d.tick && _this.inDate(startDateTick, d.tick);
}
else {
return d.tick && d.tick >= startDateTick && d.tick <= endDateTick;
}
})
.forEach(function (d) {
/** @type {?} */
var oldValue = d.selected;
if (clear) {
d.selected = Models.SelectType.None;
}
else {
/** @type {?} */
var info = (getDateExtra && getDateExtra(new Date(d.tick))) || {};
if (d.outOfDate || info.disable) {
unuseable.push(d.tick);
}
if (_this.inDate(startDateTick, d.tick)) {
if (type === 'one') {
d.selected = Models.SelectType.Single;
}
else if (!endDateTick) {
d.selected = Models.SelectType.Only;
}
else if (startDateTick !== endDateTick) {
d.selected = Models.SelectType.Start;
}
else {
d.selected = Models.SelectType.All;
}
}
else if (_this.inDate(endDateTick, d.tick)) {
d.selected = Models.SelectType.End;
}
else {
d.selected = Models.SelectType.Middle;
}
}
needUpdate = needUpdate || d.selected !== oldValue;
});
});
if (needUpdate && m.componentRef) {
m.componentRef.updateWeeks();
}
});
if (unuseable.length > 0) {
if (onSelectHasDisableDate) {
onSelectHasDisableDate(unuseable.map(function (tick) { return new Date(tick); }));
}
else {
console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable);
}
}
};
this.computeVisible = function (clientHeight, scrollTop) {
/** @type {?} */
var needUpdate = false;
/** @type {?} */
var MAX_VIEW_PORT = clientHeight * 2;
/** @type {?} */
var MIN_VIEW_PORT = clientHeight;
/** @type {?} */
var filterFunc = function (vm) {
return vm.y &&
vm.height &&
(vm.y + vm.height > scrollTop - MAX_VIEW_PORT && vm.y < scrollTop + clientHeight + MAX_VIEW_PORT);
};
if (_this.props.infiniteOpt && _this.visibleMonth.length > 12) {
_this.visibleMonth = _this.visibleMonth.filter(filterFunc).sort(function (a, b) { return +a.firstDate - +b.firstDate; });
}
// 当小缓冲区不满时填充
if (_this.visibleMonth.length > 0) {
/** @type {?} */
var last = _this.visibleMonth[_this.visibleMonth.length - 1];
if (last.y !== undefined && last.height && last.y + last.height < scrollTop + clientHeight + MIN_VIEW_PORT) {
/** @type {?} */
var lastIndex = _this.state.months.indexOf(last);
for (var i = 1; i <= 2; i++) {
/** @type {?} */
var index = lastIndex + i;
if (index < _this.state.months.length && _this.visibleMonth.indexOf(_this.state.months[index]) < 0) {
_this.visibleMonth.push(_this.state.months[index]);
}
else {
_this.canLoadNext() && _this.genMonthData(undefined, 1);
}
}
needUpdate = true;
}
/** @type {?} */
var first = _this.visibleMonth[0];
if (first.y !== undefined && first.height && first.y > scrollTop - MIN_VIEW_PORT) {
/** @type {?} */
var firstIndex = _this.state.months.indexOf(first);
for (var i = 1; i <= 2; i++) {
/** @type {?} */
var index = firstIndex - i;
if (index >= 0 && _this.visibleMonth.indexOf(_this.state.months[index]) < 0) {
_this.visibleMonth.unshift(_this.state.months[index]);
needUpdate = true;
}
}
}
}
else if (_this.state.months.length > 0) {
_this.visibleMonth = _this.state.months.filter(filterFunc);
needUpdate = true;
}
return needUpdate;
};
this.createOnScroll = function () {
/** @type {?} */
var clientHeight = 0;
/** @type {?} */
var scrollTop = 0;
return function (data) {
var client = data.client, top = data.top;
clientHeight = client;
scrollTop = top;
_this.computeVisible(clientHeight, scrollTop);
// 以上方法目前无问题,如果后续有性能问题,改用如下方法,但以下方法会导致刷新稍微延迟现象
// if (timer) {
// return;
// }
//
// timer = setTimeout(() => {
// timer = undefined;
//
// if (this.computeVisible(clientHeight, scrollTop)) {
// console.log('update dom');
// }
// }, 50);
};
};
this.baseOnCellClick = function (day) {
if (!day.tick)
return;
_this.props.onCellClick && _this.props.onCellClick(new Date(day.tick));
};
}
/**
* @return {?}
*/
DatePicker.prototype.init = /**
* @return {?}
*/
function () {
var _a = this.props, _b = _a.initalMonths, initalMonths = _b === void 0 ? 6 : _b, defaultDate = _a.defaultDate;
for (var i = 0; i < initalMonths; i++) {
this.canLoadNext() && this.genMonthData(defaultDate, i);
}
this.visibleMonth = tslib_1.__spread(this.state.months);
};
/**
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
DatePicker.prototype.receiveProps = /**
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
function (oldValue, newValue) {
if (oldValue && newValue) {
if (oldValue.startDate !== newValue.startDate || oldValue.endDate !== newValue.endDate) {
if (oldValue.startDate) {
this.selectDateRange(oldValue.startDate, oldValue.endDate, true);
}
if (newValue.startDate) {
this.selectDateRange(newValue.startDate, newValue.endDate);
}
}
}
};
/**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
DatePicker.prototype.getMonthDate = /**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
function (date, addMonth) {
if (date === void 0) { date = new Date(); }
if (addMonth === void 0) { addMonth = 0; }
/** @type {?} */
var y = date.getFullYear();
/** @type {?} */
var m = date.getMonth();
return {
firstDate: new Date(y, m + addMonth, 1),
lastDate: new Date(y, m + 1 + addMonth, 0)
};
};
/**
* @return {?}
*/
DatePicker.prototype.canLoadPrev = /**
* @return {?}
*/
function () {
var minDate = this.props.minDate;
return (!minDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(minDate).firstDate < +this.state.months[0].firstDate);
};
/**
* @return {?}
*/
DatePicker.prototype.canLoadNext = /**
* @return {?}
*/
function () {
var maxDate = this.props.maxDate;
return (!maxDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(maxDate).firstDate > +this.state.months[this.state.months.length - 1].firstDate);
};
/**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
DatePicker.prototype.genMonthData = /**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
function (date, addMonth) {
if (addMonth === void 0) { addMonth = 0; }
if (!date) {
date = addMonth >= 0 ? this.state.months[this.state.months.length - 1].firstDate : this.state.months[0].firstDate;
}
if (!date) {
date = new Date();
}
var locale = this.props.locale;
var _a = this.getMonthDate(date, addMonth), firstDate = _a.firstDate, lastDate = _a.lastDate;
/** @type {?} */
var weeks = this.genWeekData(firstDate);
/** @type {?} */
var title = formatDate(firstDate, locale ? locale.monthTitle : 'yyyy/MM', this.props.locale);
/** @type {?} */
var data = /** @type {?} */ ({
title: title,
firstDate: firstDate,
lastDate: lastDate,
weeks: weeks
});
data.component = this.genMonthComponent(data);
if (addMonth >= 0) {
this.state.months.push(data);
}
else {
this.state.months.unshift(data);
}
var _b = this.props, startDate = _b.startDate, endDate = _b.endDate;
if (startDate) {
this.selectDateRange(startDate, endDate);
}
return data;
};
/**
* @param {?} date
* @param {?} tick
* @return {?}
*/
DatePicker.prototype.inDate = /**
* @param {?} date
* @param {?} tick
* @return {?}
*/
function (date, tick) {
return date <= tick && tick < date + 24 * 3600000;
};
return DatePicker;
}());
export default DatePicker;
if (false) {
/** @type {?} */
DatePicker.prototype.props;
/** @type {?} */
DatePicker.prototype.state;
/** @type {?} */
DatePicker.prototype.visibleMonth;
/** @type {?} */
DatePicker.prototype.genMonthComponent;
/** @type {?} */
DatePicker.prototype.getDateWithoutTime;
/** @type {?} */
DatePicker.prototype.genWeekData;
/** @type {?} */
DatePicker.prototype.selectDateRange;
/** @type {?} */
DatePicker.prototype.computeVisible;
/** @type {?} */
DatePicker.prototype.createOnScroll;
/** @type {?} */
DatePicker.prototype.baseOnCellClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFNNUMsSUFBQTtJQWlCRTtRQUFBLGlCQUFnQjt1Q0FoQlI7WUFDTixTQUFTLEVBQUUsY0FBYztZQUN6QixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN2QixZQUFZLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxhQUFhO1NBQ1Q7cUJBRUQ7WUFDWCxNQUFNLEVBQUUsRUFBRTtTQUNYOzRCQUVrQyxFQUFFO2tDQXFEaEIsVUFBQyxJQUFXO1lBQy9CLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZFOzJCQUVhLFVBQUMsU0FBZTs7WUFDNUIsSUFBTSxXQUFXLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7O1lBQ2hFLElBQU0sV0FBVyxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7WUFF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QUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QscUJBQVEsd0JBQVMsRUFBRSxvQkFBTyxDQUFnQjtRQUMxQyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7O0lBRUQsMkJBQU07Ozs7O0lBQU4sVUFBTyxJQUFZLEVBQUUsSUFBWTtRQUMvQixPQUFPLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0tBQ25EO3FCQXRKSDtJQWlUQyxDQUFBO0FBeFNELDBCQXdTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4uL2RhdGUvRGF0YVR5cGVzJztcbmltcG9ydCBQcm9wc1R5cGUgZnJvbSAnLi9kYXRlcGlja2VyLnByb3BzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvemhfQ04nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHlwZSB7XG4gIG1vbnRoczogTW9kZWxzLk1vbnRoRGF0YVtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlUGlja2VyIHtcbiAgcHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAncm1jLWNhbGVuZGFyJyxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgaW5maW5pdGVPcHQ6IGZhbHNlLFxuICAgIGRlZmF1bHREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGluaXRhbE1vbnRoczogNixcbiAgICBsb2NhbGU6IGRlZmF1bHRMb2NhbGVcbiAgfSBhcyBQcm9wc1R5cGU7XG5cbiAgc3RhdGU6IGFueSA9IHtcbiAgICBtb250aHM6IFtdXG4gIH07XG5cbiAgdmlzaWJsZU1vbnRoOiBNb2RlbHMuTW9udGhEYXRhW10gPSBbXTtcbiAgZ2VuTW9udGhDb21wb25lbnQ6IChkYXRhKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpIHtcbiAgICBjb25zdCB7IGluaXRhbE1vbnRocyA9IDYsIGRlZmF1bHREYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGFsTW9udGhzOyBpKyspIHtcbiAgICAgIHRoaXMuY2FuTG9hZE5leHQoKSAmJiB0aGlzLmdlbk1vbnRoRGF0YShkZWZhdWx0RGF0ZSwgaSk7XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZU1vbnRoID0gWy4uLnRoaXMuc3RhdGUubW9udGhzXTtcbiAgfVxuXG4gIHJlY2VpdmVQcm9wcyhvbGRWYWx1ZTogUHJvcHNUeXBlLCBuZXdWYWx1ZTogUHJvcHNUeXBlKSB7XG4gICAgaWYgKG9sZFZhbHVlICYmIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlICE9PSBuZXdWYWx1ZS5zdGFydERhdGUgfHwgb2xkVmFsdWUuZW5kRGF0ZSAhPT0gbmV3VmFsdWUuZW5kRGF0ZSkge1xuICAgICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2Uob2xkVmFsdWUuc3RhcnREYXRlLCBvbGRWYWx1ZS5lbmREYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3VmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2UobmV3VmFsdWUuc3RhcnREYXRlLCBuZXdWYWx1ZS5lbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldE1vbnRoRGF0ZShkYXRlID0gbmV3IERhdGUoKSwgYWRkTW9udGggPSAwKSB7XG4gICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG0gPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0RGF0ZTogbmV3IERhdGUoeSwgbSArIGFkZE1vbnRoLCAxKSxcbiAgICAgIGxhc3REYXRlOiBuZXcgRGF0ZSh5LCBtICsgMSArIGFkZE1vbnRoLCAwKVxuICAgIH07XG4gIH1cblxuICBjYW5Mb2FkUHJldigpIHtcbiAgICBjb25zdCB7IG1pbkRhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgICFtaW5EYXRlIHx8XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggPD0gMCB8fFxuICAgICAgK3RoaXMuZ2V0TW9udGhEYXRlKG1pbkRhdGUpLmZpcnN0RGF0ZSA8ICt0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGVcbiAgICApO1xuICB9XG5cbiAgY2FuTG9hZE5leHQoKSB7XG4gICAgY29uc3QgeyBtYXhEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICAhbWF4RGF0ZSB8fFxuICAgICAgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICt0aGlzLmdldE1vbnRoRGF0ZShtYXhEYXRlKS5maXJzdERhdGUgPiArdGhpcy5zdGF0ZS5tb250aHNbdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIC0gMV0uZmlyc3REYXRlXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGVXaXRob3V0VGltZSA9IChkYXRlPzogRGF0ZSkgPT4ge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuICtuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICB9O1xuXG4gIGdlbldlZWtEYXRhID0gKGZpcnN0RGF0ZTogRGF0ZSkgPT4ge1xuICAgIGNvbnN0IG1pbkRhdGVUaW1lID0gdGhpcy5nZXREYXRlV2l0aG91dFRpbWUodGhpcy5wcm9wcy5taW5EYXRlKTtcbiAgICBjb25zdCBtYXhEYXRlVGltZSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHRoaXMucHJvcHMubWF4RGF0ZSkgfHwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgY29uc3Qgd2Vla3M6IE1vZGVscy5DZWxsRGF0YVtdW10gPSBbXTtcbiAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldE1vbnRoRGF0ZShmaXJzdERhdGUsIDEpLmZpcnN0RGF0ZTtcbiAgICBsZXQgY3VycmVudERheSA9IGZpcnN0RGF0ZTtcbiAgICBsZXQgY3VycmVudFdlZWs6IE1vZGVscy5DZWxsRGF0YVtdID0gW107XG4gICAgd2Vla3MucHVzaChjdXJyZW50V2Vlayk7XG5cbiAgICBsZXQgc3RhcnRXZWVrZGF5ID0gY3VycmVudERheS5nZXREYXkoKTtcbiAgICBpZiAoc3RhcnRXZWVrZGF5ID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydFdlZWtkYXk7IGkrKykge1xuICAgICAgICBjdXJyZW50V2Vlay5wdXNoKHt9IGFzIE1vZGVscy5DZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChjdXJyZW50RGF5IDwgbmV4dE1vbnRoKSB7XG4gICAgICBpZiAoY3VycmVudFdlZWsubGVuZ3RoID09PSA3KSB7XG4gICAgICAgIGN1cnJlbnRXZWVrID0gW107XG4gICAgICAgIHdlZWtzLnB1c2goY3VycmVudFdlZWspO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF5T2ZNb250aCA9IGN1cnJlbnREYXkuZ2V0RGF0ZSgpO1xuICAgICAgY29uc3QgdGljayA9ICtjdXJyZW50RGF5O1xuICAgICAgY3VycmVudFdlZWsucHVzaCh7XG4gICAgICAgIHRpY2ssXG4gICAgICAgIGRheU9mTW9udGgsXG4gICAgICAgIHNlbGVjdGVkOiBNb2RlbHMuU2VsZWN0VHlwZS5Ob25lLFxuICAgICAgICBpc0ZpcnN0T2ZNb250aDogZGF5T2ZNb250aCA9PT0gMSxcbiAgICAgICAgaXNMYXN0T2ZNb250aDogZmFsc2UsXG4gICAgICAgIG91dE9mRGF0ZTogdGljayA8IG1pbkRhdGVUaW1lIHx8IHRpY2sgPiBtYXhEYXRlVGltZVxuICAgICAgfSk7XG4gICAgICBjdXJyZW50RGF5ID0gbmV3IERhdGUoY3VycmVudERheS5nZXRUaW1lKCkgKyAzNjAwICogMjQgKiAxMDAwKTtcbiAgICB9XG4gICAgY3VycmVudFdlZWtbY3VycmVudFdlZWsubGVuZ3RoIC0gMV0uaXNMYXN0T2ZNb250aCA9IHRydWU7XG4gICAgcmV0dXJuIHdlZWtzO1xuICB9O1xuXG4gIGdlbk1vbnRoRGF0YShkYXRlPzogRGF0ZSwgYWRkTW9udGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIGRhdGUgPSBhZGRNb250aCA+PSAwID8gdGhpcy5zdGF0ZS5tb250aHNbdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIC0gMV0uZmlyc3REYXRlIDogdGhpcy5zdGF0ZS5tb250aHNbMF0uZmlyc3REYXRlO1xuICAgIH1cbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgICBjb25zdCB7IGxvY2FsZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGZpcnN0RGF0ZSwgbGFzdERhdGUgfSA9IHRoaXMuZ2V0TW9udGhEYXRlKGRhdGUsIGFkZE1vbnRoKTtcbiAgICBjb25zdCB3ZWVrcyA9IHRoaXMuZ2VuV2Vla0RhdGEoZmlyc3REYXRlKTtcbiAgICBjb25zdCB0aXRsZSA9IGZvcm1hdERhdGUoZmlyc3REYXRlLCBsb2NhbGUgPyBsb2NhbGUubW9udGhUaXRsZSA6ICd5eXl5L01NJywgdGhpcy5wcm9wcy5sb2NhbGUpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB0aXRsZSxcbiAgICAgIGZpcnN0RGF0ZSxcbiAgICAgIGxhc3REYXRlLFxuICAgICAgd2Vla3NcbiAgICB9IGFzIE1vZGVscy5Nb250aERhdGE7XG4gICAgZGF0YS5jb21wb25lbnQgPSB0aGlzLmdlbk1vbnRoQ29tcG9uZW50KGRhdGEpO1xuICAgIGlmIChhZGRNb250aCA+PSAwKSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5wdXNoKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy51bnNoaWZ0KGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGluRGF0ZShkYXRlOiBudW1iZXIsIHRpY2s6IG51bWJlcikge1xuICAgIHJldHVybiBkYXRlIDw9IHRpY2sgJiYgdGljayA8IGRhdGUgKyAyNCAqIDM2MDAwMDA7XG4gIH1cblxuICBzZWxlY3REYXRlUmFuZ2UgPSAoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlPzogRGF0ZSwgY2xlYXIgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGF0ZUV4dHJhLCB0eXBlLCBvblNlbGVjdEhhc0Rpc2FibGVEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh0eXBlID09PSAnb25lJykge1xuICAgICAgZW5kRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdGltZTEgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShzdGFydERhdGUpLFxuICAgICAgdGltZTIgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShlbmREYXRlKTtcbiAgICBjb25zdCBzdGFydERhdGVUaWNrID0gIXRpbWUyIHx8IHRpbWUxIDwgdGltZTIgPyB0aW1lMSA6IHRpbWUyO1xuICAgIGNvbnN0IGVuZERhdGVUaWNrID0gdGltZTIgJiYgdGltZTEgPiB0aW1lMiA/IHRpbWUxIDogdGltZTI7XG5cbiAgICBjb25zdCBzdGFydE1vbnRoRGF0ZSA9IHRoaXMuZ2V0TW9udGhEYXRlKG5ldyBEYXRlKHN0YXJ0RGF0ZVRpY2spKS5maXJzdERhdGU7XG4gICAgY29uc3QgZW5kTW9udGhEYXRlID0gZW5kRGF0ZVRpY2sgPyBuZXcgRGF0ZShlbmREYXRlVGljaykgOiB0aGlzLmdldE1vbnRoRGF0ZShuZXcgRGF0ZShzdGFydERhdGVUaWNrKSkubGFzdERhdGU7XG5cbiAgICBsZXQgdW51c2VhYmxlOiBudW1iZXJbXSA9IFtdLFxuICAgICAgbmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUubW9udGhzXG4gICAgICAuZmlsdGVyKG0gPT4ge1xuICAgICAgICByZXR1cm4gbS5maXJzdERhdGUgPj0gc3RhcnRNb250aERhdGUgJiYgbS5maXJzdERhdGUgPD0gZW5kTW9udGhEYXRlO1xuICAgICAgfSlcbiAgICAgIC5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBtLndlZWtzLmZvckVhY2godyA9PlxuICAgICAgICAgIHdcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50aWNrICYmIHRoaXMuaW5EYXRlKHN0YXJ0RGF0ZVRpY2ssIGQudGljayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGljayAmJiBkLnRpY2sgPj0gc3RhcnREYXRlVGljayAmJiBkLnRpY2sgPD0gZW5kRGF0ZVRpY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkLnNlbGVjdGVkO1xuICAgICAgICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuTm9uZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gKGdldERhdGVFeHRyYSAmJiBnZXREYXRlRXh0cmEobmV3IERhdGUoZC50aWNrKSkpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmIChkLm91dE9mRGF0ZSB8fCBpbmZvLmRpc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgIHVudXNlYWJsZS5wdXNoKGQudGljayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluRGF0ZShzdGFydERhdGVUaWNrLCBkLnRpY2spKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IE1vZGVscy5TZWxlY3RUeXBlLlNpbmdsZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuZERhdGVUaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBNb2RlbHMuU2VsZWN0VHlwZS5Pbmx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGVUaWNrICE9PSBlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuU3RhcnQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gTW9kZWxzLlNlbGVjdFR5cGUuQWxsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbkRhdGUoZW5kRGF0ZVRpY2ssIGQudGljaykpIHtcbiAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBNb2RlbHMuU2VsZWN0VHlwZS5FbmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBNb2RlbHMuU2VsZWN0VHlwZS5NaWRkbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5lZWRVcGRhdGUgPSBuZWVkVXBkYXRlIHx8IGQuc2VsZWN0ZWQgIT09IG9sZFZhbHVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5lZWRVcGRhdGUgJiYgbS5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBtLmNvbXBvbmVudFJlZi51cGRhdGVXZWVrcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAodW51c2VhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChvblNlbGVjdEhhc0Rpc2FibGVEYXRlKSB7XG4gICAgICAgIG9uU2VsZWN0SGFzRGlzYWJsZURhdGUodW51c2VhYmxlLm1hcCh0aWNrID0+IG5ldyBEYXRlKHRpY2spKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VudXNhYmxlIGRhdGUuIFlvdSBjYW4gaGFuZGxlIGJ5IG9uU2VsZWN0SGFzRGlzYWJsZURhdGUuJywgdW51c2VhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29tcHV0ZVZpc2libGUgPSAoY2xpZW50SGVpZ2h0OiBudW1iZXIsIHNjcm9sbFRvcDogbnVtYmVyKSA9PiB7XG4gICAgbGV0IG5lZWRVcGRhdGUgPSBmYWxzZTtcbiAgICBjb25zdCBNQVhfVklFV19QT1JUID0gY2xpZW50SGVpZ2h0ICogMjtcbiAgICBjb25zdCBNSU5fVklFV19QT1JUID0gY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8g5aSn57yT5Yay5Yy65aSW6L+H5ruk6KeE5YiZXG4gICAgY29uc3QgZmlsdGVyRnVuYyA9ICh2bTogTW9kZWxzLk1vbnRoRGF0YSkgPT5cbiAgICAgIHZtLnkgJiZcbiAgICAgIHZtLmhlaWdodCAmJlxuICAgICAgKHZtLnkgKyB2bS5oZWlnaHQgPiBzY3JvbGxUb3AgLSBNQVhfVklFV19QT1JUICYmIHZtLnkgPCBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgKyBNQVhfVklFV19QT1JUKTtcblxuICAgIGlmICh0aGlzLnByb3BzLmluZmluaXRlT3B0ICYmIHRoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCA+IDEyKSB7XG4gICAgICB0aGlzLnZpc2libGVNb250aCA9IHRoaXMudmlzaWJsZU1vbnRoLmZpbHRlcihmaWx0ZXJGdW5jKS5zb3J0KChhLCBiKSA9PiArYS5maXJzdERhdGUgLSArYi5maXJzdERhdGUpO1xuICAgIH1cblxuICAgIC8vIOW9k+Wwj+e8k+WGsuWMuuS4jea7oeaXtuWhq+WFhVxuICAgIGlmICh0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy52aXNpYmxlTW9udGhbdGhpcy52aXNpYmxlTW9udGgubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdC55ICE9PSB1bmRlZmluZWQgJiYgbGFzdC5oZWlnaHQgJiYgbGFzdC55ICsgbGFzdC5oZWlnaHQgPCBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgKyBNSU5fVklFV19QT1JUKSB7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuc3RhdGUubW9udGhzLmluZGV4T2YobGFzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDI7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGFzdEluZGV4ICsgaTtcbiAgICAgICAgICBpZiAoaW5kZXggPCB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggJiYgdGhpcy52aXNpYmxlTW9udGguaW5kZXhPZih0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pIDwgMCkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlTW9udGgucHVzaCh0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbkxvYWROZXh0KCkgJiYgdGhpcy5nZW5Nb250aERhdGEodW5kZWZpbmVkLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy52aXNpYmxlTW9udGhbMF07XG4gICAgICBpZiAoZmlyc3QueSAhPT0gdW5kZWZpbmVkICYmIGZpcnN0LmhlaWdodCAmJiBmaXJzdC55ID4gc2Nyb2xsVG9wIC0gTUlOX1ZJRVdfUE9SVCkge1xuICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gdGhpcy5zdGF0ZS5tb250aHMuaW5kZXhPZihmaXJzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDI7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlyc3RJbmRleCAtIGk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgdGhpcy52aXNpYmxlTW9udGguaW5kZXhPZih0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pIDwgMCkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlTW9udGgudW5zaGlmdCh0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pO1xuICAgICAgICAgICAgbmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnZpc2libGVNb250aCA9IHRoaXMuc3RhdGUubW9udGhzLmZpbHRlcihmaWx0ZXJGdW5jKTtcbiAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBuZWVkVXBkYXRlO1xuICB9O1xuXG4gIGNyZWF0ZU9uU2Nyb2xsID0gKCkgPT4ge1xuICAgIC8vIGxldCB0aW1lcjogYW55O1xuICAgIGxldCBjbGllbnRIZWlnaHQgPSAwLFxuICAgICAgc2Nyb2xsVG9wID0gMDtcblxuICAgIHJldHVybiAoZGF0YTogeyBmdWxsOiBudW1iZXI7IGNsaWVudDogbnVtYmVyOyB0b3A6IG51bWJlciB9KSA9PiB7XG4gICAgICBjb25zdCB7IGNsaWVudCwgdG9wIH0gPSBkYXRhO1xuICAgICAgY2xpZW50SGVpZ2h0ID0gY2xpZW50O1xuICAgICAgc2Nyb2xsVG9wID0gdG9wO1xuXG4gICAgICB0aGlzLmNvbXB1dGVWaXNpYmxlKGNsaWVudEhlaWdodCwgc2Nyb2xsVG9wKTtcblxuICAgICAgLy8g5Lul5LiK5pa55rOV55uu5YmN5peg6Zeu6aKY77yM5aaC5p6c5ZCO57ut5pyJ5oCn6IO96Zeu6aKY77yM5pS555So5aaC5LiL5pa55rOV77yM5L2G5Lul5LiL5pa55rOV5Lya5a+86Ie05Yi35paw56iN5b6u5bu26L+f546w6LGhXG5cbiAgICAgIC8vIGlmICh0aW1lcikge1xuICAgICAgLy8gICByZXR1cm47XG4gICAgICAvLyB9XG4gICAgICAvL1xuICAgICAgLy8gdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAvL1xuICAgICAgLy8gICBpZiAodGhpcy5jb21wdXRlVmlzaWJsZShjbGllbnRIZWlnaHQsIHNjcm9sbFRvcCkpIHtcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZygndXBkYXRlIGRvbScpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9LCA1MCk7XG4gICAgfTtcbiAgfTtcblxuICBiYXNlT25DZWxsQ2xpY2sgPSAoZGF5OiBNb2RlbHMuQ2VsbERhdGEpID0+IHtcbiAgICBpZiAoIWRheS50aWNrKSByZXR1cm47XG4gICAgdGhpcy5wcm9wcy5vbkNlbGxDbGljayAmJiB0aGlzLnByb3BzLm9uQ2VsbENsaWNrKG5ldyBEYXRlKGRheS50aWNrKSk7XG4gIH07XG5cbn1cbiJdfQ==